@sentryware/s2-node 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.circleci/config.yml +45 -0
- package/.dockerignore +1 -0
- package/.gitmodules +3 -0
- package/CHANGELOG.md +33 -0
- package/LICENSE +201 -0
- package/README.md +147 -0
- package/binding.gyp +170 -0
- package/docker/Dockerfile.node20.test +8 -0
- package/docker/Dockerfile.node22.test +8 -0
- package/docker/Dockerfile.node24.test +8 -0
- package/index.d.ts +117 -0
- package/index.js +6 -0
- package/jest.config.js +184 -0
- package/package.json +43 -0
- package/publish-linux.sh +18 -0
- package/publish-osx.sh +19 -0
- package/src/builder.cc +84 -0
- package/src/builder.h +29 -0
- package/src/cell.cc +71 -0
- package/src/cell.h +26 -0
- package/src/cell_id.cc +210 -0
- package/src/cell_id.h +44 -0
- package/src/cell_union.cc +237 -0
- package/src/cell_union.h +34 -0
- package/src/earth.cc +185 -0
- package/src/earth.h +33 -0
- package/src/latlng.cc +132 -0
- package/src/latlng.h +28 -0
- package/src/loop.cc +51 -0
- package/src/loop.h +21 -0
- package/src/point.cc +69 -0
- package/src/point.h +23 -0
- package/src/polygon.cc +36 -0
- package/src/polygon.h +20 -0
- package/src/polyline.cc +186 -0
- package/src/polyline.h +34 -0
- package/src/region_coverer.cc +450 -0
- package/src/region_coverer.h +56 -0
- package/src/s2.cc +27 -0
- package/test/Cell.test.js +37 -0
- package/test/CellId.test.js +135 -0
- package/test/CellUnion.test.js +150 -0
- package/test/Earth.test.js +62 -0
- package/test/LatLng.test.js +45 -0
- package/test/Point.test.js +14 -0
- package/test/Polyline.test.js +78 -0
- package/test/RegionCoverer.test.js +301 -0
- package/test.sh +16 -0
- package/third_party/s2geometry/.travis.yml +163 -0
- package/third_party/s2geometry/AUTHORS +13 -0
- package/third_party/s2geometry/CONTRIBUTING.md +65 -0
- package/third_party/s2geometry/CONTRIBUTORS +30 -0
- package/third_party/s2geometry/LICENSE +202 -0
- package/third_party/s2geometry/NOTICE +5 -0
- package/third_party/s2geometry/README.md +127 -0
- package/third_party/s2geometry/doc/examples/point_index.cc +44 -0
- package/third_party/s2geometry/doc/examples/term_index.cc +99 -0
- package/third_party/s2geometry/doc/examples/term_index.py +101 -0
- package/third_party/s2geometry/src/python/coder.i +125 -0
- package/third_party/s2geometry/src/python/pywraps2_test.py +786 -0
- package/third_party/s2geometry/src/python/s2.i +37 -0
- package/third_party/s2geometry/src/python/s2_common.i +756 -0
- package/third_party/s2geometry/src/s2/_fp_contract_off.h +60 -0
- package/third_party/s2geometry/src/s2/base/casts.h +318 -0
- package/third_party/s2geometry/src/s2/base/commandlineflags.h +67 -0
- package/third_party/s2geometry/src/s2/base/integral_types.h +31 -0
- package/third_party/s2geometry/src/s2/base/log_severity.h +40 -0
- package/third_party/s2geometry/src/s2/base/logging.h +173 -0
- package/third_party/s2geometry/src/s2/base/mutex.h +61 -0
- package/third_party/s2geometry/src/s2/base/port.h +999 -0
- package/third_party/s2geometry/src/s2/base/spinlock.h +60 -0
- package/third_party/s2geometry/src/s2/base/stringprintf.cc +107 -0
- package/third_party/s2geometry/src/s2/base/stringprintf.h +53 -0
- package/third_party/s2geometry/src/s2/base/strtoint.cc +65 -0
- package/third_party/s2geometry/src/s2/base/strtoint.h +106 -0
- package/third_party/s2geometry/src/s2/base/timer.h +50 -0
- package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector.cc +164 -0
- package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector.h +110 -0
- package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector_test.cc +232 -0
- package/third_party/s2geometry/src/s2/encoded_s2point_vector.cc +838 -0
- package/third_party/s2geometry/src/s2/encoded_s2point_vector.h +140 -0
- package/third_party/s2geometry/src/s2/encoded_s2point_vector_test.cc +344 -0
- package/third_party/s2geometry/src/s2/encoded_s2shape_index.cc +181 -0
- package/third_party/s2geometry/src/s2/encoded_s2shape_index.h +276 -0
- package/third_party/s2geometry/src/s2/encoded_s2shape_index_test.cc +244 -0
- package/third_party/s2geometry/src/s2/encoded_string_vector.cc +66 -0
- package/third_party/s2geometry/src/s2/encoded_string_vector.h +164 -0
- package/third_party/s2geometry/src/s2/encoded_string_vector_test.cc +69 -0
- package/third_party/s2geometry/src/s2/encoded_uint_vector.h +299 -0
- package/third_party/s2geometry/src/s2/encoded_uint_vector_test.cc +124 -0
- package/third_party/s2geometry/src/s2/id_set_lexicon.cc +81 -0
- package/third_party/s2geometry/src/s2/id_set_lexicon.h +199 -0
- package/third_party/s2geometry/src/s2/id_set_lexicon_test.cc +70 -0
- package/third_party/s2geometry/src/s2/mutable_s2shape_index.cc +1585 -0
- package/third_party/s2geometry/src/s2/mutable_s2shape_index.h +600 -0
- package/third_party/s2geometry/src/s2/mutable_s2shape_index_test.cc +589 -0
- package/third_party/s2geometry/src/s2/r1interval.h +220 -0
- package/third_party/s2geometry/src/s2/r1interval_test.cc +185 -0
- package/third_party/s2geometry/src/s2/r2.h +26 -0
- package/third_party/s2geometry/src/s2/r2rect.cc +93 -0
- package/third_party/s2geometry/src/s2/r2rect.h +234 -0
- package/third_party/s2geometry/src/s2/r2rect_test.cc +228 -0
- package/third_party/s2geometry/src/s2/s1angle.cc +54 -0
- package/third_party/s2geometry/src/s2/s1angle.h +336 -0
- package/third_party/s2geometry/src/s2/s1angle_test.cc +185 -0
- package/third_party/s2geometry/src/s2/s1chord_angle.cc +159 -0
- package/third_party/s2geometry/src/s2/s1chord_angle.h +369 -0
- package/third_party/s2geometry/src/s2/s1chord_angle_test.cc +207 -0
- package/third_party/s2geometry/src/s2/s1interval.cc +296 -0
- package/third_party/s2geometry/src/s2/s1interval.h +266 -0
- package/third_party/s2geometry/src/s2/s1interval_test.cc +469 -0
- package/third_party/s2geometry/src/s2/s2boolean_operation.cc +2391 -0
- package/third_party/s2geometry/src/s2/s2boolean_operation.h +501 -0
- package/third_party/s2geometry/src/s2/s2boolean_operation_test.cc +1400 -0
- package/third_party/s2geometry/src/s2/s2builder.cc +1828 -0
- package/third_party/s2geometry/src/s2/s2builder.h +1057 -0
- package/third_party/s2geometry/src/s2/s2builder_graph.cc +1084 -0
- package/third_party/s2geometry/src/s2/s2builder_graph.h +799 -0
- package/third_party/s2geometry/src/s2/s2builder_graph_test.cc +462 -0
- package/third_party/s2geometry/src/s2/s2builder_layer.h +50 -0
- package/third_party/s2geometry/src/s2/s2builder_test.cc +1329 -0
- package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer.cc +313 -0
- package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer.h +221 -0
- package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer_test.cc +261 -0
- package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies.cc +392 -0
- package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies.h +86 -0
- package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies_test.cc +182 -0
- package/third_party/s2geometry/src/s2/s2builderutil_graph_shape.h +57 -0
- package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer.cc +212 -0
- package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer.h +218 -0
- package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer_test.cc +367 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer.cc +74 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer.h +122 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer_test.cc +167 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer.cc +191 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer.h +211 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer_test.cc +312 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer.cc +105 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer.h +174 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer_test.cc +220 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer.cc +98 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer.h +292 -0
- package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer_test.cc +233 -0
- package/third_party/s2geometry/src/s2/s2builderutil_snap_functions.cc +354 -0
- package/third_party/s2geometry/src/s2/s2builderutil_snap_functions.h +239 -0
- package/third_party/s2geometry/src/s2/s2builderutil_snap_functions_test.cc +716 -0
- package/third_party/s2geometry/src/s2/s2builderutil_testing.cc +37 -0
- package/third_party/s2geometry/src/s2/s2builderutil_testing.h +100 -0
- package/third_party/s2geometry/src/s2/s2builderutil_testing_test.cc +85 -0
- package/third_party/s2geometry/src/s2/s2cap.cc +347 -0
- package/third_party/s2geometry/src/s2/s2cap.h +286 -0
- package/third_party/s2geometry/src/s2/s2cap_test.cc +379 -0
- package/third_party/s2geometry/src/s2/s2cell.cc +552 -0
- package/third_party/s2geometry/src/s2/s2cell.h +249 -0
- package/third_party/s2geometry/src/s2/s2cell_id.cc +619 -0
- package/third_party/s2geometry/src/s2/s2cell_id.h +705 -0
- package/third_party/s2geometry/src/s2/s2cell_id_test.cc +633 -0
- package/third_party/s2geometry/src/s2/s2cell_index.cc +149 -0
- package/third_party/s2geometry/src/s2/s2cell_index.h +660 -0
- package/third_party/s2geometry/src/s2/s2cell_index_test.cc +411 -0
- package/third_party/s2geometry/src/s2/s2cell_test.cc +687 -0
- package/third_party/s2geometry/src/s2/s2cell_union.cc +515 -0
- package/third_party/s2geometry/src/s2/s2cell_union.h +399 -0
- package/third_party/s2geometry/src/s2/s2cell_union_test.cc +598 -0
- package/third_party/s2geometry/src/s2/s2centroids.cc +84 -0
- package/third_party/s2geometry/src/s2/s2centroids.h +87 -0
- package/third_party/s2geometry/src/s2/s2centroids_test.cc +82 -0
- package/third_party/s2geometry/src/s2/s2closest_cell_query.cc +123 -0
- package/third_party/s2geometry/src/s2/s2closest_cell_query.h +385 -0
- package/third_party/s2geometry/src/s2/s2closest_cell_query_base.h +841 -0
- package/third_party/s2geometry/src/s2/s2closest_cell_query_base_test.cc +63 -0
- package/third_party/s2geometry/src/s2/s2closest_cell_query_test.cc +412 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query.cc +106 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query.h +421 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query_base.h +946 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query_base_test.cc +59 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query_test.cc +505 -0
- package/third_party/s2geometry/src/s2/s2closest_edge_query_testing.h +91 -0
- package/third_party/s2geometry/src/s2/s2closest_point_query.cc +66 -0
- package/third_party/s2geometry/src/s2/s2closest_point_query.h +465 -0
- package/third_party/s2geometry/src/s2/s2closest_point_query_base.h +767 -0
- package/third_party/s2geometry/src/s2/s2closest_point_query_base_test.cc +63 -0
- package/third_party/s2geometry/src/s2/s2closest_point_query_test.cc +312 -0
- package/third_party/s2geometry/src/s2/s2contains_point_query.h +328 -0
- package/third_party/s2geometry/src/s2/s2contains_point_query_test.cc +159 -0
- package/third_party/s2geometry/src/s2/s2contains_vertex_query.cc +39 -0
- package/third_party/s2geometry/src/s2/s2contains_vertex_query.h +66 -0
- package/third_party/s2geometry/src/s2/s2contains_vertex_query_test.cc +67 -0
- package/third_party/s2geometry/src/s2/s2convex_hull_query.cc +198 -0
- package/third_party/s2geometry/src/s2/s2convex_hull_query.h +110 -0
- package/third_party/s2geometry/src/s2/s2convex_hull_query_test.cc +208 -0
- package/third_party/s2geometry/src/s2/s2coords.cc +146 -0
- package/third_party/s2geometry/src/s2/s2coords.h +459 -0
- package/third_party/s2geometry/src/s2/s2coords_internal.h +71 -0
- package/third_party/s2geometry/src/s2/s2coords_test.cc +218 -0
- package/third_party/s2geometry/src/s2/s2crossing_edge_query.cc +380 -0
- package/third_party/s2geometry/src/s2/s2crossing_edge_query.h +220 -0
- package/third_party/s2geometry/src/s2/s2crossing_edge_query_test.cc +382 -0
- package/third_party/s2geometry/src/s2/s2debug.cc +23 -0
- package/third_party/s2geometry/src/s2/s2debug.h +69 -0
- package/third_party/s2geometry/src/s2/s2distance_target.h +165 -0
- package/third_party/s2geometry/src/s2/s2earth.cc +52 -0
- package/third_party/s2geometry/src/s2/s2earth.h +268 -0
- package/third_party/s2geometry/src/s2/s2earth_test.cc +146 -0
- package/third_party/s2geometry/src/s2/s2edge_clipping.cc +462 -0
- package/third_party/s2geometry/src/s2/s2edge_clipping.h +183 -0
- package/third_party/s2geometry/src/s2/s2edge_clipping_test.cc +335 -0
- package/third_party/s2geometry/src/s2/s2edge_crosser.cc +85 -0
- package/third_party/s2geometry/src/s2/s2edge_crosser.h +343 -0
- package/third_party/s2geometry/src/s2/s2edge_crosser_test.cc +264 -0
- package/third_party/s2geometry/src/s2/s2edge_crossings.cc +515 -0
- package/third_party/s2geometry/src/s2/s2edge_crossings.h +138 -0
- package/third_party/s2geometry/src/s2/s2edge_crossings_internal.h +59 -0
- package/third_party/s2geometry/src/s2/s2edge_crossings_test.cc +246 -0
- package/third_party/s2geometry/src/s2/s2edge_distances.cc +419 -0
- package/third_party/s2geometry/src/s2/s2edge_distances.h +192 -0
- package/third_party/s2geometry/src/s2/s2edge_distances_test.cc +539 -0
- package/third_party/s2geometry/src/s2/s2edge_tessellator.cc +276 -0
- package/third_party/s2geometry/src/s2/s2edge_tessellator.h +101 -0
- package/third_party/s2geometry/src/s2/s2edge_tessellator_test.cc +492 -0
- package/third_party/s2geometry/src/s2/s2edge_vector_shape.h +85 -0
- package/third_party/s2geometry/src/s2/s2edge_vector_shape_test.cc +66 -0
- package/third_party/s2geometry/src/s2/s2error.cc +29 -0
- package/third_party/s2geometry/src/s2/s2error.h +147 -0
- package/third_party/s2geometry/src/s2/s2error_test.cc +31 -0
- package/third_party/s2geometry/src/s2/s2furthest_edge_query.cc +117 -0
- package/third_party/s2geometry/src/s2/s2furthest_edge_query.h +439 -0
- package/third_party/s2geometry/src/s2/s2furthest_edge_query_test.cc +487 -0
- package/third_party/s2geometry/src/s2/s2latlng.cc +90 -0
- package/third_party/s2geometry/src/s2/s2latlng.h +234 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect.cc +727 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect.h +434 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect_bounder.cc +344 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect_bounder.h +89 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect_bounder_test.cc +306 -0
- package/third_party/s2geometry/src/s2/s2latlng_rect_test.cc +1030 -0
- package/third_party/s2geometry/src/s2/s2latlng_test.cc +165 -0
- package/third_party/s2geometry/src/s2/s2lax_loop_shape.cc +104 -0
- package/third_party/s2geometry/src/s2/s2lax_loop_shape.h +153 -0
- package/third_party/s2geometry/src/s2/s2lax_loop_shape_test.cc +101 -0
- package/third_party/s2geometry/src/s2/s2lax_polygon_shape.cc +348 -0
- package/third_party/s2geometry/src/s2/s2lax_polygon_shape.h +183 -0
- package/third_party/s2geometry/src/s2/s2lax_polygon_shape_test.cc +234 -0
- package/third_party/s2geometry/src/s2/s2lax_polyline_shape.cc +118 -0
- package/third_party/s2geometry/src/s2/s2lax_polyline_shape.h +124 -0
- package/third_party/s2geometry/src/s2/s2lax_polyline_shape_test.cc +62 -0
- package/third_party/s2geometry/src/s2/s2loop.cc +1509 -0
- package/third_party/s2geometry/src/s2/s2loop.h +711 -0
- package/third_party/s2geometry/src/s2/s2loop_measures.cc +313 -0
- package/third_party/s2geometry/src/s2/s2loop_measures.h +280 -0
- package/third_party/s2geometry/src/s2/s2loop_measures_test.cc +367 -0
- package/third_party/s2geometry/src/s2/s2loop_test.cc +1371 -0
- package/third_party/s2geometry/src/s2/s2max_distance_targets.cc +265 -0
- package/third_party/s2geometry/src/s2/s2max_distance_targets.h +241 -0
- package/third_party/s2geometry/src/s2/s2max_distance_targets_test.cc +367 -0
- package/third_party/s2geometry/src/s2/s2measures.cc +128 -0
- package/third_party/s2geometry/src/s2/s2measures.h +78 -0
- package/third_party/s2geometry/src/s2/s2measures_test.cc +135 -0
- package/third_party/s2geometry/src/s2/s2metrics.cc +122 -0
- package/third_party/s2geometry/src/s2/s2metrics.h +199 -0
- package/third_party/s2geometry/src/s2/s2metrics_test.cc +127 -0
- package/third_party/s2geometry/src/s2/s2min_distance_targets.cc +295 -0
- package/third_party/s2geometry/src/s2/s2min_distance_targets.h +273 -0
- package/third_party/s2geometry/src/s2/s2min_distance_targets_test.cc +239 -0
- package/third_party/s2geometry/src/s2/s2padded_cell.cc +162 -0
- package/third_party/s2geometry/src/s2/s2padded_cell.h +108 -0
- package/third_party/s2geometry/src/s2/s2padded_cell_test.cc +138 -0
- package/third_party/s2geometry/src/s2/s2point.h +38 -0
- package/third_party/s2geometry/src/s2/s2point_compression.cc +388 -0
- package/third_party/s2geometry/src/s2/s2point_compression.h +78 -0
- package/third_party/s2geometry/src/s2/s2point_compression_test.cc +305 -0
- package/third_party/s2geometry/src/s2/s2point_index.h +345 -0
- package/third_party/s2geometry/src/s2/s2point_index_test.cc +147 -0
- package/third_party/s2geometry/src/s2/s2point_region.cc +72 -0
- package/third_party/s2geometry/src/s2/s2point_region.h +76 -0
- package/third_party/s2geometry/src/s2/s2point_region_test.cc +100 -0
- package/third_party/s2geometry/src/s2/s2point_span.h +57 -0
- package/third_party/s2geometry/src/s2/s2point_test.cc +47 -0
- package/third_party/s2geometry/src/s2/s2point_vector_shape.h +127 -0
- package/third_party/s2geometry/src/s2/s2point_vector_shape_test.cc +59 -0
- package/third_party/s2geometry/src/s2/s2pointutil.cc +131 -0
- package/third_party/s2geometry/src/s2/s2pointutil.h +138 -0
- package/third_party/s2geometry/src/s2/s2pointutil_test.cc +157 -0
- package/third_party/s2geometry/src/s2/s2polygon.cc +1569 -0
- package/third_party/s2geometry/src/s2/s2polygon.h +934 -0
- package/third_party/s2geometry/src/s2/s2polygon_test.cc +3025 -0
- package/third_party/s2geometry/src/s2/s2polyline.cc +645 -0
- package/third_party/s2geometry/src/s2/s2polyline.h +379 -0
- package/third_party/s2geometry/src/s2/s2polyline_alignment.cc +414 -0
- package/third_party/s2geometry/src/s2/s2polyline_alignment.h +245 -0
- package/third_party/s2geometry/src/s2/s2polyline_alignment_internal.h +158 -0
- package/third_party/s2geometry/src/s2/s2polyline_alignment_test.cc +610 -0
- package/third_party/s2geometry/src/s2/s2polyline_measures.cc +42 -0
- package/third_party/s2geometry/src/s2/s2polyline_measures.h +53 -0
- package/third_party/s2geometry/src/s2/s2polyline_measures_test.cc +57 -0
- package/third_party/s2geometry/src/s2/s2polyline_simplifier.cc +187 -0
- package/third_party/s2geometry/src/s2/s2polyline_simplifier.h +109 -0
- package/third_party/s2geometry/src/s2/s2polyline_simplifier_test.cc +165 -0
- package/third_party/s2geometry/src/s2/s2polyline_test.cc +554 -0
- package/third_party/s2geometry/src/s2/s2predicates.cc +1486 -0
- package/third_party/s2geometry/src/s2/s2predicates.h +282 -0
- package/third_party/s2geometry/src/s2/s2predicates_internal.h +135 -0
- package/third_party/s2geometry/src/s2/s2predicates_test.cc +1427 -0
- package/third_party/s2geometry/src/s2/s2projections.cc +109 -0
- package/third_party/s2geometry/src/s2/s2projections.h +161 -0
- package/third_party/s2geometry/src/s2/s2projections_test.cc +78 -0
- package/third_party/s2geometry/src/s2/s2r2rect.cc +88 -0
- package/third_party/s2geometry/src/s2/s2r2rect.h +292 -0
- package/third_party/s2geometry/src/s2/s2r2rect_test.cc +312 -0
- package/third_party/s2geometry/src/s2/s2region.cc +26 -0
- package/third_party/s2geometry/src/s2/s2region.h +142 -0
- package/third_party/s2geometry/src/s2/s2region_coverer.cc +514 -0
- package/third_party/s2geometry/src/s2/s2region_coverer.h +356 -0
- package/third_party/s2geometry/src/s2/s2region_coverer_test.cc +509 -0
- package/third_party/s2geometry/src/s2/s2region_intersection.cc +84 -0
- package/third_party/s2geometry/src/s2/s2region_intersection.h +79 -0
- package/third_party/s2geometry/src/s2/s2region_term_indexer.cc +270 -0
- package/third_party/s2geometry/src/s2/s2region_term_indexer.h +299 -0
- package/third_party/s2geometry/src/s2/s2region_term_indexer_test.cc +209 -0
- package/third_party/s2geometry/src/s2/s2region_test.cc +370 -0
- package/third_party/s2geometry/src/s2/s2region_union.cc +90 -0
- package/third_party/s2geometry/src/s2/s2region_union.h +83 -0
- package/third_party/s2geometry/src/s2/s2region_union_test.cc +89 -0
- package/third_party/s2geometry/src/s2/s2shape.h +283 -0
- package/third_party/s2geometry/src/s2/s2shape_index.cc +321 -0
- package/third_party/s2geometry/src/s2/s2shape_index.h +781 -0
- package/third_party/s2geometry/src/s2/s2shape_index_buffered_region.cc +113 -0
- package/third_party/s2geometry/src/s2/s2shape_index_buffered_region.h +135 -0
- package/third_party/s2geometry/src/s2/s2shape_index_buffered_region_test.cc +162 -0
- package/third_party/s2geometry/src/s2/s2shape_index_measures.cc +92 -0
- package/third_party/s2geometry/src/s2/s2shape_index_measures.h +100 -0
- package/third_party/s2geometry/src/s2/s2shape_index_measures_test.cc +136 -0
- package/third_party/s2geometry/src/s2/s2shape_index_region.h +350 -0
- package/third_party/s2geometry/src/s2/s2shape_index_region_test.cc +161 -0
- package/third_party/s2geometry/src/s2/s2shape_index_test.cc +24 -0
- package/third_party/s2geometry/src/s2/s2shape_measures.cc +138 -0
- package/third_party/s2geometry/src/s2/s2shape_measures.h +95 -0
- package/third_party/s2geometry/src/s2/s2shape_measures_test.cc +139 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries.cc +120 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries.h +66 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries_test.cc +170 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_coding.cc +253 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_coding.h +283 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_coding_test.cc +54 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force.cc +40 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force.h +41 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force_test.cc +55 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_count_edges.h +57 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_count_edges_test.cc +43 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator.cc +45 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator.h +72 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator_test.cc +116 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point.cc +107 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point.h +48 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point_test.cc +104 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator.cc +58 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator.h +65 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator_test.cc +61 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_shape_edge.h +58 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_shape_edge_id.h +97 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_testing.cc +104 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_testing.h +36 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs.cc +440 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs.h +72 -0
- package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs_test.cc +184 -0
- package/third_party/s2geometry/src/s2/s2testing.cc +464 -0
- package/third_party/s2geometry/src/s2/s2testing.h +385 -0
- package/third_party/s2geometry/src/s2/s2testing_test.cc +166 -0
- package/third_party/s2geometry/src/s2/s2text_format.cc +506 -0
- package/third_party/s2geometry/src/s2/s2text_format.h +289 -0
- package/third_party/s2geometry/src/s2/s2text_format_test.cc +417 -0
- package/third_party/s2geometry/src/s2/s2wedge_relations.cc +80 -0
- package/third_party/s2geometry/src/s2/s2wedge_relations.h +64 -0
- package/third_party/s2geometry/src/s2/s2wedge_relations_test.cc +89 -0
- package/third_party/s2geometry/src/s2/sequence_lexicon.h +296 -0
- package/third_party/s2geometry/src/s2/sequence_lexicon_test.cc +113 -0
- package/third_party/s2geometry/src/s2/strings/ostringstream.cc +35 -0
- package/third_party/s2geometry/src/s2/strings/ostringstream.h +105 -0
- package/third_party/s2geometry/src/s2/strings/serialize.cc +46 -0
- package/third_party/s2geometry/src/s2/strings/serialize.h +40 -0
- package/third_party/s2geometry/src/s2/third_party/absl/algorithm/algorithm.h +187 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/attributes.h +666 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/casts.h +189 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/config.h +462 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/dynamic_annotations.cc +129 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/dynamic_annotations.h +394 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/atomic_hook.h +168 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/identity.h +33 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/inline_variable.h +117 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/invoke.h +188 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/raw_logging.cc +254 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/raw_logging.h +205 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/throw_delegate.cc +106 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/throw_delegate.h +71 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/internal/unaligned_access.h +322 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/log_severity.h +77 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/macros.h +236 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/optimization.h +177 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/policy_checks.h +124 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/port.h +97 -0
- package/third_party/s2geometry/src/s2/third_party/absl/base/thread_annotations.h +277 -0
- package/third_party/s2geometry/src/s2/third_party/absl/container/fixed_array.h +523 -0
- package/third_party/s2geometry/src/s2/third_party/absl/container/inlined_vector.h +1453 -0
- package/third_party/s2geometry/src/s2/third_party/absl/container/internal/compressed_tuple.h +191 -0
- package/third_party/s2geometry/src/s2/third_party/absl/container/internal/container_memory.h +424 -0
- package/third_party/s2geometry/src/s2/third_party/absl/container/internal/layout.h +739 -0
- package/third_party/s2geometry/src/s2/third_party/absl/memory/memory.h +755 -0
- package/third_party/s2geometry/src/s2/third_party/absl/meta/type_traits.h +436 -0
- package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128.cc +232 -0
- package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128.h +656 -0
- package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128_have_intrinsic.inc +3 -0
- package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128_no_intrinsic.inc +3 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii.cc +198 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii.h +239 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii_ctype.h +66 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/bits.h +53 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/memutil.cc +110 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/memutil.h +146 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/resize_uninitialized.h +72 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/match.cc +38 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/match.h +89 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/numbers.cc +909 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/numbers.h +187 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/str_cat.cc +240 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/str_cat.h +398 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/str_join.h +22 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/str_split.cc +47 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/str_split.h +43 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/string_view.cc +245 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/string_view.h +602 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/strip.cc +42 -0
- package/third_party/s2geometry/src/s2/third_party/absl/strings/strip.h +130 -0
- package/third_party/s2geometry/src/s2/third_party/absl/types/span.h +793 -0
- package/third_party/s2geometry/src/s2/third_party/absl/utility/utility.h +299 -0
- package/third_party/s2geometry/src/s2/util/bits/bit-interleave.cc +274 -0
- package/third_party/s2geometry/src/s2/util/bits/bit-interleave.h +53 -0
- package/third_party/s2geometry/src/s2/util/bits/bits.cc +155 -0
- package/third_party/s2geometry/src/s2/util/bits/bits.h +745 -0
- package/third_party/s2geometry/src/s2/util/coding/coder.cc +83 -0
- package/third_party/s2geometry/src/s2/util/coding/coder.h +553 -0
- package/third_party/s2geometry/src/s2/util/coding/nth-derivative.h +134 -0
- package/third_party/s2geometry/src/s2/util/coding/transforms.h +62 -0
- package/third_party/s2geometry/src/s2/util/coding/varint.cc +289 -0
- package/third_party/s2geometry/src/s2/util/coding/varint.h +476 -0
- package/third_party/s2geometry/src/s2/util/endian/endian.h +859 -0
- package/third_party/s2geometry/src/s2/util/gtl/btree.h +2471 -0
- package/third_party/s2geometry/src/s2/util/gtl/btree_container.h +411 -0
- package/third_party/s2geometry/src/s2/util/gtl/btree_map.h +79 -0
- package/third_party/s2geometry/src/s2/util/gtl/btree_set.h +73 -0
- package/third_party/s2geometry/src/s2/util/gtl/compact_array.h +653 -0
- package/third_party/s2geometry/src/s2/util/gtl/container_logging.h +291 -0
- package/third_party/s2geometry/src/s2/util/gtl/dense_hash_set.h +358 -0
- package/third_party/s2geometry/src/s2/util/gtl/densehashtable.h +1493 -0
- package/third_party/s2geometry/src/s2/util/gtl/hashtable_common.h +253 -0
- package/third_party/s2geometry/src/s2/util/gtl/layout.h +28 -0
- package/third_party/s2geometry/src/s2/util/gtl/legacy_random_shuffle.h +77 -0
- package/third_party/s2geometry/src/s2/util/hash/mix.h +76 -0
- package/third_party/s2geometry/src/s2/util/math/exactfloat/exactfloat.cc +832 -0
- package/third_party/s2geometry/src/s2/util/math/exactfloat/exactfloat.h +646 -0
- package/third_party/s2geometry/src/s2/util/math/mathutil.cc +75 -0
- package/third_party/s2geometry/src/s2/util/math/mathutil.h +189 -0
- package/third_party/s2geometry/src/s2/util/math/matrix3x3.h +574 -0
- package/third_party/s2geometry/src/s2/util/math/vector.h +569 -0
- package/third_party/s2geometry/src/s2/util/math/vector3_hash.h +54 -0
- package/third_party/s2geometry/src/s2/util/units/length-units.cc +21 -0
- package/third_party/s2geometry/src/s2/util/units/length-units.h +135 -0
- package/third_party/s2geometry/src/s2/util/units/physical-units.h +313 -0
- package/third_party/s2geometry/src/s2/value_lexicon.h +234 -0
- package/third_party/s2geometry/src/s2/value_lexicon_test.cc +121 -0
- package/third_party/s2geometry/third_party/cmake/FindGFlags.cmake +48 -0
- package/third_party/s2geometry/third_party/cmake/FindGlog.cmake +48 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// Copyright 2016 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
|
|
18
|
+
#ifndef S2_S2BUILDERUTIL_S2POINT_VECTOR_LAYER_H_
|
|
19
|
+
#define S2_S2BUILDERUTIL_S2POINT_VECTOR_LAYER_H_
|
|
20
|
+
|
|
21
|
+
#include <memory>
|
|
22
|
+
#include <vector>
|
|
23
|
+
#include "s2/base/logging.h"
|
|
24
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
25
|
+
#include "s2/id_set_lexicon.h"
|
|
26
|
+
#include "s2/mutable_s2shape_index.h"
|
|
27
|
+
#include "s2/s2builder.h"
|
|
28
|
+
#include "s2/s2builder_graph.h"
|
|
29
|
+
#include "s2/s2builder_layer.h"
|
|
30
|
+
#include "s2/s2error.h"
|
|
31
|
+
#include "s2/s2point_vector_shape.h"
|
|
32
|
+
|
|
33
|
+
namespace s2builderutil {
|
|
34
|
+
|
|
35
|
+
// A layer type that collects degenerate edges as points.
|
|
36
|
+
// This layer expects all edges to be degenerate. In case of finding
|
|
37
|
+
// non-degenerate edges it sets S2Error but it still generates the
|
|
38
|
+
// output with degenerate edges.
|
|
39
|
+
class S2PointVectorLayer : public S2Builder::Layer {
|
|
40
|
+
public:
|
|
41
|
+
class Options {
|
|
42
|
+
public:
|
|
43
|
+
using DuplicateEdges = GraphOptions::DuplicateEdges;
|
|
44
|
+
Options();
|
|
45
|
+
explicit Options(DuplicateEdges duplicate_edges);
|
|
46
|
+
|
|
47
|
+
// DEFAULT: DuplicateEdges::MERGE
|
|
48
|
+
DuplicateEdges duplicate_edges() const;
|
|
49
|
+
void set_duplicate_edges(DuplicateEdges duplicate_edges);
|
|
50
|
+
|
|
51
|
+
private:
|
|
52
|
+
DuplicateEdges duplicate_edges_;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
explicit S2PointVectorLayer(std::vector<S2Point>* points,
|
|
56
|
+
const Options& options = Options());
|
|
57
|
+
|
|
58
|
+
using LabelSetIds = std::vector<LabelSetId>;
|
|
59
|
+
S2PointVectorLayer(std::vector<S2Point>* points, LabelSetIds* label_set_ids,
|
|
60
|
+
IdSetLexicon* label_set_lexicon,
|
|
61
|
+
const Options& options = Options());
|
|
62
|
+
|
|
63
|
+
// Layer interface:
|
|
64
|
+
GraphOptions graph_options() const override;
|
|
65
|
+
void Build(const Graph& g, S2Error* error) override;
|
|
66
|
+
|
|
67
|
+
private:
|
|
68
|
+
std::vector<S2Point>* points_;
|
|
69
|
+
LabelSetIds* label_set_ids_;
|
|
70
|
+
IdSetLexicon* label_set_lexicon_;
|
|
71
|
+
Options options_;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// Like S2PointVectorLayer, but adds the points to a MutableS2ShapeIndex (if
|
|
75
|
+
// the point vector is non-empty).
|
|
76
|
+
class IndexedS2PointVectorLayer : public S2Builder::Layer {
|
|
77
|
+
public:
|
|
78
|
+
using Options = S2PointVectorLayer::Options;
|
|
79
|
+
explicit IndexedS2PointVectorLayer(MutableS2ShapeIndex* index,
|
|
80
|
+
const Options& options = Options())
|
|
81
|
+
: index_(index), layer_(&points_, options) {}
|
|
82
|
+
|
|
83
|
+
GraphOptions graph_options() const override {
|
|
84
|
+
return layer_.graph_options();
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
void Build(const Graph& g, S2Error* error) override {
|
|
88
|
+
layer_.Build(g, error);
|
|
89
|
+
if (error->ok() && !points_.empty()) {
|
|
90
|
+
index_->Add(absl::make_unique<S2PointVectorShape>(std::move(points_)));
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
private:
|
|
95
|
+
MutableS2ShapeIndex* index_;
|
|
96
|
+
std::vector<S2Point> points_;
|
|
97
|
+
S2PointVectorLayer layer_;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
////////////////// Implementation details follow ////////////////////
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
inline S2PointVectorLayer::Options::Options()
|
|
105
|
+
: duplicate_edges_(DuplicateEdges::MERGE) {}
|
|
106
|
+
|
|
107
|
+
inline S2PointVectorLayer::Options::Options(DuplicateEdges duplicate_edges)
|
|
108
|
+
: duplicate_edges_(duplicate_edges) {}
|
|
109
|
+
|
|
110
|
+
inline S2Builder::GraphOptions::DuplicateEdges
|
|
111
|
+
S2PointVectorLayer::Options::duplicate_edges() const {
|
|
112
|
+
return duplicate_edges_;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
inline void S2PointVectorLayer::Options::set_duplicate_edges(
|
|
116
|
+
S2Builder::GraphOptions::DuplicateEdges duplicate_edges) {
|
|
117
|
+
duplicate_edges_ = duplicate_edges;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
} // namespace s2builderutil
|
|
121
|
+
|
|
122
|
+
#endif // S2_S2BUILDERUTIL_S2POINT_VECTOR_LAYER_H_
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// Copyright 2016 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
|
|
18
|
+
#include "s2/s2builderutil_s2point_vector_layer.h"
|
|
19
|
+
|
|
20
|
+
#include <memory>
|
|
21
|
+
#include <string>
|
|
22
|
+
#include "s2/base/casts.h"
|
|
23
|
+
#include "s2/base/integral_types.h"
|
|
24
|
+
#include <gtest/gtest.h>
|
|
25
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
26
|
+
#include "s2/mutable_s2shape_index.h"
|
|
27
|
+
#include "s2/s2text_format.h"
|
|
28
|
+
|
|
29
|
+
using absl::make_unique;
|
|
30
|
+
using s2builderutil::IndexedS2PointVectorLayer;
|
|
31
|
+
using s2builderutil::S2PointVectorLayer;
|
|
32
|
+
using s2textformat::MakePointOrDie;
|
|
33
|
+
using std::vector;
|
|
34
|
+
|
|
35
|
+
using EdgeType = S2Builder::EdgeType;
|
|
36
|
+
|
|
37
|
+
namespace {
|
|
38
|
+
|
|
39
|
+
void VerifyS2PointVectorLayerResults(
|
|
40
|
+
const S2PointVectorLayer::LabelSetIds& label_set_ids,
|
|
41
|
+
const IdSetLexicon& label_set_lexicon, const vector<S2Point>& output,
|
|
42
|
+
const string& str_expected_points,
|
|
43
|
+
const vector<vector<int32>>& expected_labels) {
|
|
44
|
+
vector<S2Point> expected_points =
|
|
45
|
+
s2textformat::ParsePoints(str_expected_points);
|
|
46
|
+
|
|
47
|
+
ASSERT_EQ(expected_labels.size(), label_set_ids.size());
|
|
48
|
+
for (int i = 0; i < output.size(); ++i) {
|
|
49
|
+
EXPECT_EQ(expected_points[i], output[i]);
|
|
50
|
+
ASSERT_EQ(expected_labels[i].size(),
|
|
51
|
+
label_set_lexicon.id_set(label_set_ids[i]).size());
|
|
52
|
+
int k = 0;
|
|
53
|
+
for (int32 label : label_set_lexicon.id_set(label_set_ids[i])) {
|
|
54
|
+
EXPECT_EQ(expected_labels[i][k++], label);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
void AddPoint(S2Point p, S2Builder* builder) { builder->AddEdge(p, p); }
|
|
60
|
+
|
|
61
|
+
TEST(S2PointVectorLayer, MergeDuplicates) {
|
|
62
|
+
S2Builder builder{S2Builder::Options()};
|
|
63
|
+
vector<S2Point> output;
|
|
64
|
+
IdSetLexicon label_set_lexicon;
|
|
65
|
+
S2PointVectorLayer::LabelSetIds label_set_ids;
|
|
66
|
+
builder.StartLayer(make_unique<S2PointVectorLayer>(
|
|
67
|
+
&output, &label_set_ids, &label_set_lexicon,
|
|
68
|
+
S2PointVectorLayer::Options(
|
|
69
|
+
S2Builder::GraphOptions::DuplicateEdges::MERGE)));
|
|
70
|
+
|
|
71
|
+
builder.set_label(1);
|
|
72
|
+
AddPoint(MakePointOrDie("0:1"), &builder);
|
|
73
|
+
AddPoint(MakePointOrDie("0:2"), &builder);
|
|
74
|
+
builder.set_label(2);
|
|
75
|
+
AddPoint(MakePointOrDie("0:1"), &builder);
|
|
76
|
+
AddPoint(MakePointOrDie("0:4"), &builder);
|
|
77
|
+
AddPoint(MakePointOrDie("0:5"), &builder);
|
|
78
|
+
builder.clear_labels();
|
|
79
|
+
AddPoint(MakePointOrDie("0:5"), &builder);
|
|
80
|
+
AddPoint(MakePointOrDie("0:6"), &builder);
|
|
81
|
+
S2Error error;
|
|
82
|
+
ASSERT_TRUE(builder.Build(&error));
|
|
83
|
+
|
|
84
|
+
vector<vector<int32>> expected_labels = {{1, 2}, {1}, {2}, {2}, {}};
|
|
85
|
+
string expected_points = "0:1, 0:2, 0:4, 0:5, 0:6";
|
|
86
|
+
|
|
87
|
+
VerifyS2PointVectorLayerResults(label_set_ids, label_set_lexicon, output,
|
|
88
|
+
expected_points, expected_labels);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
TEST(S2PointVectorLayer, KeepDuplicates) {
|
|
92
|
+
S2Builder builder{S2Builder::Options()};
|
|
93
|
+
vector<S2Point> output;
|
|
94
|
+
IdSetLexicon label_set_lexicon;
|
|
95
|
+
S2PointVectorLayer::LabelSetIds label_set_ids;
|
|
96
|
+
builder.StartLayer(make_unique<S2PointVectorLayer>(
|
|
97
|
+
&output, &label_set_ids, &label_set_lexicon,
|
|
98
|
+
S2PointVectorLayer::Options(
|
|
99
|
+
S2Builder::GraphOptions::DuplicateEdges::KEEP)));
|
|
100
|
+
|
|
101
|
+
builder.set_label(1);
|
|
102
|
+
AddPoint(MakePointOrDie("0:1"), &builder);
|
|
103
|
+
AddPoint(MakePointOrDie("0:2"), &builder);
|
|
104
|
+
builder.set_label(2);
|
|
105
|
+
AddPoint(MakePointOrDie("0:1"), &builder);
|
|
106
|
+
AddPoint(MakePointOrDie("0:4"), &builder);
|
|
107
|
+
AddPoint(MakePointOrDie("0:5"), &builder);
|
|
108
|
+
builder.clear_labels();
|
|
109
|
+
AddPoint(MakePointOrDie("0:5"), &builder);
|
|
110
|
+
AddPoint(MakePointOrDie("0:6"), &builder);
|
|
111
|
+
S2Error error;
|
|
112
|
+
ASSERT_TRUE(builder.Build(&error));
|
|
113
|
+
|
|
114
|
+
vector<vector<int32>> expected_labels = {{1}, {2}, {1}, {2}, {2}, {}, {}};
|
|
115
|
+
string expected_points = "0:1, 0:1, 0:2, 0:4, 0:5, 0:5, 0:6";
|
|
116
|
+
|
|
117
|
+
VerifyS2PointVectorLayerResults(label_set_ids, label_set_lexicon, output,
|
|
118
|
+
expected_points, expected_labels);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
TEST(S2PointVectorLayer, Error) {
|
|
122
|
+
S2Builder builder{S2Builder::Options()};
|
|
123
|
+
vector<S2Point> output;
|
|
124
|
+
builder.StartLayer(make_unique<S2PointVectorLayer>(
|
|
125
|
+
&output, S2PointVectorLayer::Options(
|
|
126
|
+
S2Builder::GraphOptions::DuplicateEdges::KEEP)));
|
|
127
|
+
|
|
128
|
+
AddPoint(MakePointOrDie("0:1"), &builder);
|
|
129
|
+
builder.AddEdge(MakePointOrDie("0:3"), MakePointOrDie("0:4"));
|
|
130
|
+
AddPoint(MakePointOrDie("0:5"), &builder);
|
|
131
|
+
S2Error error;
|
|
132
|
+
EXPECT_FALSE(builder.Build(&error));
|
|
133
|
+
EXPECT_EQ(error.code(), S2Error::INVALID_ARGUMENT);
|
|
134
|
+
EXPECT_EQ(error.text(), "Found non-degenerate edges");
|
|
135
|
+
|
|
136
|
+
EXPECT_EQ(2, output.size());
|
|
137
|
+
EXPECT_EQ(MakePointOrDie("0:1"), output[0]);
|
|
138
|
+
EXPECT_EQ(MakePointOrDie("0:5"), output[1]);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
TEST(IndexedS2PointVectorLayer, AddsShapes) {
|
|
142
|
+
S2Builder builder{S2Builder::Options()};
|
|
143
|
+
MutableS2ShapeIndex index;
|
|
144
|
+
builder.StartLayer(make_unique<IndexedS2PointVectorLayer>(&index));
|
|
145
|
+
string point0_str = "0:0";
|
|
146
|
+
string point1_str = "2:2";
|
|
147
|
+
builder.AddPoint(s2textformat::MakePointOrDie(point0_str));
|
|
148
|
+
builder.AddPoint(s2textformat::MakePointOrDie(point1_str));
|
|
149
|
+
S2Error error;
|
|
150
|
+
ASSERT_TRUE(builder.Build(&error));
|
|
151
|
+
EXPECT_EQ(1, index.num_shape_ids());
|
|
152
|
+
auto shape = down_cast<S2PointVectorShape*>(index.shape(0));
|
|
153
|
+
EXPECT_EQ(2, shape->num_points());
|
|
154
|
+
EXPECT_EQ(point0_str, s2textformat::ToString(shape->point(0)));
|
|
155
|
+
EXPECT_EQ(point1_str, s2textformat::ToString(shape->point(1)));
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
TEST(IndexedS2PointVectorLayer, AddsEmptyShape) {
|
|
159
|
+
S2Builder builder{S2Builder::Options()};
|
|
160
|
+
MutableS2ShapeIndex index;
|
|
161
|
+
builder.StartLayer(make_unique<IndexedS2PointVectorLayer>(&index));
|
|
162
|
+
S2Error error;
|
|
163
|
+
ASSERT_TRUE(builder.Build(&error));
|
|
164
|
+
EXPECT_EQ(0, index.num_shape_ids());
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
} // namespace
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// Copyright 2016 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
|
|
18
|
+
#include "s2/s2builderutil_s2polygon_layer.h"
|
|
19
|
+
|
|
20
|
+
#include <algorithm>
|
|
21
|
+
#include <memory>
|
|
22
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
23
|
+
#include "s2/s2debug.h"
|
|
24
|
+
|
|
25
|
+
using absl::make_unique;
|
|
26
|
+
using std::make_pair;
|
|
27
|
+
using std::pair;
|
|
28
|
+
using std::unique_ptr;
|
|
29
|
+
using std::vector;
|
|
30
|
+
|
|
31
|
+
using EdgeType = S2Builder::EdgeType;
|
|
32
|
+
using Graph = S2Builder::Graph;
|
|
33
|
+
using GraphOptions = S2Builder::GraphOptions;
|
|
34
|
+
using Label = S2Builder::Label;
|
|
35
|
+
|
|
36
|
+
using DegenerateEdges = GraphOptions::DegenerateEdges;
|
|
37
|
+
using DuplicateEdges = GraphOptions::DuplicateEdges;
|
|
38
|
+
using SiblingPairs = GraphOptions::SiblingPairs;
|
|
39
|
+
|
|
40
|
+
using LoopType = Graph::LoopType;
|
|
41
|
+
|
|
42
|
+
namespace s2builderutil {
|
|
43
|
+
|
|
44
|
+
S2PolygonLayer::S2PolygonLayer(S2Polygon* polygon, const Options& options) {
|
|
45
|
+
Init(polygon, nullptr, nullptr, options);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
S2PolygonLayer::S2PolygonLayer(
|
|
49
|
+
S2Polygon* polygon, LabelSetIds* label_set_ids,
|
|
50
|
+
IdSetLexicon* label_set_lexicon, const Options& options) {
|
|
51
|
+
Init(polygon, label_set_ids, label_set_lexicon, options);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
void S2PolygonLayer::Init(
|
|
55
|
+
S2Polygon* polygon, LabelSetIds* label_set_ids,
|
|
56
|
+
IdSetLexicon* label_set_lexicon, const Options& options) {
|
|
57
|
+
S2_DCHECK_EQ(label_set_ids == nullptr, label_set_lexicon == nullptr);
|
|
58
|
+
polygon_ = polygon;
|
|
59
|
+
label_set_ids_ = label_set_ids;
|
|
60
|
+
label_set_lexicon_ = label_set_lexicon;
|
|
61
|
+
options_ = options;
|
|
62
|
+
|
|
63
|
+
if (options_.validate()) {
|
|
64
|
+
polygon_->set_s2debug_override(S2Debug::DISABLE);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
GraphOptions S2PolygonLayer::graph_options() const {
|
|
69
|
+
// Prevent degenerate edges and sibling edge pairs. There should not be any
|
|
70
|
+
// duplicate edges if the input is valid, but if there are then we keep them
|
|
71
|
+
// since this tends to produce more comprehensible errors.
|
|
72
|
+
return GraphOptions(options_.edge_type(), DegenerateEdges::DISCARD,
|
|
73
|
+
DuplicateEdges::KEEP, SiblingPairs::DISCARD);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
void S2PolygonLayer::AppendS2Loops(const Graph& g,
|
|
77
|
+
const vector<Graph::EdgeLoop>& edge_loops,
|
|
78
|
+
vector<unique_ptr<S2Loop>>* loops) const {
|
|
79
|
+
vector<S2Point> vertices;
|
|
80
|
+
for (const auto& edge_loop : edge_loops) {
|
|
81
|
+
vertices.reserve(edge_loop.size());
|
|
82
|
+
for (auto edge_id : edge_loop) {
|
|
83
|
+
vertices.push_back(g.vertex(g.edge(edge_id).first));
|
|
84
|
+
}
|
|
85
|
+
loops->push_back(
|
|
86
|
+
make_unique<S2Loop>(vertices, polygon_->s2debug_override()));
|
|
87
|
+
vertices.clear();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
void S2PolygonLayer::AppendEdgeLabels(
|
|
92
|
+
const Graph& g,
|
|
93
|
+
const vector<Graph::EdgeLoop>& edge_loops) {
|
|
94
|
+
if (!label_set_ids_) return;
|
|
95
|
+
|
|
96
|
+
vector<Label> labels; // Temporary storage for labels.
|
|
97
|
+
Graph::LabelFetcher fetcher(g, options_.edge_type());
|
|
98
|
+
for (const auto& edge_loop : edge_loops) {
|
|
99
|
+
vector<LabelSetId> loop_label_set_ids;
|
|
100
|
+
loop_label_set_ids.reserve(edge_loop.size());
|
|
101
|
+
for (auto edge_id : edge_loop) {
|
|
102
|
+
fetcher.Fetch(edge_id, &labels);
|
|
103
|
+
loop_label_set_ids.push_back(label_set_lexicon_->Add(labels));
|
|
104
|
+
}
|
|
105
|
+
label_set_ids_->push_back(std::move(loop_label_set_ids));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
void S2PolygonLayer::InitLoopMap(const vector<unique_ptr<S2Loop>>& loops,
|
|
110
|
+
LoopMap* loop_map) const {
|
|
111
|
+
if (!label_set_ids_) return;
|
|
112
|
+
for (const auto& loop : loops) {
|
|
113
|
+
(*loop_map)[&*loop] =
|
|
114
|
+
make_pair(&loop - &loops[0], loop->contains_origin());
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
void S2PolygonLayer::ReorderEdgeLabels(const LoopMap& loop_map) {
|
|
119
|
+
if (!label_set_ids_) return;
|
|
120
|
+
LabelSetIds new_ids(label_set_ids_->size());
|
|
121
|
+
for (int i = 0; i < polygon_->num_loops(); ++i) {
|
|
122
|
+
S2Loop* loop = polygon_->loop(i);
|
|
123
|
+
const pair<int, bool>& old = loop_map.find(loop)->second;
|
|
124
|
+
new_ids[i].swap((*label_set_ids_)[old.first]);
|
|
125
|
+
if (loop->contains_origin() != old.second) {
|
|
126
|
+
// S2Loop::Invert() reverses the order of the vertices, which leaves
|
|
127
|
+
// the last edge unchanged. For example, the loop ABCD (with edges
|
|
128
|
+
// AB, BC, CD, DA) becomes the loop DCBA (with edges DC, CB, BA, AD).
|
|
129
|
+
std::reverse(new_ids[i].begin(), new_ids[i].end() - 1);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
label_set_ids_->swap(new_ids);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
void S2PolygonLayer::Build(const Graph& g, S2Error* error) {
|
|
136
|
+
if (label_set_ids_) label_set_ids_->clear();
|
|
137
|
+
|
|
138
|
+
// It's tricky to compute the edge labels for S2Polygons because the
|
|
139
|
+
// S2Polygon::Init methods can reorder and/or invert the loops. We handle
|
|
140
|
+
// this by remembering the original vector index of each loop and whether or
|
|
141
|
+
// not the loop contained S2::Origin(). By comparing this with the final
|
|
142
|
+
// S2Polygon loops we can fix up the edge labels appropriately.
|
|
143
|
+
LoopMap loop_map;
|
|
144
|
+
if (g.num_edges() == 0) {
|
|
145
|
+
// The polygon is either full or empty.
|
|
146
|
+
if (g.IsFullPolygon(error)) {
|
|
147
|
+
polygon_->Init(make_unique<S2Loop>(S2Loop::kFull()));
|
|
148
|
+
} else {
|
|
149
|
+
polygon_->InitNested(vector<unique_ptr<S2Loop>>{});
|
|
150
|
+
}
|
|
151
|
+
} else if (g.options().edge_type() == EdgeType::DIRECTED) {
|
|
152
|
+
vector<Graph::EdgeLoop> edge_loops;
|
|
153
|
+
if (!g.GetDirectedLoops(LoopType::SIMPLE, &edge_loops, error)) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
vector<unique_ptr<S2Loop>> loops;
|
|
157
|
+
AppendS2Loops(g, edge_loops, &loops);
|
|
158
|
+
AppendEdgeLabels(g, edge_loops);
|
|
159
|
+
vector<Graph::EdgeLoop>().swap(edge_loops); // Release memory
|
|
160
|
+
InitLoopMap(loops, &loop_map);
|
|
161
|
+
polygon_->InitOriented(std::move(loops));
|
|
162
|
+
} else {
|
|
163
|
+
vector<Graph::UndirectedComponent> components;
|
|
164
|
+
if (!g.GetUndirectedComponents(LoopType::SIMPLE, &components, error)) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
// It doesn't really matter which complement of each component we use,
|
|
168
|
+
// since below we normalize all the loops so that they enclose at most
|
|
169
|
+
// half of the sphere (to ensure that the loops can always be nested).
|
|
170
|
+
//
|
|
171
|
+
// The only reason to prefer one over the other is that when there are
|
|
172
|
+
// multiple loops that touch, only one of the two complements matches the
|
|
173
|
+
// structure of the input loops. GetUndirectedComponents() tries to
|
|
174
|
+
// ensure that this is always complement 0 of each component.
|
|
175
|
+
vector<unique_ptr<S2Loop>> loops;
|
|
176
|
+
for (const auto& component : components) {
|
|
177
|
+
AppendS2Loops(g, component[0], &loops);
|
|
178
|
+
AppendEdgeLabels(g, component[0]);
|
|
179
|
+
}
|
|
180
|
+
vector<Graph::UndirectedComponent>().swap(components); // Release memory
|
|
181
|
+
InitLoopMap(loops, &loop_map);
|
|
182
|
+
for (const auto& loop : loops) loop->Normalize();
|
|
183
|
+
polygon_->InitNested(std::move(loops));
|
|
184
|
+
}
|
|
185
|
+
ReorderEdgeLabels(loop_map);
|
|
186
|
+
if (options_.validate()) {
|
|
187
|
+
polygon_->FindValidationError(error);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
} // namespace s2builderutil
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
// Copyright 2016 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
//
|
|
18
|
+
// Note that there are two supported output types for polygons: S2Polygon and
|
|
19
|
+
// S2LaxPolygonShape. Use S2Polygon if you need the full range of operations
|
|
20
|
+
// that S2Polygon implements. Use S2LaxPolygonShape if you want to represent
|
|
21
|
+
// polygons with zero-area degenerate regions, or if you need a type that has
|
|
22
|
+
// low memory overhead and fast initialization. However, be aware that to
|
|
23
|
+
// convert from a S2LaxPolygonShape to an S2Polygon you will need to use
|
|
24
|
+
// S2Builder again.
|
|
25
|
+
//
|
|
26
|
+
// Similarly, there are two supported output formats for polygon meshes:
|
|
27
|
+
// S2LaxPolygonShapeVector and S2PolygonMesh. Use S2PolygonMesh if you need
|
|
28
|
+
// to be able to determine which polygons are adjacent to each edge or vertex;
|
|
29
|
+
// otherwise use S2LaxPolygonShapeVector, which uses less memory and is faster
|
|
30
|
+
// to construct.
|
|
31
|
+
|
|
32
|
+
#ifndef S2_S2BUILDERUTIL_S2POLYGON_LAYER_H_
|
|
33
|
+
#define S2_S2BUILDERUTIL_S2POLYGON_LAYER_H_
|
|
34
|
+
|
|
35
|
+
#include <memory>
|
|
36
|
+
#include <utility>
|
|
37
|
+
#include <vector>
|
|
38
|
+
#include "s2/base/logging.h"
|
|
39
|
+
#include "s2/util/gtl/btree_map.h"
|
|
40
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
41
|
+
#include "s2/id_set_lexicon.h"
|
|
42
|
+
#include "s2/mutable_s2shape_index.h"
|
|
43
|
+
#include "s2/s2builder.h"
|
|
44
|
+
#include "s2/s2builder_graph.h"
|
|
45
|
+
#include "s2/s2builder_layer.h"
|
|
46
|
+
#include "s2/s2error.h"
|
|
47
|
+
#include "s2/s2loop.h"
|
|
48
|
+
#include "s2/s2polygon.h"
|
|
49
|
+
|
|
50
|
+
namespace s2builderutil {
|
|
51
|
+
|
|
52
|
+
// A layer type that assembles edges (directed or undirected) into an
|
|
53
|
+
// S2Polygon. Returns an error if the edges cannot be assembled into loops.
|
|
54
|
+
//
|
|
55
|
+
// If the input edges are directed, they must be oriented such that the
|
|
56
|
+
// polygon interior is to the left of all edges. Directed edges are always
|
|
57
|
+
// preferred (see S2Builder::EdgeType).
|
|
58
|
+
//
|
|
59
|
+
// Before the edges are assembled into loops, "sibling pairs" consisting of an
|
|
60
|
+
// edge and its reverse edge are automatically removed. Such edge pairs
|
|
61
|
+
// represent zero-area degenerate regions, which S2Polygon does not allow.
|
|
62
|
+
// (If you need to build polygons with degeneracies, use LaxPolygonLayer
|
|
63
|
+
// instead.)
|
|
64
|
+
//
|
|
65
|
+
// S2PolygonLayer is implemented such that if the input to S2Builder is a
|
|
66
|
+
// polygon and is not modified, then the output has the same cyclic ordering
|
|
67
|
+
// of loop vertices and the same loop ordering as the input polygon.
|
|
68
|
+
//
|
|
69
|
+
// If the polygon has no edges, then the graph's IsFullPolygonPredicate is
|
|
70
|
+
// called to determine whether the output polygon should be empty (containing
|
|
71
|
+
// no points) or full (containing all points). This predicate can be
|
|
72
|
+
// specified as part of the S2Builder input geometry.
|
|
73
|
+
class S2PolygonLayer : public S2Builder::Layer {
|
|
74
|
+
public:
|
|
75
|
+
class Options {
|
|
76
|
+
public:
|
|
77
|
+
// Constructor that uses the default options (listed below).
|
|
78
|
+
Options();
|
|
79
|
+
|
|
80
|
+
// Constructor that specifies the edge type.
|
|
81
|
+
explicit Options(S2Builder::EdgeType edge_type);
|
|
82
|
+
|
|
83
|
+
// Indicates whether the input edges provided to S2Builder are directed or
|
|
84
|
+
// undirected. Directed edges should be used whenever possible (see
|
|
85
|
+
// S2Builder::EdgeType for details).
|
|
86
|
+
//
|
|
87
|
+
// If the input edges are directed, they should be oriented so that the
|
|
88
|
+
// polygon interior is to the left of all edges. This means that for a
|
|
89
|
+
// polygon with holes, the outer loops ("shells") should be directed
|
|
90
|
+
// counter-clockwise while the inner loops ("holes") should be directed
|
|
91
|
+
// clockwise. Note that S2Builder::AddPolygon() does this automatically.
|
|
92
|
+
//
|
|
93
|
+
// DEFAULT: S2Builder::EdgeType::DIRECTED
|
|
94
|
+
S2Builder::EdgeType edge_type() const;
|
|
95
|
+
void set_edge_type(S2Builder::EdgeType edge_type);
|
|
96
|
+
|
|
97
|
+
// If true, calls FindValidationError() on the output polygon. If any
|
|
98
|
+
// error is found, it will be returned by S2Builder::Build().
|
|
99
|
+
//
|
|
100
|
+
// Note that this option calls set_s2debug_override(S2Debug::DISABLE) in
|
|
101
|
+
// order to turn off the default error checking in debug builds.
|
|
102
|
+
//
|
|
103
|
+
// DEFAULT: false
|
|
104
|
+
bool validate() const;
|
|
105
|
+
void set_validate(bool validate);
|
|
106
|
+
|
|
107
|
+
private:
|
|
108
|
+
S2Builder::EdgeType edge_type_;
|
|
109
|
+
bool validate_;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// Specifies that a polygon should be constructed using the given options.
|
|
113
|
+
explicit S2PolygonLayer(S2Polygon* polygon,
|
|
114
|
+
const Options& options = Options());
|
|
115
|
+
|
|
116
|
+
// Specifies that a polygon should be constructed using the given options,
|
|
117
|
+
// and that any labels attached to the input edges should be returned in
|
|
118
|
+
// "label_set_ids" and "label_set_lexicion".
|
|
119
|
+
//
|
|
120
|
+
// The labels associated with the edge "polygon.loop(i).vertex({j, j+1})"
|
|
121
|
+
// can be retrieved as follows:
|
|
122
|
+
//
|
|
123
|
+
// for (int32 label : label_set_lexicon.id_set(label_set_ids[i][j])) {...}
|
|
124
|
+
using LabelSetIds = std::vector<std::vector<LabelSetId>>;
|
|
125
|
+
S2PolygonLayer(S2Polygon* polygon, LabelSetIds* label_set_ids,
|
|
126
|
+
IdSetLexicon* label_set_lexicon,
|
|
127
|
+
const Options& options = Options());
|
|
128
|
+
|
|
129
|
+
// Layer interface:
|
|
130
|
+
GraphOptions graph_options() const override;
|
|
131
|
+
void Build(const Graph& g, S2Error* error) override;
|
|
132
|
+
|
|
133
|
+
private:
|
|
134
|
+
void Init(S2Polygon* polygon, LabelSetIds* label_set_ids,
|
|
135
|
+
IdSetLexicon* label_set_lexicon, const Options& options);
|
|
136
|
+
void AppendS2Loops(const Graph& g,
|
|
137
|
+
const std::vector<Graph::EdgeLoop>& edge_loops,
|
|
138
|
+
std::vector<std::unique_ptr<S2Loop>>* loops) const;
|
|
139
|
+
void AppendEdgeLabels(const Graph& g,
|
|
140
|
+
const std::vector<Graph::EdgeLoop>& edge_loops);
|
|
141
|
+
using LoopMap = gtl::btree_map<S2Loop*, std::pair<int, bool>>;
|
|
142
|
+
void InitLoopMap(const std::vector<std::unique_ptr<S2Loop>>& loops,
|
|
143
|
+
LoopMap* loop_map) const;
|
|
144
|
+
void ReorderEdgeLabels(const LoopMap& loop_map);
|
|
145
|
+
|
|
146
|
+
S2Polygon* polygon_;
|
|
147
|
+
LabelSetIds* label_set_ids_;
|
|
148
|
+
IdSetLexicon* label_set_lexicon_;
|
|
149
|
+
Options options_;
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
// Like S2PolygonLayer, but adds the polygon to a MutableS2ShapeIndex (if the
|
|
153
|
+
// polygon is non-empty).
|
|
154
|
+
class IndexedS2PolygonLayer : public S2Builder::Layer {
|
|
155
|
+
public:
|
|
156
|
+
using Options = S2PolygonLayer::Options;
|
|
157
|
+
explicit IndexedS2PolygonLayer(MutableS2ShapeIndex* index,
|
|
158
|
+
const Options& options = Options())
|
|
159
|
+
: index_(index), polygon_(new S2Polygon),
|
|
160
|
+
layer_(polygon_.get(), options) {}
|
|
161
|
+
|
|
162
|
+
GraphOptions graph_options() const override {
|
|
163
|
+
return layer_.graph_options();
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
void Build(const Graph& g, S2Error* error) override {
|
|
167
|
+
layer_.Build(g, error);
|
|
168
|
+
if (error->ok() && !polygon_->is_empty()) {
|
|
169
|
+
index_->Add(
|
|
170
|
+
absl::make_unique<S2Polygon::OwningShape>(std::move(polygon_)));
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
private:
|
|
175
|
+
MutableS2ShapeIndex* index_;
|
|
176
|
+
std::unique_ptr<S2Polygon> polygon_;
|
|
177
|
+
S2PolygonLayer layer_;
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
////////////////// Implementation details follow ////////////////////
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
inline S2PolygonLayer::Options::Options()
|
|
185
|
+
: edge_type_(S2Builder::EdgeType::DIRECTED), validate_(false) {
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
inline S2PolygonLayer::Options::Options(S2Builder::EdgeType edge_type)
|
|
189
|
+
: edge_type_(edge_type), validate_(false) {
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
inline S2Builder::EdgeType S2PolygonLayer::Options::edge_type() const {
|
|
193
|
+
return edge_type_;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
inline void S2PolygonLayer::Options::set_edge_type(
|
|
197
|
+
S2Builder::EdgeType edge_type) {
|
|
198
|
+
edge_type_ = edge_type;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
inline bool S2PolygonLayer::Options::validate() const {
|
|
202
|
+
return validate_;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
inline void S2PolygonLayer::Options::set_validate(bool validate) {
|
|
206
|
+
validate_ = validate;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
} // namespace s2builderutil
|
|
210
|
+
|
|
211
|
+
#endif // S2_S2BUILDERUTIL_S2POLYGON_LAYER_H_
|