| 40 | } |
| 41 | |
| 42 | [[nodiscard]] inline PolygonizationResult polygonize(const GeometryGraphShim& graph) noexcept |
| 43 | { |
| 44 | const auto owned_edges = graph.inner().get_edges(); |
| 45 | std::vector<const geos::geom::Geometry*> non_owned_edges; |
| 46 | non_owned_edges.reserve(owned_edges.size()); |
| 47 | std::transform( |
| 48 | owned_edges.cbegin(), |
| 49 | owned_edges.cend(), |
| 50 | std::back_inserter(non_owned_edges), |
| 51 | [](const std::unique_ptr<geos::geom::LineString>& edge) -> const geos::geom::Geometry* { |
| 52 | return edge.get(); |
| 53 | }); |
| 54 | |
| 55 | auto polygonizer = geos::operation::polygonize::Polygonizer(); |
| 56 | // Adding the edges doesn't actually polygonize. That's deferred to the first time the polygons |
| 57 | // or dangles are accessed. |
| 58 | polygonizer.add(&non_owned_edges); |
| 59 | |
| 60 | const auto polys = polygonizer.getPolygons(); |
| 61 | // The dangles are just pointers back to the LineString pointers we passed in? |
| 62 | const auto dangles = polygonizer.getDangles(); |
| 63 | |
| 64 | PolygonizationResult retval; |
| 65 | retval.polygons.reserve(polys.size()); |
| 66 | retval.dangles.reserve(dangles.size()); |
| 67 | |
| 68 | for (const auto& poly : polys) |
| 69 | { |
| 70 | LineStringShim result; |
| 71 | const auto* shell = poly->getExteriorRing(); |
| 72 | result.vec.reserve(shell->getNumPoints()); |
| 73 | const auto* coords = shell->getCoordinatesRO(); |
| 74 | for (size_t i = 0; i < coords->size(); i++) |
| 75 | { |
| 76 | const auto coord = coords->getAt(i); |
| 77 | result.vec.push_back(CoordShim{coord.x, coord.y}); |
| 78 | } |
| 79 | retval.polygons.push_back(result); |
| 80 | } |
| 81 | |
| 82 | for (const auto* dangle : dangles) |
| 83 | { |
| 84 | LineStringShim result; |
| 85 | const auto* coords = dangle->getCoordinatesRO(); |
| 86 | result.vec.reserve(coords->size()); |
| 87 | for (size_t i = 0; i < coords->size(); i++) |
| 88 | { |
| 89 | const auto coord = coords->getAt(i); |
| 90 | result.vec.push_back(CoordShim{coord.x, coord.y}); |
| 91 | } |
| 92 | retval.dangles.push_back(result); |
| 93 | } |
| 94 | |
| 95 | return retval; |
| 96 | } |