@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,142 @@
|
|
|
1
|
+
// Copyright 2005 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_S2REGION_H_
|
|
19
|
+
#define S2_S2REGION_H_
|
|
20
|
+
|
|
21
|
+
#include <vector>
|
|
22
|
+
|
|
23
|
+
#include "s2/_fp_contract_off.h"
|
|
24
|
+
#include "s2/s1angle.h"
|
|
25
|
+
|
|
26
|
+
class Decoder;
|
|
27
|
+
class Encoder;
|
|
28
|
+
|
|
29
|
+
class S2Cap;
|
|
30
|
+
class S2Cell;
|
|
31
|
+
class S2CellId;
|
|
32
|
+
class S2LatLngRect;
|
|
33
|
+
|
|
34
|
+
// An S2Region represents a two-dimensional region over the unit sphere.
|
|
35
|
+
// It is an abstract interface with various concrete subtypes.
|
|
36
|
+
//
|
|
37
|
+
// The main purpose of this interface is to allow complex regions to be
|
|
38
|
+
// approximated as simpler regions. So rather than having a wide variety
|
|
39
|
+
// of virtual methods that are implemented by all subtypes, the interface
|
|
40
|
+
// is restricted to methods that are useful for computing approximations.
|
|
41
|
+
class S2Region {
|
|
42
|
+
public:
|
|
43
|
+
S2Region() = default;
|
|
44
|
+
S2Region(const S2Region& other) = default;
|
|
45
|
+
S2Region& operator=(const S2Region&) = default;
|
|
46
|
+
virtual ~S2Region() {}
|
|
47
|
+
|
|
48
|
+
// Returns a deep copy of the region.
|
|
49
|
+
//
|
|
50
|
+
// Note that each subtype of S2Region returns a pointer to an object of its
|
|
51
|
+
// own type (e.g., S2Cap::Clone() returns an S2Cap*).
|
|
52
|
+
virtual S2Region* Clone() const = 0;
|
|
53
|
+
|
|
54
|
+
// Returns a bounding spherical cap that contains the region. The bound may
|
|
55
|
+
// not be tight.
|
|
56
|
+
virtual S2Cap GetCapBound() const = 0;
|
|
57
|
+
|
|
58
|
+
// Returns a bounding latitude-longitude rectangle that contains the region.
|
|
59
|
+
// The bound may not be tight.
|
|
60
|
+
virtual S2LatLngRect GetRectBound() const = 0;
|
|
61
|
+
|
|
62
|
+
// Returns a small collection of S2CellIds whose union covers the region.
|
|
63
|
+
// The cells are not sorted, may have redundancies (such as cells that
|
|
64
|
+
// contain other cells), and may cover much more area than necessary.
|
|
65
|
+
//
|
|
66
|
+
// This method is not intended for direct use by client code. Clients
|
|
67
|
+
// should typically use S2RegionCoverer::GetCovering, which has options to
|
|
68
|
+
// control the size and accuracy of the covering. Alternatively, if you
|
|
69
|
+
// want a fast covering and don't care about accuracy, consider calling
|
|
70
|
+
// S2RegionCoverer::GetFastCovering (which returns a cleaned-up version of
|
|
71
|
+
// the covering computed by this method).
|
|
72
|
+
//
|
|
73
|
+
// GetCellUnionBound() implementations should attempt to return a small
|
|
74
|
+
// covering (ideally 4 cells or fewer) that covers the region and can be
|
|
75
|
+
// computed quickly. The result is used by S2RegionCoverer as a starting
|
|
76
|
+
// point for further refinement.
|
|
77
|
+
//
|
|
78
|
+
// TODO(ericv): Remove the default implementation.
|
|
79
|
+
virtual void GetCellUnionBound(std::vector<S2CellId> *cell_ids) const;
|
|
80
|
+
|
|
81
|
+
// Returns true if the region completely contains the given cell, otherwise
|
|
82
|
+
// returns false.
|
|
83
|
+
virtual bool Contains(const S2Cell& cell) const = 0;
|
|
84
|
+
|
|
85
|
+
// If this method returns false, the region does not intersect the given
|
|
86
|
+
// cell. Otherwise, either region intersects the cell, or the intersection
|
|
87
|
+
// relationship could not be determined.
|
|
88
|
+
//
|
|
89
|
+
// Note that there is currently exactly one implementation of this method
|
|
90
|
+
// (S2LatLngRect::MayIntersect) that takes advantage of the semantics above
|
|
91
|
+
// to be more efficient. For all other S2Region subtypes, this method
|
|
92
|
+
// returns true if the region intersect the cell and false otherwise.
|
|
93
|
+
virtual bool MayIntersect(const S2Cell& cell) const = 0;
|
|
94
|
+
|
|
95
|
+
// Returns true if and only if the given point is contained by the region.
|
|
96
|
+
// The point 'p' is generally required to be unit length, although some
|
|
97
|
+
// subtypes may relax this restriction.
|
|
98
|
+
virtual bool Contains(const S2Point& p) const = 0;
|
|
99
|
+
|
|
100
|
+
//////////////////////////////////////////////////////////////////////////
|
|
101
|
+
// Many S2Region subtypes also define the following non-virtual methods.
|
|
102
|
+
//////////////////////////////////////////////////////////////////////////
|
|
103
|
+
|
|
104
|
+
// Appends a serialized representation of the region to "encoder".
|
|
105
|
+
//
|
|
106
|
+
// The representation chosen is left up to the sub-classes but it should
|
|
107
|
+
// satisfy the following constraints:
|
|
108
|
+
// - It should encode a version number.
|
|
109
|
+
// - It should be deserializable using the corresponding Decode method.
|
|
110
|
+
// - Performance, not space, should be the chief consideration. Encode() and
|
|
111
|
+
// Decode() should be implemented such that the combination is equivalent
|
|
112
|
+
// to calling Clone().
|
|
113
|
+
//
|
|
114
|
+
// REQUIRES: "encoder" uses the default constructor, so that its buffer
|
|
115
|
+
// can be enlarged as necessary by calling Ensure(int).
|
|
116
|
+
//
|
|
117
|
+
// void Encode(Encoder* const encoder) const;
|
|
118
|
+
|
|
119
|
+
// Decodes an S2Region encoded with Encode(). Note that this method
|
|
120
|
+
// requires that an S2Region object of the appropriate concrete type has
|
|
121
|
+
// already been constructed. It is not possible to decode regions of
|
|
122
|
+
// unknown type.
|
|
123
|
+
//
|
|
124
|
+
// Whenever the Decode method is changed to deal with new serialized
|
|
125
|
+
// representations, it should be done so in a manner that allows for
|
|
126
|
+
// older versions to be decoded i.e. the version number in the serialized
|
|
127
|
+
// representation should be used to decide how to decode the data.
|
|
128
|
+
//
|
|
129
|
+
// Returns true on success.
|
|
130
|
+
//
|
|
131
|
+
// bool Decode(Decoder* const decoder);
|
|
132
|
+
|
|
133
|
+
// Provides the same functionality as Decode, except that decoded regions
|
|
134
|
+
// are allowed to point directly into the Decoder's memory buffer rather
|
|
135
|
+
// than copying the data. This method can be much faster for regions that
|
|
136
|
+
// have a lot of data (such as polygons), but the decoded region is only
|
|
137
|
+
// valid within the scope (lifetime) of the Decoder's memory buffer.
|
|
138
|
+
//
|
|
139
|
+
// bool DecodeWithinScope(Decoder* const decoder);
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
#endif // S2_S2REGION_H_
|
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
// Copyright 2005 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/s2region_coverer.h"
|
|
19
|
+
|
|
20
|
+
#include <algorithm>
|
|
21
|
+
#include <cstddef>
|
|
22
|
+
#include <cstdlib>
|
|
23
|
+
#include <cstring>
|
|
24
|
+
#include <functional>
|
|
25
|
+
#include <queue>
|
|
26
|
+
#include <unordered_set>
|
|
27
|
+
#include <vector>
|
|
28
|
+
|
|
29
|
+
#include "s2/base/logging.h"
|
|
30
|
+
#include "s2/s1angle.h"
|
|
31
|
+
#include "s2/s2cap.h"
|
|
32
|
+
#include "s2/s2cell_union.h"
|
|
33
|
+
#include "s2/s2metrics.h"
|
|
34
|
+
#include "s2/s2region.h"
|
|
35
|
+
#include "s2/third_party/absl/base/casts.h"
|
|
36
|
+
|
|
37
|
+
using std::is_sorted;
|
|
38
|
+
using std::max;
|
|
39
|
+
using std::min;
|
|
40
|
+
using std::unordered_set;
|
|
41
|
+
using std::vector;
|
|
42
|
+
|
|
43
|
+
// Define storage for header file constants (the values are not needed here).
|
|
44
|
+
constexpr int S2RegionCoverer::Options::kDefaultMaxCells;
|
|
45
|
+
|
|
46
|
+
S2RegionCoverer::S2RegionCoverer(const S2RegionCoverer::Options& options) :
|
|
47
|
+
options_(options) {
|
|
48
|
+
S2_DCHECK_LE(options.min_level(), options.max_level());
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Defaulted in the implementation to prevent inline bloat.
|
|
52
|
+
S2RegionCoverer::S2RegionCoverer() = default;
|
|
53
|
+
S2RegionCoverer::~S2RegionCoverer() = default;
|
|
54
|
+
S2RegionCoverer::S2RegionCoverer(S2RegionCoverer&&) = default;
|
|
55
|
+
S2RegionCoverer& S2RegionCoverer::operator=(S2RegionCoverer&&) = default;
|
|
56
|
+
|
|
57
|
+
void S2RegionCoverer::Options::set_max_cells(int max_cells) {
|
|
58
|
+
max_cells_ = max_cells;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
void S2RegionCoverer::Options::set_min_level(int min_level) {
|
|
62
|
+
S2_DCHECK_GE(min_level, 0);
|
|
63
|
+
S2_DCHECK_LE(min_level, S2CellId::kMaxLevel);
|
|
64
|
+
// min_level() <= max_level() is checked by S2RegionCoverer.
|
|
65
|
+
min_level_ = max(0, min(S2CellId::kMaxLevel, min_level));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
void S2RegionCoverer::Options::set_max_level(int max_level) {
|
|
69
|
+
S2_DCHECK_GE(max_level, 0);
|
|
70
|
+
S2_DCHECK_LE(max_level, S2CellId::kMaxLevel);
|
|
71
|
+
// min_level() <= max_level() is checked by S2RegionCoverer.
|
|
72
|
+
max_level_ = max(0, min(S2CellId::kMaxLevel, max_level));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
void S2RegionCoverer::Options::set_fixed_level(int level) {
|
|
76
|
+
set_min_level(level);
|
|
77
|
+
set_max_level(level);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
void S2RegionCoverer::Options::set_level_mod(int level_mod) {
|
|
81
|
+
S2_DCHECK_GE(level_mod, 1);
|
|
82
|
+
S2_DCHECK_LE(level_mod, 3);
|
|
83
|
+
level_mod_ = max(1, min(3, level_mod));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
int S2RegionCoverer::Options::true_max_level() const {
|
|
87
|
+
if (level_mod_ == 1) return max_level_;
|
|
88
|
+
return max_level_ - (max_level_ - min_level_) % level_mod_;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
S2RegionCoverer::Candidate* S2RegionCoverer::NewCandidate(const S2Cell& cell) {
|
|
92
|
+
if (!region_->MayIntersect(cell)) return nullptr;
|
|
93
|
+
|
|
94
|
+
bool is_terminal = false;
|
|
95
|
+
if (cell.level() >= options_.min_level()) {
|
|
96
|
+
if (interior_covering_) {
|
|
97
|
+
if (region_->Contains(cell)) {
|
|
98
|
+
is_terminal = true;
|
|
99
|
+
} else if (cell.level() + options_.level_mod() > options_.max_level()) {
|
|
100
|
+
return nullptr;
|
|
101
|
+
}
|
|
102
|
+
} else {
|
|
103
|
+
if (cell.level() + options_.level_mod() > options_.max_level() ||
|
|
104
|
+
region_->Contains(cell)) {
|
|
105
|
+
is_terminal = true;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
++candidates_created_counter_;
|
|
110
|
+
const std::size_t max_children = is_terminal ? 0 : 1 << max_children_shift();
|
|
111
|
+
return new (max_children) Candidate(cell, max_children);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
void S2RegionCoverer::DeleteCandidate(Candidate* candidate,
|
|
115
|
+
bool delete_children) {
|
|
116
|
+
if (delete_children) {
|
|
117
|
+
for (int i = 0; i < candidate->num_children; ++i)
|
|
118
|
+
DeleteCandidate(candidate->children[i], true);
|
|
119
|
+
}
|
|
120
|
+
delete candidate;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
int S2RegionCoverer::ExpandChildren(Candidate* candidate,
|
|
124
|
+
const S2Cell& cell, int num_levels) {
|
|
125
|
+
num_levels--;
|
|
126
|
+
S2Cell child_cells[4];
|
|
127
|
+
cell.Subdivide(child_cells);
|
|
128
|
+
int num_terminals = 0;
|
|
129
|
+
for (int i = 0; i < 4; ++i) {
|
|
130
|
+
if (num_levels > 0) {
|
|
131
|
+
if (region_->MayIntersect(child_cells[i])) {
|
|
132
|
+
num_terminals += ExpandChildren(candidate, child_cells[i], num_levels);
|
|
133
|
+
}
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
Candidate* child = NewCandidate(child_cells[i]);
|
|
137
|
+
if (child) {
|
|
138
|
+
candidate->children[candidate->num_children++] = child;
|
|
139
|
+
if (child->is_terminal) ++num_terminals;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return num_terminals;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
void S2RegionCoverer::AddCandidate(Candidate* candidate) {
|
|
146
|
+
if (candidate == nullptr) return;
|
|
147
|
+
|
|
148
|
+
if (candidate->is_terminal) {
|
|
149
|
+
result_.push_back(candidate->cell.id());
|
|
150
|
+
DeleteCandidate(candidate, true);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
S2_DCHECK_EQ(0, candidate->num_children);
|
|
154
|
+
|
|
155
|
+
// Expand one level at a time until we hit min_level() to ensure that we
|
|
156
|
+
// don't skip over it.
|
|
157
|
+
int num_levels = ((candidate->cell.level() < options_.min_level()) ?
|
|
158
|
+
1 : options_.level_mod());
|
|
159
|
+
int num_terminals = ExpandChildren(candidate, candidate->cell, num_levels);
|
|
160
|
+
|
|
161
|
+
if (candidate->num_children == 0) {
|
|
162
|
+
DeleteCandidate(candidate, false);
|
|
163
|
+
|
|
164
|
+
} else if (!interior_covering_ &&
|
|
165
|
+
num_terminals == 1 << max_children_shift() &&
|
|
166
|
+
candidate->cell.level() >= options_.min_level()) {
|
|
167
|
+
// Optimization: add the parent cell rather than all of its children.
|
|
168
|
+
// We can't do this for interior coverings, since the children just
|
|
169
|
+
// intersect the region, but may not be contained by it - we need to
|
|
170
|
+
// subdivide them further.
|
|
171
|
+
candidate->is_terminal = true;
|
|
172
|
+
AddCandidate(candidate);
|
|
173
|
+
|
|
174
|
+
} else {
|
|
175
|
+
// We negate the priority so that smaller absolute priorities are returned
|
|
176
|
+
// first. The heuristic is designed to refine the largest cells first,
|
|
177
|
+
// since those are where we have the largest potential gain. Among cells
|
|
178
|
+
// of the same size, we prefer the cells with the fewest children.
|
|
179
|
+
// Finally, among cells with equal numbers of children we prefer those
|
|
180
|
+
// with the smallest number of children that cannot be refined further.
|
|
181
|
+
int priority = -((((candidate->cell.level() << max_children_shift())
|
|
182
|
+
+ candidate->num_children) << max_children_shift())
|
|
183
|
+
+ num_terminals);
|
|
184
|
+
pq_.push(std::make_pair(priority, candidate));
|
|
185
|
+
S2_VLOG(2) << "Push: " << candidate->cell.id() << " (" << priority << ") ";
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
inline int S2RegionCoverer::AdjustLevel(int level) const {
|
|
190
|
+
if (options_.level_mod() > 1 && level > options_.min_level()) {
|
|
191
|
+
level -= (level - options_.min_level()) % options_.level_mod();
|
|
192
|
+
}
|
|
193
|
+
return level;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
void S2RegionCoverer::AdjustCellLevels(vector<S2CellId>* cells) const {
|
|
197
|
+
S2_DCHECK(is_sorted(cells->begin(), cells->end()));
|
|
198
|
+
if (options_.level_mod() == 1) return;
|
|
199
|
+
|
|
200
|
+
int out = 0;
|
|
201
|
+
for (S2CellId id : *cells) {
|
|
202
|
+
int level = id.level();
|
|
203
|
+
int new_level = AdjustLevel(level);
|
|
204
|
+
if (new_level != level) id = id.parent(new_level);
|
|
205
|
+
if (out > 0 && (*cells)[out-1].contains(id)) continue;
|
|
206
|
+
while (out > 0 && id.contains((*cells)[out-1])) --out;
|
|
207
|
+
(*cells)[out++] = id;
|
|
208
|
+
}
|
|
209
|
+
cells->resize(out);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
void S2RegionCoverer::GetInitialCandidates() {
|
|
213
|
+
// Optimization: start with a small (usually 4 cell) covering of the
|
|
214
|
+
// region's bounding cap.
|
|
215
|
+
S2RegionCoverer tmp_coverer;
|
|
216
|
+
tmp_coverer.mutable_options()->set_max_cells(min(4, options_.max_cells()));
|
|
217
|
+
tmp_coverer.mutable_options()->set_max_level(options_.max_level());
|
|
218
|
+
vector<S2CellId> cells;
|
|
219
|
+
tmp_coverer.GetFastCovering(*region_, &cells);
|
|
220
|
+
AdjustCellLevels(&cells);
|
|
221
|
+
for (S2CellId cell_id : cells) {
|
|
222
|
+
AddCandidate(NewCandidate(S2Cell(cell_id)));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
void S2RegionCoverer::GetCoveringInternal(const S2Region& region) {
|
|
227
|
+
// We check this on each call because of mutable_options().
|
|
228
|
+
S2_DCHECK_LE(options_.min_level(), options_.max_level());
|
|
229
|
+
|
|
230
|
+
// Strategy: Start with the 6 faces of the cube. Discard any
|
|
231
|
+
// that do not intersect the shape. Then repeatedly choose the
|
|
232
|
+
// largest cell that intersects the shape and subdivide it.
|
|
233
|
+
//
|
|
234
|
+
// result_ contains the cells that will be part of the output, while pq_
|
|
235
|
+
// contains cells that we may still subdivide further. Cells that are
|
|
236
|
+
// entirely contained within the region are immediately added to the output,
|
|
237
|
+
// while cells that do not intersect the region are immediately discarded.
|
|
238
|
+
// Therefore pq_ only contains cells that partially intersect the region.
|
|
239
|
+
// Candidates are prioritized first according to cell size (larger cells
|
|
240
|
+
// first), then by the number of intersecting children they have (fewest
|
|
241
|
+
// children first), and then by the number of fully contained children
|
|
242
|
+
// (fewest children first).
|
|
243
|
+
|
|
244
|
+
S2_DCHECK(pq_.empty());
|
|
245
|
+
S2_DCHECK(result_.empty());
|
|
246
|
+
region_ = ®ion;
|
|
247
|
+
candidates_created_counter_ = 0;
|
|
248
|
+
|
|
249
|
+
GetInitialCandidates();
|
|
250
|
+
while (!pq_.empty() &&
|
|
251
|
+
(!interior_covering_ || result_.size() < options_.max_cells())) {
|
|
252
|
+
Candidate* candidate = pq_.top().second;
|
|
253
|
+
pq_.pop();
|
|
254
|
+
S2_VLOG(2) << "Pop: " << candidate->cell.id();
|
|
255
|
+
// For interior coverings we keep subdividing no matter how many children
|
|
256
|
+
// the candidate has. If we reach max_cells() before expanding all
|
|
257
|
+
// children, we will just use some of them. For exterior coverings we
|
|
258
|
+
// cannot do this, because the result has to cover the whole region, so
|
|
259
|
+
// all children have to be used. The (candidate->num_children == 1) case
|
|
260
|
+
// takes care of the situation when we already have more than max_cells()
|
|
261
|
+
// in results (min_level is too high). Subdividing the candidate with one
|
|
262
|
+
// child does no harm in this case.
|
|
263
|
+
if (interior_covering_ ||
|
|
264
|
+
candidate->cell.level() < options_.min_level() ||
|
|
265
|
+
candidate->num_children == 1 ||
|
|
266
|
+
(result_.size() + pq_.size() + candidate->num_children <=
|
|
267
|
+
options_.max_cells())) {
|
|
268
|
+
// Expand this candidate into its children.
|
|
269
|
+
for (int i = 0; i < candidate->num_children; ++i) {
|
|
270
|
+
if (interior_covering_ && result_.size() >= options_.max_cells()) {
|
|
271
|
+
DeleteCandidate(candidate->children[i], true);
|
|
272
|
+
} else {
|
|
273
|
+
AddCandidate(candidate->children[i]);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
DeleteCandidate(candidate, false);
|
|
277
|
+
} else {
|
|
278
|
+
candidate->is_terminal = true;
|
|
279
|
+
AddCandidate(candidate);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
S2_VLOG(2) << "Created " << result_.size() << " cells, " <<
|
|
283
|
+
candidates_created_counter_ << " candidates created, " <<
|
|
284
|
+
pq_.size() << " left";
|
|
285
|
+
while (!pq_.empty()) {
|
|
286
|
+
DeleteCandidate(pq_.top().second, true);
|
|
287
|
+
pq_.pop();
|
|
288
|
+
}
|
|
289
|
+
region_ = nullptr;
|
|
290
|
+
|
|
291
|
+
// Rather than just returning the raw list of cell ids, we construct a cell
|
|
292
|
+
// union and then denormalize it. This has the effect of replacing four
|
|
293
|
+
// child cells with their parent whenever this does not violate the covering
|
|
294
|
+
// parameters specified (min_level, level_mod, etc). This significantly
|
|
295
|
+
// reduces the number of cells returned in many cases, and it is cheap
|
|
296
|
+
// compared to computing the covering in the first place.
|
|
297
|
+
S2CellUnion::Normalize(&result_);
|
|
298
|
+
if (options_.min_level() > 0 || options_.level_mod() > 1) {
|
|
299
|
+
auto result_copy = result_;
|
|
300
|
+
S2CellUnion::Denormalize(result_copy, options_.min_level(),
|
|
301
|
+
options_.level_mod(), &result_);
|
|
302
|
+
}
|
|
303
|
+
S2_DCHECK(IsCanonical(result_));
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
void S2RegionCoverer::GetCovering(const S2Region& region,
|
|
307
|
+
vector<S2CellId>* covering) {
|
|
308
|
+
interior_covering_ = false;
|
|
309
|
+
GetCoveringInternal(region);
|
|
310
|
+
*covering = std::move(result_);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
void S2RegionCoverer::GetInteriorCovering(const S2Region& region,
|
|
314
|
+
vector<S2CellId>* interior) {
|
|
315
|
+
interior_covering_ = true;
|
|
316
|
+
GetCoveringInternal(region);
|
|
317
|
+
*interior = std::move(result_);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
S2CellUnion S2RegionCoverer::GetCovering(const S2Region& region) {
|
|
321
|
+
interior_covering_ = false;
|
|
322
|
+
GetCoveringInternal(region);
|
|
323
|
+
return S2CellUnion::FromVerbatim(std::move(result_));
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
S2CellUnion S2RegionCoverer::GetInteriorCovering(const S2Region& region) {
|
|
327
|
+
interior_covering_ = true;
|
|
328
|
+
GetCoveringInternal(region);
|
|
329
|
+
return S2CellUnion::FromVerbatim(std::move(result_));
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
void S2RegionCoverer::GetFastCovering(const S2Region& region,
|
|
333
|
+
vector<S2CellId>* covering) {
|
|
334
|
+
region.GetCellUnionBound(covering);
|
|
335
|
+
CanonicalizeCovering(covering);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
bool S2RegionCoverer::IsCanonical(const S2CellUnion& covering) const {
|
|
339
|
+
return IsCanonical(covering.cell_ids());
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
bool S2RegionCoverer::IsCanonical(const vector<S2CellId>& covering) const {
|
|
343
|
+
// We check this on each call because of mutable_options().
|
|
344
|
+
S2_DCHECK_LE(options_.min_level(), options_.max_level());
|
|
345
|
+
|
|
346
|
+
const int min_level = options_.min_level();
|
|
347
|
+
const int max_level = options_.true_max_level();
|
|
348
|
+
const int level_mod = options_.level_mod();
|
|
349
|
+
const bool too_many_cells = covering.size() > options_.max_cells();
|
|
350
|
+
int same_parent_count = 1;
|
|
351
|
+
S2CellId prev_id = S2CellId::None();
|
|
352
|
+
for (const S2CellId id : covering) {
|
|
353
|
+
if (!id.is_valid()) return false;
|
|
354
|
+
|
|
355
|
+
// Check that the S2CellId level is acceptable.
|
|
356
|
+
const int level = id.level();
|
|
357
|
+
if (level < min_level || level > max_level) return false;
|
|
358
|
+
if (level_mod > 1 && (level - min_level) % level_mod != 0) return false;
|
|
359
|
+
|
|
360
|
+
if (prev_id != S2CellId::None()) {
|
|
361
|
+
// Check that cells are sorted and non-overlapping.
|
|
362
|
+
if (prev_id.range_max() >= id.range_min()) return false;
|
|
363
|
+
|
|
364
|
+
// If there are too many cells, check that no pair of adjacent cells
|
|
365
|
+
// could be replaced by an ancestor.
|
|
366
|
+
if (too_many_cells && id.GetCommonAncestorLevel(prev_id) >= min_level) {
|
|
367
|
+
return false;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Check that there are no sequences of (4 ** level_mod) cells that all
|
|
371
|
+
// have the same parent (considering only multiples of "level_mod").
|
|
372
|
+
int plevel = level - level_mod;
|
|
373
|
+
if (plevel < min_level || level != prev_id.level() ||
|
|
374
|
+
id.parent(plevel) != prev_id.parent(plevel)) {
|
|
375
|
+
same_parent_count = 1;
|
|
376
|
+
} else if (++same_parent_count == (1 << (2 * level_mod))) {
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
prev_id = id;
|
|
381
|
+
}
|
|
382
|
+
return true;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
bool S2RegionCoverer::ContainsAllChildren(const vector<S2CellId>& covering,
|
|
386
|
+
S2CellId id) const {
|
|
387
|
+
auto it = std::lower_bound(covering.begin(), covering.end(), id.range_min());
|
|
388
|
+
int level = id.level() + options_.level_mod();
|
|
389
|
+
for (S2CellId child = id.child_begin(level);
|
|
390
|
+
child != id.child_end(level); ++it, child = child.next()) {
|
|
391
|
+
if (it == covering.end() || *it != child) return false;
|
|
392
|
+
}
|
|
393
|
+
return true;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// Replaces all descendants of "id" in "covering" with "id".
|
|
397
|
+
// REQUIRES: "covering" contains at least one descendant of "id".
|
|
398
|
+
void S2RegionCoverer::ReplaceCellsWithAncestor(vector<S2CellId>* covering,
|
|
399
|
+
S2CellId id) const {
|
|
400
|
+
auto begin = std::lower_bound(covering->begin(), covering->end(),
|
|
401
|
+
id.range_min());
|
|
402
|
+
auto end = std::upper_bound(covering->begin(), covering->end(),
|
|
403
|
+
id.range_max());
|
|
404
|
+
S2_DCHECK(begin != end);
|
|
405
|
+
covering->erase(begin + 1, end);
|
|
406
|
+
*begin = id;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
S2CellUnion S2RegionCoverer::CanonicalizeCovering(const S2CellUnion& covering) {
|
|
410
|
+
vector<S2CellId> ids = covering.cell_ids();
|
|
411
|
+
CanonicalizeCovering(&ids);
|
|
412
|
+
return S2CellUnion(std::move(ids));
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
void S2RegionCoverer::CanonicalizeCovering(vector<S2CellId>* covering) {
|
|
416
|
+
// We check this on each call because of mutable_options().
|
|
417
|
+
S2_DCHECK_LE(options_.min_level(), options_.max_level());
|
|
418
|
+
|
|
419
|
+
// Note that when the covering parameters have their default values, almost
|
|
420
|
+
// all of the code in this function is skipped.
|
|
421
|
+
|
|
422
|
+
// If any cells are too small, or don't satisfy level_mod(), then replace
|
|
423
|
+
// them with ancestors.
|
|
424
|
+
if (options_.max_level() < S2CellId::kMaxLevel || options_.level_mod() > 1) {
|
|
425
|
+
for (S2CellId& id : *covering) {
|
|
426
|
+
int level = id.level();
|
|
427
|
+
int new_level = AdjustLevel(min(level, options_.max_level()));
|
|
428
|
+
if (new_level != level) {
|
|
429
|
+
id = id.parent(new_level);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// Sort the cells and simplify them.
|
|
435
|
+
S2CellUnion::Normalize(covering);
|
|
436
|
+
|
|
437
|
+
// Make sure that the covering satisfies min_level() and level_mod(),
|
|
438
|
+
// possibly at the expense of satisfying max_cells().
|
|
439
|
+
if (options_.min_level() > 0 || options_.level_mod() > 1) {
|
|
440
|
+
S2CellUnion::Denormalize(*covering, options_.min_level(),
|
|
441
|
+
options_.level_mod(), &result_);
|
|
442
|
+
*covering = std::move(result_);
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// If there are too many cells and the covering is very large, use the
|
|
446
|
+
// S2RegionCoverer to compute a new covering. (This avoids possible O(n^2)
|
|
447
|
+
// behavior of the simpler algorithm below.)
|
|
448
|
+
int64 excess = covering->size() - options_.max_cells();
|
|
449
|
+
if (excess <= 0 || IsCanonical(*covering)) {
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
if (excess * covering->size() > 10000) {
|
|
453
|
+
GetCovering(S2CellUnion(std::move(*covering)), covering);
|
|
454
|
+
} else {
|
|
455
|
+
// Repeatedly replace two adjacent cells in S2CellId order by their lowest
|
|
456
|
+
// common ancestor until the number of cells is acceptable.
|
|
457
|
+
while (covering->size() > options_.max_cells()) {
|
|
458
|
+
int best_index = -1, best_level = -1;
|
|
459
|
+
for (int i = 0; i + 1 < covering->size(); ++i) {
|
|
460
|
+
int level = (*covering)[i].GetCommonAncestorLevel((*covering)[i+1]);
|
|
461
|
+
level = AdjustLevel(level);
|
|
462
|
+
if (level > best_level) {
|
|
463
|
+
best_level = level;
|
|
464
|
+
best_index = i;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
if (best_level < options_.min_level()) break;
|
|
468
|
+
|
|
469
|
+
// Replace all cells contained by the new ancestor cell.
|
|
470
|
+
S2CellId id = (*covering)[best_index].parent(best_level);
|
|
471
|
+
ReplaceCellsWithAncestor(covering, id);
|
|
472
|
+
|
|
473
|
+
// Now repeatedly check whether all children of the parent cell are
|
|
474
|
+
// present, in which case we can replace those cells with their parent.
|
|
475
|
+
while (best_level > options_.min_level()) {
|
|
476
|
+
best_level -= options_.level_mod();
|
|
477
|
+
id = id.parent(best_level);
|
|
478
|
+
if (!ContainsAllChildren(*covering, id)) break;
|
|
479
|
+
ReplaceCellsWithAncestor(covering, id);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
S2_DCHECK(IsCanonical(*covering));
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
void S2RegionCoverer::FloodFill(const S2Region& region, S2CellId start,
|
|
487
|
+
vector<S2CellId>* output) {
|
|
488
|
+
unordered_set<S2CellId, S2CellIdHash> all;
|
|
489
|
+
vector<S2CellId> frontier;
|
|
490
|
+
output->clear();
|
|
491
|
+
all.insert(start);
|
|
492
|
+
frontier.push_back(start);
|
|
493
|
+
while (!frontier.empty()) {
|
|
494
|
+
S2CellId id = frontier.back();
|
|
495
|
+
frontier.pop_back();
|
|
496
|
+
if (!region.MayIntersect(S2Cell(id))) continue;
|
|
497
|
+
output->push_back(id);
|
|
498
|
+
|
|
499
|
+
S2CellId neighbors[4];
|
|
500
|
+
id.GetEdgeNeighbors(neighbors);
|
|
501
|
+
for (int edge = 0; edge < 4; ++edge) {
|
|
502
|
+
S2CellId nbr = neighbors[edge];
|
|
503
|
+
if (all.insert(nbr).second) {
|
|
504
|
+
frontier.push_back(nbr);
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
void S2RegionCoverer::GetSimpleCovering(
|
|
511
|
+
const S2Region& region, const S2Point& start,
|
|
512
|
+
int level, vector<S2CellId>* output) {
|
|
513
|
+
return FloodFill(region, S2CellId(start).parent(level), output);
|
|
514
|
+
}
|