diff --git a/include/geom.h b/include/geom.h index d47ef1ed..2e8f9466 100644 --- a/include/geom.h +++ b/include/geom.h @@ -10,7 +10,7 @@ using uint = unsigned int; #include // boost::geometry -#define BOOST_GEOMETRY_INCLUDE_SELF_TURNS +#define BOOST_GEOMETRY_NO_ROBUSTNESS #include #include #include diff --git a/resources/config-coastline.json b/resources/config-coastline.json index 6c90e2eb..fbcc5e5f 100644 --- a/resources/config-coastline.json +++ b/resources/config-coastline.json @@ -1,11 +1,11 @@ { "layers": { "water": { "minzoom": 6, "maxzoom": 14, "simplify_below": 12, "simplify_length": 1, "simplify_ratio": 2}, - "ocean": { "minzoom": 0, "maxzoom": 14, "source": "coastline/water_polygons.shp", "simplify_below": 13, "simplify_level": 0.0001, "simplify_ratio": 2, "write_to": "water", "index": true, "source_columns": true } + "ocean": { "minzoom": 0, "maxzoom": 14, "source": "coastline/water_polygons.shp", "simplify_below": 13, "simplify_level": 0.0001, "simplify_ratio": 2, "filter_below": 12, "filter_area": 0.5, "write_to": "water", "index": true, "source_columns": true } }, "settings": { "minzoom": 0, - "maxzoom": 6, + "maxzoom": 14, "basezoom": 14, "include_ids": false, "combine_below": 14, diff --git a/resources/config-openmaptiles.json b/resources/config-openmaptiles.json index 3cb1a3be..99aa4d77 100644 --- a/resources/config-openmaptiles.json +++ b/resources/config-openmaptiles.json @@ -19,7 +19,7 @@ "building": { "minzoom": 13, "maxzoom": 14 }, "water": { "minzoom": 6, "maxzoom": 14, "simplify_below": 12, "simplify_level": 0.0003, "simplify_ratio": 2}, - "ocean": { "minzoom": 0, "maxzoom": 14, "source": "coastline/water_polygons.shp", "simplify_below": 13, "simplify_level": 0.0001, "simplify_ratio": 2, "write_to": "water", "index": true }, + "ocean": { "minzoom": 0, "maxzoom": 14, "source": "coastline/water_polygons.shp", "filter_below": 12, "filter_area": 0.5, "simplify_below": 13, "simplify_level": 0.0001, "simplify_ratio": 2, "write_to": "water" }, "water_name": { "minzoom": 14, "maxzoom": 14 }, "water_name_detail": { "minzoom": 14, "maxzoom": 14, "write_to": "water_name" }, diff --git a/resources/process_coastline.lua b/resources/process-coastline.lua similarity index 100% rename from resources/process_coastline.lua rename to resources/process-coastline.lua diff --git a/resources/process-openmaptiles.lua b/resources/process-openmaptiles.lua index cbf8fadb..c7f74745 100644 --- a/resources/process-openmaptiles.lua +++ b/resources/process-openmaptiles.lua @@ -571,11 +571,10 @@ function way_function(way) end -- Set 'water' - if natural=="water" or natural=="bay" or leisure=="swimming_pool" or landuse=="reservoir" or landuse=="basin" or waterClasses[waterway] then + if natural=="water" or leisure=="swimming_pool" or landuse=="reservoir" or landuse=="basin" or waterClasses[waterway] then if way:Find("covered")=="yes" or not isClosed then return end - local class="lake"; if natural=="bay" then class="ocean" elseif waterway~="" then class="river" end + local class="lake"; if waterway~="" then class="river" end if class=="lake" and way:Find("wikidata")=="Q192770" then return end - if class=="ocean" and isClosed and (way:AreaIntersecting("ocean")/way:Area() > 0.98) then return end way:Layer("water",true) SetMinZoomByArea(way) way:Attribute("class",class) diff --git a/src/geom.cpp b/src/geom.cpp index 059aca2b..8c4e1aaa 100644 --- a/src/geom.cpp +++ b/src/geom.cpp @@ -127,7 +127,7 @@ MultiPolygon simplify(MultiPolygon const &mp, double max_distance) for(auto const &p: mp) { Polygon new_p = simplify(p, max_distance); if(!new_p.outer().empty()) { - if (new_p.outer().size()>15) geom::correct(new_p); + geom::correct(new_p); simplify_combine(result_mp, std::move(new_p)); } } diff --git a/src/tile_worker.cpp b/src/tile_worker.cpp index df939f6b..7b762f68 100644 --- a/src/tile_worker.cpp +++ b/src/tile_worker.cpp @@ -134,7 +134,14 @@ void CheckNextObjectAndMerge( } } -void RemoveInnersBelowSize(MultiPolygon &g, double filterArea) { +void RemovePartsBelowSize(MultiPolygon &g, double filterArea) { + g.erase(std::remove_if( + g.begin(), + g.end(), + [&](const Polygon &poly) -> bool { + return std::fabs(geom::area(poly)) < filterArea; + }), + g.end()); for (auto &outer : g) { outer.inners().erase(std::remove_if( outer.inners().begin(), @@ -188,8 +195,8 @@ void ProcessObjects( } if (oo.oo.geomType == POLYGON_ && filterArea > 0.0) { - if (geom::area(g)(g), filterArea); + RemovePartsBelowSize(boost::get(g), filterArea); + if (geom::is_empty(g)) continue; } //This may increment the jt iterator