@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,136 @@
|
|
|
1
|
+
// Copyright 2018 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 the "real" testing of these methods is in s2loop_measures_test
|
|
19
|
+
// and s2polyline_measures_test. This file only checks the handling of
|
|
20
|
+
// multiple shapes and shapes of different dimensions.
|
|
21
|
+
|
|
22
|
+
#include "s2/s2shape_index_measures.h"
|
|
23
|
+
|
|
24
|
+
#include <gtest/gtest.h>
|
|
25
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
26
|
+
#include "s2/mutable_s2shape_index.h"
|
|
27
|
+
#include "s2/s2lax_polygon_shape.h"
|
|
28
|
+
#include "s2/s2lax_polyline_shape.h"
|
|
29
|
+
#include "s2/s2point_vector_shape.h"
|
|
30
|
+
#include "s2/s2pointutil.h"
|
|
31
|
+
#include "s2/s2text_format.h"
|
|
32
|
+
|
|
33
|
+
using absl::make_unique;
|
|
34
|
+
using s2textformat::MakeIndexOrDie;
|
|
35
|
+
|
|
36
|
+
namespace {
|
|
37
|
+
|
|
38
|
+
TEST(GetDimension, Empty) {
|
|
39
|
+
EXPECT_EQ(-1, S2::GetDimension(*MakeIndexOrDie("# #")));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
TEST(GetDimension, Points) {
|
|
43
|
+
EXPECT_EQ(0, S2::GetDimension(*MakeIndexOrDie("0:0 # #")));
|
|
44
|
+
|
|
45
|
+
// Create an index with an empty point set.
|
|
46
|
+
MutableS2ShapeIndex index;
|
|
47
|
+
index.Add(make_unique<S2PointVectorShape>());
|
|
48
|
+
EXPECT_EQ(0, S2::GetDimension(index));
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
TEST(GetDimension, PointsAndLines) {
|
|
52
|
+
EXPECT_EQ(1, S2::GetDimension(*MakeIndexOrDie("0:0 # 1:1, 1:2 #")));
|
|
53
|
+
|
|
54
|
+
// Note that a polyline with one vertex has no edges, so it is effectively
|
|
55
|
+
// empty for the purpose of testing GetDimension().
|
|
56
|
+
EXPECT_EQ(1, S2::GetDimension(*MakeIndexOrDie("0:0 # 1:1 #")));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
TEST(GetDimension, PointsLinesAndPolygons) {
|
|
60
|
+
EXPECT_EQ(2, S2::GetDimension(*MakeIndexOrDie(
|
|
61
|
+
"0:0 # 1:1, 2:2 # 3:3, 3:4, 4:3")));
|
|
62
|
+
|
|
63
|
+
EXPECT_EQ(2, S2::GetDimension(*MakeIndexOrDie("# # empty")));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
TEST(GetNumPoints, Empty) {
|
|
67
|
+
EXPECT_EQ(0, S2::GetNumPoints(*MakeIndexOrDie("# #")));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
TEST(GetNumPoints, TwoPoints) {
|
|
71
|
+
EXPECT_EQ(2, S2::GetNumPoints(*MakeIndexOrDie("0:0 | 1:0 # #")));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
TEST(GetNumPoints, LineAndPolygon) {
|
|
75
|
+
EXPECT_EQ(0, S2::GetNumPoints(*MakeIndexOrDie(
|
|
76
|
+
"# 1:1, 1:2 # 0:3, 0:5, 2:5")));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
TEST(GetLength, Empty) {
|
|
80
|
+
EXPECT_EQ(S1Angle::Zero(), S2::GetLength(*MakeIndexOrDie("# #")));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
TEST(GetLength, TwoLines) {
|
|
84
|
+
EXPECT_EQ(S1Angle::Degrees(2), S2::GetLength(*MakeIndexOrDie(
|
|
85
|
+
"4:4 # 0:0, 1:0 | 1:0, 2:0 # 5:5, 5:6, 6:5")));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
TEST(GetPerimeter, Empty) {
|
|
89
|
+
EXPECT_EQ(S1Angle::Zero(), S2::GetPerimeter(*MakeIndexOrDie("# #")));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
TEST(GetPerimeter, DegeneratePolygon) {
|
|
93
|
+
EXPECT_DOUBLE_EQ(4.0, S2::GetPerimeter(*MakeIndexOrDie(
|
|
94
|
+
"4:4 # 0:0, 1:0 | 2:0, 3:0 # 0:1, 0:2, 0:3")).degrees());
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
TEST(GetArea, Empty) {
|
|
98
|
+
EXPECT_EQ(0.0, S2::GetArea(*MakeIndexOrDie("# #")));
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
TEST(GetArea, TwoFullPolygons) {
|
|
102
|
+
EXPECT_EQ(8 * M_PI, S2::GetArea(*MakeIndexOrDie("# # full | full")));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
TEST(GetApproxArea, Empty) {
|
|
106
|
+
EXPECT_EQ(0.0, S2::GetApproxArea(*MakeIndexOrDie("# #")));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
TEST(GetApproxArea, TwoFullPolygons) {
|
|
110
|
+
EXPECT_EQ(8 * M_PI, S2::GetApproxArea(*MakeIndexOrDie("# # full | full")));
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
TEST(GetCentroid, Empty) {
|
|
114
|
+
EXPECT_EQ(S2Point(0, 0, 0), S2::GetCentroid(*MakeIndexOrDie("# #")));
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
TEST(GetCentroid, Points) {
|
|
118
|
+
EXPECT_EQ(S2Point(1, 1, 0),
|
|
119
|
+
S2::GetCentroid(*MakeIndexOrDie("0:0 | 0:90 # #")));
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
TEST(GetCentroid, Polyline) {
|
|
123
|
+
// Checks that points are ignored when computing the centroid.
|
|
124
|
+
EXPECT_TRUE(S2::ApproxEquals(
|
|
125
|
+
S2Point(1, 1, 0),
|
|
126
|
+
S2::GetCentroid(*MakeIndexOrDie("5:5 | 6:6 # 0:0, 0:90 #"))));
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
TEST(GetCentroid, Polygon) {
|
|
130
|
+
// Checks that points and polylines are ignored when computing the centroid.
|
|
131
|
+
EXPECT_TRUE(S2::ApproxEquals(
|
|
132
|
+
S2Point(M_PI_4, M_PI_4, M_PI_4),
|
|
133
|
+
S2::GetCentroid(*MakeIndexOrDie("5:5 # 6:6, 7:7 # 0:0, 0:90, 90:0"))));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
} // namespace
|
|
@@ -0,0 +1,350 @@
|
|
|
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
|
+
#ifndef S2_S2SHAPE_INDEX_REGION_H_
|
|
18
|
+
#define S2_S2SHAPE_INDEX_REGION_H_
|
|
19
|
+
|
|
20
|
+
#include <vector>
|
|
21
|
+
#include "s2/s2cap.h"
|
|
22
|
+
#include "s2/s2cell.h"
|
|
23
|
+
#include "s2/s2cell_union.h"
|
|
24
|
+
#include "s2/s2contains_point_query.h"
|
|
25
|
+
#include "s2/s2edge_clipping.h"
|
|
26
|
+
#include "s2/s2edge_crosser.h"
|
|
27
|
+
#include "s2/s2latlng_rect.h"
|
|
28
|
+
#include "s2/s2region.h"
|
|
29
|
+
#include "s2/s2shape_index.h"
|
|
30
|
+
|
|
31
|
+
// This class wraps an S2ShapeIndex object with the additional methods needed
|
|
32
|
+
// to implement the S2Region API, in order to allow S2RegionCoverer to compute
|
|
33
|
+
// S2CellId coverings of arbitrary collections of geometry.
|
|
34
|
+
//
|
|
35
|
+
// These methods could conceivably be made part of S2ShapeIndex itself, but
|
|
36
|
+
// there are several advantages to having a separate class:
|
|
37
|
+
//
|
|
38
|
+
// - The class can be templated in order to avoid virtual calls and memory
|
|
39
|
+
// allocation (for iterators) when the concrete S2ShapeIndex type is known.
|
|
40
|
+
//
|
|
41
|
+
// - Implementing these methods efficiently requires an S2ShapeIndex iterator,
|
|
42
|
+
// and this design allows a single iterator to be allocated and reused.
|
|
43
|
+
//
|
|
44
|
+
// - S2Region::Clone() is not a good fit for the S2ShapeIndex API because
|
|
45
|
+
// it can't be implemented for some subtypes (e.g., EncodedS2ShapeIndex).
|
|
46
|
+
//
|
|
47
|
+
// Example usage:
|
|
48
|
+
//
|
|
49
|
+
// S2CellUnion GetCovering(const S2ShapeIndex& index) {
|
|
50
|
+
// S2RegionCoverer coverer;
|
|
51
|
+
// coverer.mutable_options()->set_max_cells(20);
|
|
52
|
+
// S2CellUnion covering;
|
|
53
|
+
// coverer.GetCovering(MakeS2ShapeIndexRegion(&index), &covering);
|
|
54
|
+
// return covering;
|
|
55
|
+
// }
|
|
56
|
+
//
|
|
57
|
+
// This class is not thread-safe. To use it in parallel, each thread should
|
|
58
|
+
// construct its own instance (this is not expensive).
|
|
59
|
+
template <class IndexType>
|
|
60
|
+
class S2ShapeIndexRegion final : public S2Region {
|
|
61
|
+
public:
|
|
62
|
+
// Rather than calling this constructor, which requires specifying the
|
|
63
|
+
// S2ShapeIndex type explicitly, the preferred idiom is to call
|
|
64
|
+
// MakeS2ShapeIndexRegion(&index) instead. For example:
|
|
65
|
+
//
|
|
66
|
+
// coverer.GetCovering(MakeS2ShapeIndexRegion(&index), &covering);
|
|
67
|
+
explicit S2ShapeIndexRegion(const IndexType* index);
|
|
68
|
+
|
|
69
|
+
const IndexType& index() const;
|
|
70
|
+
|
|
71
|
+
////////////////////////////////////////////////////////////////////////
|
|
72
|
+
// S2Region interface (see s2region.h for details):
|
|
73
|
+
|
|
74
|
+
// Clone() returns a *shallow* copy; it does not make a copy of the
|
|
75
|
+
// underlying S2ShapeIndex.
|
|
76
|
+
S2ShapeIndexRegion<IndexType>* Clone() const override;
|
|
77
|
+
|
|
78
|
+
S2Cap GetCapBound() const override;
|
|
79
|
+
S2LatLngRect GetRectBound() const override;
|
|
80
|
+
|
|
81
|
+
// This method currently returns at most 4 cells, unless the index spans
|
|
82
|
+
// multiple faces in which case it may return up to 6 cells.
|
|
83
|
+
void GetCellUnionBound(std::vector<S2CellId> *cell_ids) const override;
|
|
84
|
+
|
|
85
|
+
// Returns true if "target" is contained by any single shape. If the cell
|
|
86
|
+
// is covered by a union of different shapes then it may return false.
|
|
87
|
+
//
|
|
88
|
+
// The implementation is conservative but not exact; if a shape just barely
|
|
89
|
+
// contains the given cell then it may return false. The maximum error is
|
|
90
|
+
// less than 10 * DBL_EPSILON radians (or about 15 nanometers).
|
|
91
|
+
bool Contains(const S2Cell& target) const override;
|
|
92
|
+
|
|
93
|
+
// Returns true if any shape intersects "target".
|
|
94
|
+
//
|
|
95
|
+
// The implementation is conservative but not exact; if a shape is just
|
|
96
|
+
// barely disjoint from the given cell then it may return true. The maximum
|
|
97
|
+
// error is less than 10 * DBL_EPSILON radians (or about 15 nanometers).
|
|
98
|
+
bool MayIntersect(const S2Cell& target) const override;
|
|
99
|
+
|
|
100
|
+
// Returns true if the given point is contained by any two-dimensional shape
|
|
101
|
+
// (i.e., polygon). Boundaries are treated as being semi-open (i.e., the
|
|
102
|
+
// same rules as S2Polygon). Zero and one-dimensional shapes are ignored by
|
|
103
|
+
// this method (if you need more flexibility, see S2BooleanOperation).
|
|
104
|
+
bool Contains(const S2Point& p) const override;
|
|
105
|
+
|
|
106
|
+
private:
|
|
107
|
+
using Iterator = typename IndexType::Iterator;
|
|
108
|
+
|
|
109
|
+
static void CoverRange(S2CellId first, S2CellId last,
|
|
110
|
+
std::vector<S2CellId> *cell_ids);
|
|
111
|
+
|
|
112
|
+
// Returns true if the indexed shape "clipped" in the indexed cell "id"
|
|
113
|
+
// contains the point "p".
|
|
114
|
+
//
|
|
115
|
+
// REQUIRES: id.contains(S2CellId(p))
|
|
116
|
+
bool Contains(S2CellId id, const S2ClippedShape& clipped,
|
|
117
|
+
const S2Point& p) const;
|
|
118
|
+
|
|
119
|
+
// Returns true if any edge of the indexed shape "clipped" intersects the
|
|
120
|
+
// cell "target". It may also return true if an edge is very close to
|
|
121
|
+
// "target"; the maximum error is less than 10 * DBL_EPSILON radians (about
|
|
122
|
+
// 15 nanometers).
|
|
123
|
+
bool AnyEdgeIntersects(const S2ClippedShape& clipped,
|
|
124
|
+
const S2Cell& target) const;
|
|
125
|
+
|
|
126
|
+
// This class is not thread-safe!
|
|
127
|
+
mutable S2ContainsPointQuery<IndexType> contains_query_;
|
|
128
|
+
|
|
129
|
+
// Optimization: rather than declaring our own iterator, instead we reuse
|
|
130
|
+
// the iterator declared by S2ContainsPointQuery. (This improves benchmark
|
|
131
|
+
// times significantly for classes that create a new S2ShapeIndexRegion
|
|
132
|
+
// object on every call to Contains/MayIntersect(S2Cell).
|
|
133
|
+
Iterator& iter_ = *contains_query_.mutable_iter();
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
// Returns an S2ShapeIndexRegion that wraps the given S2ShapeIndex. Note that
|
|
137
|
+
// it is efficient to return S2ShapeIndexRegion objects by value.
|
|
138
|
+
template <class IndexType>
|
|
139
|
+
S2ShapeIndexRegion<IndexType> MakeS2ShapeIndexRegion(const IndexType* index);
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
////////////////// Implementation details follow ////////////////////
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
template <class IndexType>
|
|
146
|
+
S2ShapeIndexRegion<IndexType>::S2ShapeIndexRegion(const IndexType* index)
|
|
147
|
+
: contains_query_(index) {
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
template <class IndexType>
|
|
151
|
+
inline const IndexType& S2ShapeIndexRegion<IndexType>::index() const {
|
|
152
|
+
return contains_query_.index();
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
template <class IndexType>
|
|
156
|
+
S2ShapeIndexRegion<IndexType>* S2ShapeIndexRegion<IndexType>::Clone() const {
|
|
157
|
+
return new S2ShapeIndexRegion<IndexType>(&index());
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
template <class IndexType>
|
|
161
|
+
S2Cap S2ShapeIndexRegion<IndexType>::GetCapBound() const {
|
|
162
|
+
std::vector<S2CellId> covering;
|
|
163
|
+
GetCellUnionBound(&covering);
|
|
164
|
+
return S2CellUnion(std::move(covering)).GetCapBound();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
template <class IndexType>
|
|
168
|
+
S2LatLngRect S2ShapeIndexRegion<IndexType>::GetRectBound() const {
|
|
169
|
+
std::vector<S2CellId> covering;
|
|
170
|
+
GetCellUnionBound(&covering);
|
|
171
|
+
return S2CellUnion(std::move(covering)).GetRectBound();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
template <class IndexType>
|
|
175
|
+
void S2ShapeIndexRegion<IndexType>::GetCellUnionBound(
|
|
176
|
+
std::vector<S2CellId> *cell_ids) const {
|
|
177
|
+
// We find the range of S2Cells spanned by the index and choose a level such
|
|
178
|
+
// that the entire index can be covered with just a few cells. There are
|
|
179
|
+
// two cases:
|
|
180
|
+
//
|
|
181
|
+
// - If the index intersects two or more faces, then for each intersected
|
|
182
|
+
// face we add one cell to the covering. Rather than adding the entire
|
|
183
|
+
// face, instead we add the smallest S2Cell that covers the S2ShapeIndex
|
|
184
|
+
// cells within that face.
|
|
185
|
+
//
|
|
186
|
+
// - If the index intersects only one face, then we first find the smallest
|
|
187
|
+
// cell S that contains the index cells (just like the case above).
|
|
188
|
+
// However rather than using the cell S itself, instead we repeat this
|
|
189
|
+
// process for each of its child cells. In other words, for each
|
|
190
|
+
// child cell C we add the smallest S2Cell C' that covers the index cells
|
|
191
|
+
// within C. This extra step is relatively cheap and produces much
|
|
192
|
+
// tighter coverings when the S2ShapeIndex consists of a small region
|
|
193
|
+
// near the center of a large S2Cell.
|
|
194
|
+
//
|
|
195
|
+
// The following code uses only a single Iterator object because creating an
|
|
196
|
+
// Iterator may be relatively expensive for some S2ShapeIndex types (e.g.,
|
|
197
|
+
// it may involve memory allocation).
|
|
198
|
+
cell_ids->clear();
|
|
199
|
+
cell_ids->reserve(6);
|
|
200
|
+
|
|
201
|
+
// Find the last S2CellId in the index.
|
|
202
|
+
iter_.Finish();
|
|
203
|
+
if (!iter_.Prev()) return; // Empty index.
|
|
204
|
+
const S2CellId last_index_id = iter_.id();
|
|
205
|
+
iter_.Begin();
|
|
206
|
+
if (iter_.id() != last_index_id) {
|
|
207
|
+
// The index has at least two cells. Choose an S2CellId level such that
|
|
208
|
+
// the entire index can be spanned with at most 6 cells (if the index
|
|
209
|
+
// spans multiple faces) or 4 cells (it the index spans a single face).
|
|
210
|
+
int level = iter_.id().GetCommonAncestorLevel(last_index_id) + 1;
|
|
211
|
+
|
|
212
|
+
// For each cell C at the chosen level, we compute the smallest S2Cell
|
|
213
|
+
// that covers the S2ShapeIndex cells within C.
|
|
214
|
+
const S2CellId last_id = last_index_id.parent(level);
|
|
215
|
+
for (auto id = iter_.id().parent(level); id != last_id; id = id.next()) {
|
|
216
|
+
// If the cell C does not contain any index cells, then skip it.
|
|
217
|
+
if (id.range_max() < iter_.id()) continue;
|
|
218
|
+
|
|
219
|
+
// Find the range of index cells contained by C and then shrink C so
|
|
220
|
+
// that it just covers those cells.
|
|
221
|
+
S2CellId first = iter_.id();
|
|
222
|
+
iter_.Seek(id.range_max().next());
|
|
223
|
+
iter_.Prev();
|
|
224
|
+
CoverRange(first, iter_.id(), cell_ids);
|
|
225
|
+
iter_.Next();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
CoverRange(iter_.id(), last_index_id, cell_ids);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Computes the smallest S2Cell that covers the S2Cell range (first, last) and
|
|
232
|
+
// adds this cell to "cell_ids".
|
|
233
|
+
//
|
|
234
|
+
// REQUIRES: "first" and "last" have a common ancestor.
|
|
235
|
+
template <class IndexType>
|
|
236
|
+
inline void S2ShapeIndexRegion<IndexType>::CoverRange(
|
|
237
|
+
S2CellId first, S2CellId last, std::vector<S2CellId> *cell_ids) {
|
|
238
|
+
if (first == last) {
|
|
239
|
+
// The range consists of a single index cell.
|
|
240
|
+
cell_ids->push_back(first);
|
|
241
|
+
} else {
|
|
242
|
+
// Add the lowest common ancestor of the given range.
|
|
243
|
+
int level = first.GetCommonAncestorLevel(last);
|
|
244
|
+
S2_DCHECK_GE(level, 0);
|
|
245
|
+
cell_ids->push_back(first.parent(level));
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
template <class IndexType>
|
|
250
|
+
bool S2ShapeIndexRegion<IndexType>::Contains(const S2Cell& target) const {
|
|
251
|
+
S2ShapeIndex::CellRelation relation = iter_.Locate(target.id());
|
|
252
|
+
|
|
253
|
+
// If the relation is DISJOINT, then "target" is not contained. Similarly if
|
|
254
|
+
// the relation is SUBDIVIDED then "target" is not contained, since index
|
|
255
|
+
// cells are subdivided only if they (nearly) intersect too many edges.
|
|
256
|
+
if (relation != S2ShapeIndex::INDEXED) return false;
|
|
257
|
+
|
|
258
|
+
// Otherwise, the iterator points to an index cell containing "target".
|
|
259
|
+
// If any shape contains the target cell, we return true.
|
|
260
|
+
S2_DCHECK(iter_.id().contains(target.id()));
|
|
261
|
+
const S2ShapeIndexCell& cell = iter_.cell();
|
|
262
|
+
for (int s = 0; s < cell.num_clipped(); ++s) {
|
|
263
|
+
const S2ClippedShape& clipped = cell.clipped(s);
|
|
264
|
+
// The shape contains the target cell iff the shape contains the cell
|
|
265
|
+
// center and none of its edges intersects the (padded) cell interior.
|
|
266
|
+
if (iter_.id() == target.id()) {
|
|
267
|
+
if (clipped.num_edges() == 0 && clipped.contains_center()) return true;
|
|
268
|
+
} else {
|
|
269
|
+
// It is faster to call AnyEdgeIntersects() before Contains().
|
|
270
|
+
if (index().shape(clipped.shape_id())->dimension() == 2 &&
|
|
271
|
+
!AnyEdgeIntersects(clipped, target) &&
|
|
272
|
+
contains_query_.ShapeContains(iter_, clipped, target.GetCenter())) {
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
template <class IndexType>
|
|
281
|
+
bool S2ShapeIndexRegion<IndexType>::MayIntersect(const S2Cell& target) const {
|
|
282
|
+
S2ShapeIndex::CellRelation relation = iter_.Locate(target.id());
|
|
283
|
+
|
|
284
|
+
// If "target" does not overlap any index cell, there is no intersection.
|
|
285
|
+
if (relation == S2ShapeIndex::DISJOINT) return false;
|
|
286
|
+
|
|
287
|
+
// If "target" is subdivided into one or more index cells, then there is an
|
|
288
|
+
// intersection to within the S2ShapeIndex error bound.
|
|
289
|
+
if (relation == S2ShapeIndex::SUBDIVIDED) return true;
|
|
290
|
+
|
|
291
|
+
// Otherwise, the iterator points to an index cell containing "target".
|
|
292
|
+
//
|
|
293
|
+
// If "target" is an index cell itself, there is an intersection because index
|
|
294
|
+
// cells are created only if they have at least one edge or they are
|
|
295
|
+
// entirely contained by the loop.
|
|
296
|
+
S2_DCHECK(iter_.id().contains(target.id()));
|
|
297
|
+
if (iter_.id() == target.id()) return true;
|
|
298
|
+
|
|
299
|
+
// Test whether any shape intersects the target cell or contains its center.
|
|
300
|
+
const S2ShapeIndexCell& cell = iter_.cell();
|
|
301
|
+
for (int s = 0; s < cell.num_clipped(); ++s) {
|
|
302
|
+
const S2ClippedShape& clipped = cell.clipped(s);
|
|
303
|
+
if (AnyEdgeIntersects(clipped, target)) return true;
|
|
304
|
+
if (contains_query_.ShapeContains(iter_, clipped, target.GetCenter())) {
|
|
305
|
+
return true;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
template <class IndexType>
|
|
312
|
+
bool S2ShapeIndexRegion<IndexType>::Contains(const S2Point& p) const {
|
|
313
|
+
if (iter_.Locate(p)) {
|
|
314
|
+
const S2ShapeIndexCell& cell = iter_.cell();
|
|
315
|
+
for (int s = 0; s < cell.num_clipped(); ++s) {
|
|
316
|
+
if (contains_query_.ShapeContains(iter_, cell.clipped(s), p)) {
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
template <class IndexType>
|
|
325
|
+
bool S2ShapeIndexRegion<IndexType>::AnyEdgeIntersects(
|
|
326
|
+
const S2ClippedShape& clipped, const S2Cell& target) const {
|
|
327
|
+
static const double kMaxError = (S2::kFaceClipErrorUVCoord +
|
|
328
|
+
S2::kIntersectsRectErrorUVDist);
|
|
329
|
+
const R2Rect bound = target.GetBoundUV().Expanded(kMaxError);
|
|
330
|
+
const int face = target.face();
|
|
331
|
+
const S2Shape& shape = *index().shape(clipped.shape_id());
|
|
332
|
+
const int num_edges = clipped.num_edges();
|
|
333
|
+
for (int i = 0; i < num_edges; ++i) {
|
|
334
|
+
const auto edge = shape.edge(clipped.edge(i));
|
|
335
|
+
R2Point p0, p1;
|
|
336
|
+
if (S2::ClipToPaddedFace(edge.v0, edge.v1, face, kMaxError, &p0, &p1) &&
|
|
337
|
+
S2::IntersectsRect(p0, p1, bound)) {
|
|
338
|
+
return true;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return false;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
template <class IndexType>
|
|
345
|
+
inline S2ShapeIndexRegion<IndexType> MakeS2ShapeIndexRegion(
|
|
346
|
+
const IndexType* index) {
|
|
347
|
+
return S2ShapeIndexRegion<IndexType>(index);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
#endif // S2_S2SHAPE_INDEX_REGION_H_
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
// Copyright 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
|
+
#include "s2/s2shape_index_region.h"
|
|
17
|
+
|
|
18
|
+
#include <algorithm>
|
|
19
|
+
#include <gtest/gtest.h>
|
|
20
|
+
#include "s2/mutable_s2shape_index.h"
|
|
21
|
+
#include "s2/s2lax_loop_shape.h"
|
|
22
|
+
|
|
23
|
+
using std::vector;
|
|
24
|
+
|
|
25
|
+
namespace {
|
|
26
|
+
|
|
27
|
+
S2CellId MakeCellId(const string& str) {
|
|
28
|
+
return S2CellId::FromDebugString(str);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Pad by at least twice the maximum error for reliable results.
|
|
32
|
+
static const double kPadding = 2 * (S2::kFaceClipErrorUVCoord +
|
|
33
|
+
S2::kIntersectsRectErrorUVDist);
|
|
34
|
+
|
|
35
|
+
std::unique_ptr<S2Shape> NewPaddedCell(S2CellId id, double padding_uv) {
|
|
36
|
+
int ij[2], orientation;
|
|
37
|
+
int face = id.ToFaceIJOrientation(&ij[0], &ij[1], &orientation);
|
|
38
|
+
R2Rect uv = S2CellId::IJLevelToBoundUV(ij, id.level()).Expanded(padding_uv);
|
|
39
|
+
vector<S2Point> vertices(4);
|
|
40
|
+
for (int i = 0; i < 4; ++i) {
|
|
41
|
+
vertices[i] = S2::FaceUVtoXYZ(face, uv.GetVertex(i)).Normalize();
|
|
42
|
+
}
|
|
43
|
+
return absl::make_unique<S2LaxLoopShape>(vertices);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
TEST(S2ShapeIndexRegion, GetCapBound) {
|
|
47
|
+
auto id = S2CellId::FromDebugString("3/0123012301230123012301230123");
|
|
48
|
+
|
|
49
|
+
// Add a polygon that is slightly smaller than the cell being tested.
|
|
50
|
+
MutableS2ShapeIndex index;
|
|
51
|
+
index.Add(NewPaddedCell(id, -kPadding));
|
|
52
|
+
S2Cap cell_bound = S2Cell(id).GetCapBound();
|
|
53
|
+
S2Cap index_bound = MakeS2ShapeIndexRegion(&index).GetCapBound();
|
|
54
|
+
EXPECT_TRUE(index_bound.Contains(cell_bound));
|
|
55
|
+
|
|
56
|
+
// Note that S2CellUnion::GetCapBound returns a slightly larger bound than
|
|
57
|
+
// S2Cell::GetBound even when the cell union consists of a single S2CellId.
|
|
58
|
+
EXPECT_LE(index_bound.GetRadius(), 1.00001 * cell_bound.GetRadius());
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
TEST(S2ShapeIndexRegion, GetRectBound) {
|
|
62
|
+
auto id = S2CellId::FromDebugString("3/0123012301230123012301230123");
|
|
63
|
+
|
|
64
|
+
// Add a polygon that is slightly smaller than the cell being tested.
|
|
65
|
+
MutableS2ShapeIndex index;
|
|
66
|
+
index.Add(NewPaddedCell(id, -kPadding));
|
|
67
|
+
S2LatLngRect cell_bound = S2Cell(id).GetRectBound();
|
|
68
|
+
S2LatLngRect index_bound = MakeS2ShapeIndexRegion(&index).GetRectBound();
|
|
69
|
+
EXPECT_EQ(index_bound, cell_bound);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
TEST(S2ShapeIndexRegion, GetCellUnionBoundMultipleFaces) {
|
|
73
|
+
vector<S2CellId> ids = { MakeCellId("3/00123"), MakeCellId("2/11200013") };
|
|
74
|
+
MutableS2ShapeIndex index;
|
|
75
|
+
for (auto id : ids) index.Add(NewPaddedCell(id, -kPadding));
|
|
76
|
+
vector<S2CellId> covering;
|
|
77
|
+
MakeS2ShapeIndexRegion(&index).GetCellUnionBound(&covering);
|
|
78
|
+
std::sort(ids.begin(), ids.end());
|
|
79
|
+
EXPECT_EQ(ids, covering);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
TEST(S2ShapeIndexRegion, GetCellUnionBoundOneFace) {
|
|
83
|
+
// This tests consists of 3 pairs of S2CellIds. Each pair is located within
|
|
84
|
+
// one of the children of face 5, namely the cells 5/0, 5/1, and 5/3.
|
|
85
|
+
// We expect GetCellUnionBound to compute the smallest cell that bounds the
|
|
86
|
+
// pair on each face.
|
|
87
|
+
vector<S2CellId> input = {
|
|
88
|
+
MakeCellId("5/010"), MakeCellId("5/0211030"),
|
|
89
|
+
MakeCellId("5/110230123"), MakeCellId("5/11023021133"),
|
|
90
|
+
MakeCellId("5/311020003003030303"), MakeCellId("5/311020023"),
|
|
91
|
+
};
|
|
92
|
+
vector<S2CellId> expected = {
|
|
93
|
+
MakeCellId("5/0"), MakeCellId("5/110230"), MakeCellId("5/3110200")
|
|
94
|
+
};
|
|
95
|
+
MutableS2ShapeIndex index;
|
|
96
|
+
for (auto id : input) {
|
|
97
|
+
// Add each shape 3 times to ensure that the S2ShapeIndex subdivides.
|
|
98
|
+
for (int copy = 0; copy < 3; ++copy) {
|
|
99
|
+
index.Add(NewPaddedCell(id, -kPadding));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
vector<S2CellId> actual;
|
|
103
|
+
MakeS2ShapeIndexRegion(&index).GetCellUnionBound(&actual);
|
|
104
|
+
EXPECT_EQ(expected, actual);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
TEST(S2ShapeIndexRegion, ContainsCellMultipleShapes) {
|
|
108
|
+
auto id = S2CellId::FromDebugString("3/0123012301230123012301230123");
|
|
109
|
+
|
|
110
|
+
// Add a polygon that is slightly smaller than the cell being tested.
|
|
111
|
+
MutableS2ShapeIndex index;
|
|
112
|
+
index.Add(NewPaddedCell(id, -kPadding));
|
|
113
|
+
EXPECT_FALSE(MakeS2ShapeIndexRegion(&index).Contains(S2Cell(id)));
|
|
114
|
+
|
|
115
|
+
// Add a second polygon that is slightly larger than the cell being tested.
|
|
116
|
+
// Note that Contains() should return true if *any* shape contains the cell.
|
|
117
|
+
index.Add(NewPaddedCell(id, kPadding));
|
|
118
|
+
EXPECT_TRUE(MakeS2ShapeIndexRegion(&index).Contains(S2Cell(id)));
|
|
119
|
+
|
|
120
|
+
// Verify that all children of the cell are also contained.
|
|
121
|
+
for (S2CellId child = id.child_begin();
|
|
122
|
+
child != id.child_end(); child = child.next()) {
|
|
123
|
+
EXPECT_TRUE(MakeS2ShapeIndexRegion(&index).Contains(S2Cell(child)));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
TEST(S2ShapeIndexRegion, IntersectsShrunkenCell) {
|
|
128
|
+
auto target = S2CellId::FromDebugString("3/0123012301230123012301230123");
|
|
129
|
+
|
|
130
|
+
// Add a polygon that is slightly smaller than the cell being tested.
|
|
131
|
+
MutableS2ShapeIndex index;
|
|
132
|
+
index.Add(NewPaddedCell(target, -kPadding));
|
|
133
|
+
auto region = MakeS2ShapeIndexRegion(&index);
|
|
134
|
+
|
|
135
|
+
// Check that the index intersects the cell itself, but not any of the
|
|
136
|
+
// neighboring cells.
|
|
137
|
+
EXPECT_TRUE(region.MayIntersect(S2Cell(target)));
|
|
138
|
+
vector<S2CellId> nbrs;
|
|
139
|
+
target.AppendAllNeighbors(target.level(), &nbrs);
|
|
140
|
+
for (S2CellId id : nbrs) {
|
|
141
|
+
EXPECT_FALSE(region.MayIntersect(S2Cell(id)));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
TEST(S2ShapeIndexRegion, IntersectsExactCell) {
|
|
146
|
+
auto target = S2CellId::FromDebugString("3/0123012301230123012301230123");
|
|
147
|
+
|
|
148
|
+
// Adds a polygon that exactly follows a cell boundary.
|
|
149
|
+
MutableS2ShapeIndex index;
|
|
150
|
+
index.Add(NewPaddedCell(target, 0.0));
|
|
151
|
+
auto region = MakeS2ShapeIndexRegion(&index);
|
|
152
|
+
|
|
153
|
+
// Check that the index intersects the cell and all of its neighbors.
|
|
154
|
+
vector<S2CellId> ids = {target};
|
|
155
|
+
target.AppendAllNeighbors(target.level(), &ids);
|
|
156
|
+
for (S2CellId id : ids) {
|
|
157
|
+
EXPECT_TRUE(region.MayIntersect(S2Cell(id)));
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
} // namespace
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Copyright 2012 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/s2shape_index.h"
|
|
19
|
+
|
|
20
|
+
#include <gtest/gtest.h>
|
|
21
|
+
|
|
22
|
+
// TODO(ericv): Add tests for S2ShapeIndexCell and S2ClippedShape.
|
|
23
|
+
// (Currently these are tested indirectly by MutableS2ShapeIndex.)
|
|
24
|
+
// Also test the base Iterator type (which wraps another iterator).
|