@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,501 @@
|
|
|
1
|
+
// Copyright 2017 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_S2BOOLEAN_OPERATION_H_
|
|
19
|
+
#define S2_S2BOOLEAN_OPERATION_H_
|
|
20
|
+
|
|
21
|
+
#include <memory>
|
|
22
|
+
#include <utility>
|
|
23
|
+
#include <vector>
|
|
24
|
+
#include "s2/s2builder.h"
|
|
25
|
+
#include "s2/s2builder_graph.h"
|
|
26
|
+
#include "s2/s2builder_layer.h"
|
|
27
|
+
#include "s2/value_lexicon.h"
|
|
28
|
+
|
|
29
|
+
// This class implements boolean operations (intersection, union, difference,
|
|
30
|
+
// and symmetric difference) for regions whose boundaries are defined by
|
|
31
|
+
// geodesic edges.
|
|
32
|
+
//
|
|
33
|
+
// S2BooleanOperation operates on exactly two input regions at a time. Each
|
|
34
|
+
// region is represented as an S2ShapeIndex and may contain any number of
|
|
35
|
+
// points, polylines, and polygons. The region is essentially the union of
|
|
36
|
+
// these objects, except that polygon interiors must be disjoint from all
|
|
37
|
+
// other geometry (including other polygon interiors). If the input geometry
|
|
38
|
+
// for a region does not meet this condition, it can be normalized by
|
|
39
|
+
// computing its union first. Note that points or polylines are allowed to
|
|
40
|
+
// coincide with the boundaries of polygons.
|
|
41
|
+
//
|
|
42
|
+
// Degeneracies are supported. A polygon loop or polyline may consist of a
|
|
43
|
+
// single edge from a vertex to itself, and polygons may contain "sibling
|
|
44
|
+
// pairs" consisting of an edge and its corresponding reverse edge. Polygons
|
|
45
|
+
// must not have any duplicate edges (due to the requirement that polygon
|
|
46
|
+
// interiors are disjoint), but polylines may have duplicate edges or can even
|
|
47
|
+
// be self-intersecting.
|
|
48
|
+
//
|
|
49
|
+
// Points and polyline edges are treated as multisets: if the same point or
|
|
50
|
+
// polyline edge appears multiple times in the input, it will appear multiple
|
|
51
|
+
// times in the output. For example, the union of a point with an identical
|
|
52
|
+
// point consists of two points. This feature is useful for modeling large
|
|
53
|
+
// sets of points or polylines as a single region while maintaining their
|
|
54
|
+
// distinct identities, even when the points or polylines intersect each
|
|
55
|
+
// other. It is also useful for reconstructing polylines that loop back on
|
|
56
|
+
// themselves. If duplicate geometry is not desired, it can be merged by
|
|
57
|
+
// GraphOptions::DuplicateEdges::MERGE in the S2Builder output layer.
|
|
58
|
+
//
|
|
59
|
+
// Polylines are always considered to be directed. Polyline edges between the
|
|
60
|
+
// same pair of vertices are defined to intersect even if the two edges are in
|
|
61
|
+
// opposite directions. (Undirected polylines can be modeled by specifying
|
|
62
|
+
// GraphOptions::EdgeType::UNDIRECTED in the S2Builder output layer.)
|
|
63
|
+
//
|
|
64
|
+
// The output of each operation is sent to an S2Builder::Layer provided by the
|
|
65
|
+
// client. This allows clients to build any representation of the geometry
|
|
66
|
+
// they choose. It also allows the client to do additional postprocessing of
|
|
67
|
+
// the output before building data structures; for example, the client can
|
|
68
|
+
// easily discard degeneracies or convert them to another data type.
|
|
69
|
+
//
|
|
70
|
+
// The boundaries of polygons and polylines can be modeled as open, semi-open,
|
|
71
|
+
// or closed. Polyline boundaries are controlled by the PolylineModel class,
|
|
72
|
+
// whose options are as follows:
|
|
73
|
+
//
|
|
74
|
+
// - In the OPEN model, polylines do not contain their first or last vertex
|
|
75
|
+
// except for one special case: namely, if the polyline forms a loop and
|
|
76
|
+
// the polyline_loops_have_boundaries() option is set to false, then the
|
|
77
|
+
// first/last vertex is contained.
|
|
78
|
+
//
|
|
79
|
+
// - In the SEMI_OPEN model, polylines contain all vertices except the last.
|
|
80
|
+
// Therefore if one polyline starts where another polyline stops, the two
|
|
81
|
+
// polylines do not intersect.
|
|
82
|
+
//
|
|
83
|
+
// - In the CLOSED model, polylines contain all of their vertices.
|
|
84
|
+
//
|
|
85
|
+
// When multiple polylines are present, they are processed independently and
|
|
86
|
+
// have no effect on each other. For example, in the OPEN boundary model the
|
|
87
|
+
// polyline ABC contains the vertex B, while set of polylines {AB, BC} does
|
|
88
|
+
// not. (If you want to treat the polylines as a union instead, with
|
|
89
|
+
// boundaries merged according to the "mod 2" rule, this can be achieved by
|
|
90
|
+
// reassembling the edges into maximal polylines using S2PolylineVectorLayer
|
|
91
|
+
// with EdgeType::UNDIRECTED, DuplicateEdges::MERGE, and PolylineType::WALK.)
|
|
92
|
+
//
|
|
93
|
+
// Polygon boundaries are controlled by the PolygonModel class, which has the
|
|
94
|
+
// following options:
|
|
95
|
+
//
|
|
96
|
+
// - In the OPEN model, polygons do not contain their vertices or edges.
|
|
97
|
+
// This implies that a polyline that follows the boundary of a polygon will
|
|
98
|
+
// not intersect it.
|
|
99
|
+
//
|
|
100
|
+
// - In the SEMI_OPEN model, polygon point containment is defined such that
|
|
101
|
+
// if several polygons tile the region around a vertex, then exactly one of
|
|
102
|
+
// those polygons contains that vertex. Similarly polygons contain all of
|
|
103
|
+
// their edges, but none of their reversed edges. This implies that a
|
|
104
|
+
// polyline and polygon edge with the same endpoints intersect if and only
|
|
105
|
+
// if they are in the same direction. (This rule ensures that if a
|
|
106
|
+
// polyline is intersected with a polygon and its complement, the two
|
|
107
|
+
// resulting polylines do not have any edges in common.)
|
|
108
|
+
//
|
|
109
|
+
// - In the CLOSED model, polygons contain all their vertices, edges, and
|
|
110
|
+
// reversed edges. This implies that a polyline that shares an edge (in
|
|
111
|
+
// either direction) with a polygon is defined to intersect it. Similarly,
|
|
112
|
+
// this is the only model where polygons that touch at a vertex or along an
|
|
113
|
+
// edge intersect.
|
|
114
|
+
//
|
|
115
|
+
// Note that PolylineModel and PolygonModel are defined as separate classes in
|
|
116
|
+
// order to allow for possible future extensions.
|
|
117
|
+
//
|
|
118
|
+
// Operations between geometry of different dimensions are defined as follows:
|
|
119
|
+
//
|
|
120
|
+
// - For UNION, the higher-dimensional shape always wins. For example the
|
|
121
|
+
// union of a closed polygon A with a polyline B that coincides with the
|
|
122
|
+
// boundary of A consists only of the polygon A.
|
|
123
|
+
//
|
|
124
|
+
// - For INTERSECTION, the lower-dimensional shape always wins. For example,
|
|
125
|
+
// the intersection of a closed polygon A with a point B that coincides
|
|
126
|
+
// with a vertex of A consists only of the point B.
|
|
127
|
+
//
|
|
128
|
+
// - For DIFFERENCE, higher-dimensional shapes are not affected by
|
|
129
|
+
// subtracting lower-dimensional shapes. For example, subtracting a point
|
|
130
|
+
// or polyline from a polygon A yields the original polygon A. This rule
|
|
131
|
+
// exists because in general, it is impossible to represent the output
|
|
132
|
+
// using the specified boundary model(s). (Consider subtracting one vertex
|
|
133
|
+
// from a PolylineModel::CLOSED polyline, or subtracting one edge from a
|
|
134
|
+
// PolygonModel::CLOSED polygon.) If you want to perform operations like
|
|
135
|
+
// this, consider representing all boundaries explicitly (topological
|
|
136
|
+
// boundaries) using OPEN boundary models. Another option for polygons is
|
|
137
|
+
// to subtract a degenerate loop, which yields a polygon with a degenerate
|
|
138
|
+
// hole (see S2LaxPolygonShape).
|
|
139
|
+
//
|
|
140
|
+
// Note that in the case of Precision::EXACT operations, the above remarks
|
|
141
|
+
// only apply to the output before snapping. Snapping may cause nearby
|
|
142
|
+
// distinct edges to become coincident, e.g. a polyline may become coincident
|
|
143
|
+
// with a polygon boundary. However also note that S2BooleanOperation is
|
|
144
|
+
// perfectly happy to accept such geometry as input.
|
|
145
|
+
//
|
|
146
|
+
// Note the following differences between S2BooleanOperation and the similar
|
|
147
|
+
// S2MultiBooleanOperation class:
|
|
148
|
+
//
|
|
149
|
+
// - S2BooleanOperation operates on exactly two regions at a time, whereas
|
|
150
|
+
// S2MultiBooleanOperation operates on any number of regions.
|
|
151
|
+
//
|
|
152
|
+
// - S2BooleanOperation is potentially much faster when the input is already
|
|
153
|
+
// represented as S2ShapeIndexes. The algorithm is output sensitive and is
|
|
154
|
+
// often sublinear in the input size. This can be a big advantage if, say,
|
|
155
|
+
//
|
|
156
|
+
// - S2BooleanOperation supports exact predicates and the corresponding
|
|
157
|
+
// exact operations (i.e., operations that are equivalent to computing the
|
|
158
|
+
// exact result and then snap rounding it).
|
|
159
|
+
//
|
|
160
|
+
// - S2MultiBooleanOperation has better error guarantees when there are many
|
|
161
|
+
// regions, since it requires only one snapping operation for any number of
|
|
162
|
+
// input regions.
|
|
163
|
+
//
|
|
164
|
+
// Example usage:
|
|
165
|
+
// S2ShapeIndex a, b; // Input geometry, e.g. containing polygons.
|
|
166
|
+
// S2Polygon polygon; // Output geometry.
|
|
167
|
+
// S2BooleanOperation::Options options;
|
|
168
|
+
// options.set_snap_function(snap_function);
|
|
169
|
+
// S2BooleanOperation op(S2BooleanOperation::OpType::INTERSECTION,
|
|
170
|
+
// absl::make_unique<S2PolygonLayer>(&polygon),
|
|
171
|
+
// options);
|
|
172
|
+
// S2Error error;
|
|
173
|
+
// if (!op.Build(a, b, &error)) {
|
|
174
|
+
// S2_LOG(ERROR) << error;
|
|
175
|
+
// ...
|
|
176
|
+
// }
|
|
177
|
+
//
|
|
178
|
+
// If the output includes objects of different dimensions, they can be
|
|
179
|
+
// assembled into different layers with code like this:
|
|
180
|
+
//
|
|
181
|
+
// vector<S2Point> points;
|
|
182
|
+
// vector<unique_ptr<S2Polyline>> polylines;
|
|
183
|
+
// S2Polygon polygon;
|
|
184
|
+
// S2BooleanOperation op(
|
|
185
|
+
// S2BooleanOperation::OpType::UNION,
|
|
186
|
+
// absl::make_unique<s2builderutil::PointVectorLayer>(&points),
|
|
187
|
+
// absl::make_unique<s2builderutil::S2PolylineVectorLayer>(&polylines),
|
|
188
|
+
// absl::make_unique<S2PolygonLayer>(&polygon));
|
|
189
|
+
|
|
190
|
+
class S2BooleanOperation {
|
|
191
|
+
public:
|
|
192
|
+
// The supported operation types.
|
|
193
|
+
enum class OpType {
|
|
194
|
+
UNION, // Contained by either region.
|
|
195
|
+
INTERSECTION, // Contained by both regions.
|
|
196
|
+
DIFFERENCE, // Contained by the first region but not the second.
|
|
197
|
+
SYMMETRIC_DIFFERENCE // Contained by one region but not the other.
|
|
198
|
+
};
|
|
199
|
+
// Translates OpType to one of the strings above.
|
|
200
|
+
static const char* OpTypeToString(OpType op_type);
|
|
201
|
+
|
|
202
|
+
// Defines whether polygons are considered to contain their vertices and/or
|
|
203
|
+
// edges (see definitions above).
|
|
204
|
+
enum class PolygonModel { OPEN, SEMI_OPEN, CLOSED };
|
|
205
|
+
|
|
206
|
+
// Defines whether polylines are considered to contain their endpoints
|
|
207
|
+
// (see definitions above).
|
|
208
|
+
enum class PolylineModel { OPEN, SEMI_OPEN, CLOSED };
|
|
209
|
+
|
|
210
|
+
// With Precision::EXACT, the operation is evaluated using the exact input
|
|
211
|
+
// geometry. Predicates that use this option will produce exact results;
|
|
212
|
+
// for example, they can distinguish between a polyline that barely
|
|
213
|
+
// intersects a polygon from one that barely misses it. Constructive
|
|
214
|
+
// operations (ones that yield new geometry, as opposed to predicates) are
|
|
215
|
+
// implemented by computing the exact result and then snap rounding it
|
|
216
|
+
// according to the given snap_function() (see below). This is as close as
|
|
217
|
+
// it is possible to get to the exact result while requiring that vertex
|
|
218
|
+
// coordinates have type "double".
|
|
219
|
+
//
|
|
220
|
+
// With Precision::SNAPPED, the input regions are snapped together *before*
|
|
221
|
+
// the operation is evaluated. So for example, two polygons that overlap
|
|
222
|
+
// slightly will be treated as though they share a common boundary, and
|
|
223
|
+
// similarly two polygons that are slightly separated from each other will
|
|
224
|
+
// be treated as though they share a common boundary. Snapped results are
|
|
225
|
+
// useful for dealing with points, since in S2 the only points that lie
|
|
226
|
+
// exactly on a polyline or polygon edge are the endpoints of that edge.
|
|
227
|
+
//
|
|
228
|
+
// Conceptually, the difference between these two options is that with
|
|
229
|
+
// Precision::SNAPPED, the inputs are snap rounded (together), whereas with
|
|
230
|
+
// Precision::EXACT only the result is snap rounded.
|
|
231
|
+
enum class Precision { EXACT, SNAPPED };
|
|
232
|
+
|
|
233
|
+
// SourceId identifies an edge from one of the two input S2ShapeIndexes.
|
|
234
|
+
// It consists of a region id (0 or 1), a shape id within that region's
|
|
235
|
+
// S2ShapeIndex, and an edge id within that shape.
|
|
236
|
+
class SourceId {
|
|
237
|
+
public:
|
|
238
|
+
SourceId();
|
|
239
|
+
SourceId(int region_id, int32 shape_id, int32 edge_id);
|
|
240
|
+
explicit SourceId(int32 special_edge_id);
|
|
241
|
+
int region_id() const { return region_id_; }
|
|
242
|
+
int32 shape_id() const { return shape_id_; }
|
|
243
|
+
int32 edge_id() const { return edge_id_; }
|
|
244
|
+
// TODO(ericv): Convert to functions, define all 6 comparisons.
|
|
245
|
+
bool operator==(SourceId other) const;
|
|
246
|
+
bool operator<(SourceId other) const;
|
|
247
|
+
|
|
248
|
+
private:
|
|
249
|
+
uint32 region_id_ : 1;
|
|
250
|
+
uint32 shape_id_ : 31;
|
|
251
|
+
int32 edge_id_;
|
|
252
|
+
};
|
|
253
|
+
|
|
254
|
+
class Options {
|
|
255
|
+
public:
|
|
256
|
+
Options();
|
|
257
|
+
|
|
258
|
+
// Convenience constructor that calls set_snap_function().
|
|
259
|
+
explicit Options(const S2Builder::SnapFunction& snap_function);
|
|
260
|
+
|
|
261
|
+
// Specifies the function to be used for snap rounding.
|
|
262
|
+
//
|
|
263
|
+
// DEFAULT: s2builderutil::IdentitySnapFunction(S1Angle::Zero())
|
|
264
|
+
// - This does no snapping and preserves all input vertices exactly unless
|
|
265
|
+
// there are crossing edges, in which case the snap radius is increased
|
|
266
|
+
// to the maximum intersection point error (S2::kIntersectionError).
|
|
267
|
+
const S2Builder::SnapFunction& snap_function() const;
|
|
268
|
+
void set_snap_function(const S2Builder::SnapFunction& snap_function);
|
|
269
|
+
|
|
270
|
+
// Defines whether polygons are considered to contain their vertices
|
|
271
|
+
// and/or edges (see comments above).
|
|
272
|
+
//
|
|
273
|
+
// DEFAULT: PolygonModel::SEMI_OPEN
|
|
274
|
+
PolygonModel polygon_model() const;
|
|
275
|
+
void set_polygon_model(PolygonModel model);
|
|
276
|
+
|
|
277
|
+
// Defines whether polylines are considered to contain their vertices (see
|
|
278
|
+
// comments above).
|
|
279
|
+
//
|
|
280
|
+
// DEFAULT: PolylineModel::CLOSED
|
|
281
|
+
PolylineModel polyline_model() const;
|
|
282
|
+
void set_polyline_model(PolylineModel model);
|
|
283
|
+
|
|
284
|
+
// Specifies whether a polyline loop is considered to have a non-empty
|
|
285
|
+
// boundary. By default this option is true, meaning that even if the
|
|
286
|
+
// first and last vertices of a polyline are the same, the polyline is
|
|
287
|
+
// considered to have a well-defined "start" and "end". For example, if
|
|
288
|
+
// the polyline boundary model is OPEN then the polyline loop would not
|
|
289
|
+
// include the start/end vertices. These are the best semantics for most
|
|
290
|
+
// applications, such as GPS tracks or road network segments.
|
|
291
|
+
//
|
|
292
|
+
// If the polyline forms a loop and this option is set to false, then
|
|
293
|
+
// instead the first and last vertices are considered to represent a
|
|
294
|
+
// single vertex in the interior of the polyline. In this case the
|
|
295
|
+
// boundary of the polyline is empty, meaning that the first/last vertex
|
|
296
|
+
// will be contained by the polyline even if the boundary model is OPEN.
|
|
297
|
+
// (Note that this option also has a small effect on the CLOSED boundary
|
|
298
|
+
// model, because the first/last vertices of a polyline loop are
|
|
299
|
+
// considered to represent one vertex rather than two.)
|
|
300
|
+
//
|
|
301
|
+
// The main reason for this option is to implement the "mod 2 union"
|
|
302
|
+
// boundary semantics of the OpenGIS Simple Features spec. This can be
|
|
303
|
+
// achieved by making sure that all polylines are constructed using
|
|
304
|
+
// S2Builder::Graph::PolylineType::WALK (which ensures that all polylines
|
|
305
|
+
// are as long as possible), and then setting this option to false.
|
|
306
|
+
//
|
|
307
|
+
// DEFAULT: true
|
|
308
|
+
bool polyline_loops_have_boundaries() const;
|
|
309
|
+
void set_polyline_loops_have_boundaries(bool value);
|
|
310
|
+
|
|
311
|
+
// Specifies whether the operation should use the exact input geometry
|
|
312
|
+
// (Precision::EXACT), or whether the two input regions should be snapped
|
|
313
|
+
// together first (Precision::SNAPPED).
|
|
314
|
+
//
|
|
315
|
+
// DEFAULT: Precision::EXACT
|
|
316
|
+
Precision precision() const;
|
|
317
|
+
// void set_precision(Precision precision);
|
|
318
|
+
|
|
319
|
+
// If true, the input geometry is interpreted as representing nearby
|
|
320
|
+
// geometry that has been snapped or simplified. It then outputs a
|
|
321
|
+
// conservative result based on the value of polygon_model() and
|
|
322
|
+
// polyline_model(). For the most part, this only affects the handling of
|
|
323
|
+
// degeneracies.
|
|
324
|
+
//
|
|
325
|
+
// - If the model is OPEN, the result is as open as possible. For
|
|
326
|
+
// example, the intersection of two identical degenerate shells is empty
|
|
327
|
+
// under PolygonModel::OPEN because they could have been disjoint before
|
|
328
|
+
// snapping. Similarly, two identical degenerate polylines have an
|
|
329
|
+
// empty intersection under PolylineModel::OPEN.
|
|
330
|
+
//
|
|
331
|
+
// - If the model is CLOSED, the result is as closed as possible. In the
|
|
332
|
+
// case of the DIFFERENCE operation, this is equivalent to evaluating
|
|
333
|
+
// A - B as Closure(A) - Interior(B). For other operations, it affects
|
|
334
|
+
// only the handling of degeneracies. For example, the union of two
|
|
335
|
+
// identical degenerate holes is empty under PolygonModel::CLOSED
|
|
336
|
+
// (i.e., the hole disappears) because the holes could have been
|
|
337
|
+
// disjoint before snapping.
|
|
338
|
+
//
|
|
339
|
+
// - If the model is SEMI_OPEN, the result is as degenerate as possible.
|
|
340
|
+
// New degeneracies will not be created, but all degeneracies that
|
|
341
|
+
// coincide with the opposite region's boundary are retained unless this
|
|
342
|
+
// would cause a duplicate polygon edge to be created. This model is
|
|
343
|
+
// is very useful for working with input data that has both positive and
|
|
344
|
+
// negative degeneracies (i.e., degenerate shells and holes).
|
|
345
|
+
//
|
|
346
|
+
// DEFAULT: false
|
|
347
|
+
bool conservative_output() const;
|
|
348
|
+
// void set_conservative_output(bool conservative);
|
|
349
|
+
|
|
350
|
+
// If specified, then each output edge will be labelled with one or more
|
|
351
|
+
// SourceIds indicating which input edge(s) it corresponds to. This
|
|
352
|
+
// can be useful if your input geometry has additional data that needs to
|
|
353
|
+
// be propagated from the input to the output (e.g., elevations).
|
|
354
|
+
//
|
|
355
|
+
// You can access the labels by using an S2Builder::Layer type that
|
|
356
|
+
// supports labels, such as S2PolygonLayer. The layer outputs a
|
|
357
|
+
// "label_set_lexicon" and an "label_set_id" for each edge. You can then
|
|
358
|
+
// look up the source information for each edge like this:
|
|
359
|
+
//
|
|
360
|
+
// for (int32 label : label_set_lexicon.id_set(label_set_id)) {
|
|
361
|
+
// const SourceId& src = source_id_lexicon.value(label);
|
|
362
|
+
// // region_id() specifies which S2ShapeIndex the edge is from (0 or 1).
|
|
363
|
+
// DoSomething(src.region_id(), src.shape_id(), src.edge_id());
|
|
364
|
+
// }
|
|
365
|
+
//
|
|
366
|
+
// DEFAULT: nullptr
|
|
367
|
+
ValueLexicon<SourceId>* source_id_lexicon() const;
|
|
368
|
+
// void set_source_id_lexicon(ValueLexicon<SourceId>* source_id_lexicon);
|
|
369
|
+
|
|
370
|
+
// Options may be assigned and copied.
|
|
371
|
+
Options(const Options& options);
|
|
372
|
+
Options& operator=(const Options& options);
|
|
373
|
+
|
|
374
|
+
private:
|
|
375
|
+
std::unique_ptr<S2Builder::SnapFunction> snap_function_;
|
|
376
|
+
PolygonModel polygon_model_ = PolygonModel::SEMI_OPEN;;
|
|
377
|
+
PolylineModel polyline_model_ = PolylineModel::CLOSED;
|
|
378
|
+
bool polyline_loops_have_boundaries_ = true;
|
|
379
|
+
Precision precision_ = Precision::EXACT;
|
|
380
|
+
bool conservative_output_ = false;
|
|
381
|
+
ValueLexicon<SourceId>* source_id_lexicon_ = nullptr;
|
|
382
|
+
};
|
|
383
|
+
|
|
384
|
+
S2BooleanOperation(OpType op_type,
|
|
385
|
+
std::unique_ptr<S2Builder::Layer> layer,
|
|
386
|
+
const Options& options = Options());
|
|
387
|
+
|
|
388
|
+
// Specifies that the output boundary edges should be sent to three
|
|
389
|
+
// different layers according to their dimension. Points (represented by
|
|
390
|
+
// degenerate edges) are sent to layer 0, polyline edges are sent to
|
|
391
|
+
// layer 1, and polygon edges are sent to layer 2.
|
|
392
|
+
//
|
|
393
|
+
// The dimension of an edge is defined as the minimum dimension of the two
|
|
394
|
+
// input edges that produced it. For example, the intersection of two
|
|
395
|
+
// crossing polyline edges is a considered to be a degenerate polyline
|
|
396
|
+
// rather than a point, so it is sent to layer 1. Clients can easily
|
|
397
|
+
// reclassify such polylines as points if desired, but this rule makes it
|
|
398
|
+
// easier for clients that want to process point, polyline, and polygon
|
|
399
|
+
// inputs differently.
|
|
400
|
+
//
|
|
401
|
+
// The layers are always built in the order 0, 1, 2, and all arguments to
|
|
402
|
+
// the Build() calls are guaranteed to be valid until the last call returns.
|
|
403
|
+
// All Graph objects have the same set of vertices and the same lexicon
|
|
404
|
+
// objects, in order to make it easier to write classes that process all the
|
|
405
|
+
// edges in parallel.
|
|
406
|
+
S2BooleanOperation(OpType op_type,
|
|
407
|
+
std::vector<std::unique_ptr<S2Builder::Layer>> layers,
|
|
408
|
+
const Options& options = Options());
|
|
409
|
+
|
|
410
|
+
OpType op_type() const { return op_type_; }
|
|
411
|
+
|
|
412
|
+
// Executes the given operation. Returns true on success, and otherwise
|
|
413
|
+
// sets "error" appropriately. (This class does not generate any errors
|
|
414
|
+
// itself, but the S2Builder::Layer might.)
|
|
415
|
+
bool Build(const S2ShapeIndex& a, const S2ShapeIndex& b,
|
|
416
|
+
S2Error* error);
|
|
417
|
+
|
|
418
|
+
// Convenience method that returns true if the result of the given operation
|
|
419
|
+
// is empty.
|
|
420
|
+
static bool IsEmpty(OpType op_type,
|
|
421
|
+
const S2ShapeIndex& a, const S2ShapeIndex& b,
|
|
422
|
+
const Options& options = Options());
|
|
423
|
+
|
|
424
|
+
// Convenience method that returns true if A intersects B.
|
|
425
|
+
static bool Intersects(const S2ShapeIndex& a, const S2ShapeIndex& b,
|
|
426
|
+
const Options& options = Options()) {
|
|
427
|
+
return !IsEmpty(OpType::INTERSECTION, b, a, options);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// Convenience method that returns true if A contains B, i.e., if the
|
|
431
|
+
// difference (B - A) is empty.
|
|
432
|
+
static bool Contains(const S2ShapeIndex& a, const S2ShapeIndex& b,
|
|
433
|
+
const Options& options = Options()) {
|
|
434
|
+
return IsEmpty(OpType::DIFFERENCE, b, a, options);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
// Convenience method that returns true if the symmetric difference of A and
|
|
438
|
+
// B is empty. (Note that A and B may still not be identical, e.g. A may
|
|
439
|
+
// contain two copies of a polyline while B contains one.)
|
|
440
|
+
static bool Equals(const S2ShapeIndex& a, const S2ShapeIndex& b,
|
|
441
|
+
const Options& options = Options()) {
|
|
442
|
+
return IsEmpty(OpType::SYMMETRIC_DIFFERENCE, b, a, options);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
private:
|
|
446
|
+
class Impl; // The actual implementation.
|
|
447
|
+
|
|
448
|
+
// Internal constructor to reduce code duplication.
|
|
449
|
+
S2BooleanOperation(OpType op_type, const Options& options);
|
|
450
|
+
|
|
451
|
+
// Specifies that "result_empty" should be set to indicate whether the exact
|
|
452
|
+
// result of the operation is empty. This constructor is used to efficiently
|
|
453
|
+
// test boolean relationships (see IsEmpty above).
|
|
454
|
+
S2BooleanOperation(OpType op_type, bool* result_empty,
|
|
455
|
+
const Options& options = Options());
|
|
456
|
+
|
|
457
|
+
OpType op_type_;
|
|
458
|
+
Options options_;
|
|
459
|
+
|
|
460
|
+
// The input regions.
|
|
461
|
+
const S2ShapeIndex* regions_[2];
|
|
462
|
+
|
|
463
|
+
// The output consists either of zero layers, one layer, or three layers.
|
|
464
|
+
std::vector<std::unique_ptr<S2Builder::Layer>> layers_;
|
|
465
|
+
|
|
466
|
+
// The following field is set if and only if there are no output layers.
|
|
467
|
+
bool* result_empty_;
|
|
468
|
+
};
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
////////////////// Implementation details follow ////////////////////
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
inline S2BooleanOperation::SourceId::SourceId()
|
|
475
|
+
: region_id_(0), shape_id_(0), edge_id_(-1) {
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
inline S2BooleanOperation::SourceId::SourceId(
|
|
479
|
+
int region_id, int32 shape_id, int32 edge_id)
|
|
480
|
+
: region_id_(region_id), shape_id_(shape_id), edge_id_(edge_id) {
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
inline S2BooleanOperation::SourceId::SourceId(int special_edge_id)
|
|
484
|
+
: region_id_(0), shape_id_(0), edge_id_(special_edge_id) {
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
inline bool S2BooleanOperation::SourceId::operator==(SourceId other) const {
|
|
488
|
+
return (region_id_ == other.region_id_ &&
|
|
489
|
+
shape_id_ == other.shape_id_ &&
|
|
490
|
+
edge_id_ == other.edge_id_);
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
inline bool S2BooleanOperation::SourceId::operator<(SourceId other) const {
|
|
494
|
+
if (region_id_ < other.region_id_) return true;
|
|
495
|
+
if (region_id_ > other.region_id_) return false;
|
|
496
|
+
if (shape_id_ < other.shape_id_) return true;
|
|
497
|
+
if (shape_id_ > other.shape_id_) return false;
|
|
498
|
+
return edge_id_ < other.edge_id_;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
#endif // S2_S2BOOLEAN_OPERATION_H_
|