88 */
99
1010#include " canvas.hpp"
11+
1112#include " raster.hpp"
1213
13- cimg_library::CImg<int > canvas_t::create_pointlist (geom::point_list_t const &pl,
14- tile_t const &tile) const
14+ #include < opencv2/imgcodecs.hpp>
15+ #include < opencv2/imgproc.hpp>
16+
17+ void canvas_t::open_close (unsigned int buffer_size)
1518{
16- cimg_library::CImg<int > points{static_cast <unsigned int >(pl.size ()), 2 };
19+ auto const kernel1 = cv::getStructuringElement (
20+ cv::MORPH_RECT,
21+ cv::Size (static_cast <int >(buffer_size), static_cast <int >(buffer_size)));
22+ auto const kernel2 = cv::getStructuringElement (
23+ cv::MORPH_RECT, cv::Size (static_cast <int >(buffer_size * 2 ),
24+ static_cast <int >(buffer_size * 2 )));
25+
26+ cv::erode (m_rast, m_rast, kernel1);
27+ cv::dilate (m_rast, m_rast, kernel2);
28+ cv::erode (m_rast, m_rast, kernel1);
29+ }
30+
31+ void canvas_t::create_pointlist (std::vector<cv::Point> *out,
32+ geom::point_list_t const &pl,
33+ tile_t const &tile) const
34+ {
35+ out->reserve (pl.size ());
1736
18- int n = 0 ;
1937 for (auto const point : pl) {
2038 auto const tp = tile.to_tile_coords (point, m_extent);
21- points (n, 0 ) = static_cast <int >(static_cast <double >(m_buffer) + tp.x ());
22- points (n, 1 ) =
23- static_cast <int >(static_cast <double >(m_buffer + m_extent) - tp.y ());
24- ++n;
39+ auto const x = static_cast <double >(m_buffer) + tp.x ();
40+ auto const y = static_cast <double >(m_buffer + m_extent) - tp.y ();
41+ out->emplace_back (x, y);
2542 }
26-
27- return points;
2843}
2944
3045std::size_t canvas_t::draw_polygon (geom::polygon_t const &polygon,
3146 tile_t const &tile)
3247{
33- if (polygon.inners ().empty ()) {
34- m_rast.draw_polygon (create_pointlist (polygon.outer (), tile), &White);
35- return polygon.outer ().size ();
36- }
37-
3848 std::size_t num_points = polygon.outer ().size ();
39- m_temp.draw_polygon (create_pointlist (polygon.outer (), tile), &White);
49+
50+ std::vector<std::vector<cv::Point>> poly_data;
51+ poly_data.resize (polygon.inners ().size () + 1 );
52+
53+ create_pointlist (poly_data.data (), polygon.outer (), tile);
54+ std::size_t n = 1 ;
4055 for (auto const &inner : polygon.inners ()) {
4156 num_points += inner.size ();
42- m_temp.draw_polygon (create_pointlist (inner, tile), &Black);
57+ create_pointlist (&poly_data[n], inner, tile);
58+ n++;
4359 }
44- m_rast |= m_temp ;
60+ cv::fillPoly ( m_rast, poly_data, cv::Scalar{ 255 }) ;
4561
4662 return num_points;
4763}
4864
4965std::size_t canvas_t::draw_linestring (geom::linestring_t const &linestring,
5066 tile_t const &tile)
5167{
52- m_rast.draw_line (create_pointlist (linestring, tile), &White);
68+ std::vector<cv::Point> line_data;
69+ create_pointlist (&line_data, linestring, tile);
70+ cv::polylines (m_rast, line_data, false , cv::Scalar{255 });
5371 return linestring.size ();
5472}
5573
@@ -81,13 +99,13 @@ std::size_t canvas_t::draw(geom::geometry_t const &geometry, tile_t const &tile)
8199
82100void canvas_t::save (std::string const &filename) const
83101{
84- m_rast. save (filename. c_str () );
102+ cv::imwrite (filename, m_rast );
85103}
86104
87105std::string canvas_t::to_wkb (tile_t const &tile, double margin) const
88106{
89107 std::string wkb;
90- wkb.reserve (61 + 2 + m_rast. size ());
108+ wkb.reserve (61 + 2 + size () * size ());
91109
92110 // header
93111 wkb_raster_header header{};
@@ -106,18 +124,24 @@ std::string canvas_t::to_wkb(tile_t const &tile, double margin) const
106124 add_raster_band (&wkb, band);
107125
108126 // rasterdata
109- wkb.append (reinterpret_cast <char const *>(m_rast.data ()), m_rast.size ());
127+ wkb.append (reinterpret_cast <char const *>(begin ()),
128+ reinterpret_cast <char const *>(end ()));
110129
111- assert (wkb.size () == 61 + 2 + m_rast. size ());
130+ assert (wkb.size () == 61 + 2 + size () * size ());
112131
113132 return wkb;
114133}
115134
116- void canvas_t::merge (canvas_t const &other) { m_rast |= other.m_rast ; }
135+ void canvas_t::merge (canvas_t const &other)
136+ {
137+ cv::bitwise_or (m_rast, other.m_rast , m_rast);
138+ }
117139
118140std::string to_hex (std::string const &in)
119141{
120142 std::string result;
143+ result.reserve (in.size () * 2 );
144+
121145 char const *const lookup_hex = " 0123456789ABCDEF" ;
122146
123147 for (const auto c : in) {
0 commit comments