@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,515 @@
|
|
|
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/s2cell_union.h"
|
|
19
|
+
|
|
20
|
+
#include <algorithm>
|
|
21
|
+
#include <vector>
|
|
22
|
+
|
|
23
|
+
#include "s2/base/integral_types.h"
|
|
24
|
+
#include "s2/base/logging.h"
|
|
25
|
+
#include "s2/s1angle.h"
|
|
26
|
+
#include "s2/s2cap.h"
|
|
27
|
+
#include "s2/s2cell.h"
|
|
28
|
+
#include "s2/s2cell_id.h"
|
|
29
|
+
#include "s2/s2latlng_rect.h"
|
|
30
|
+
#include "s2/s2metrics.h"
|
|
31
|
+
#include "s2/util/coding/coder.h"
|
|
32
|
+
|
|
33
|
+
using std::is_sorted;
|
|
34
|
+
using std::max;
|
|
35
|
+
using std::min;
|
|
36
|
+
using std::vector;
|
|
37
|
+
|
|
38
|
+
S2_DEFINE_int32(s2cell_union_decode_max_num_cells, 1000000,
|
|
39
|
+
"The maximum number of cells allowed by S2CellUnion::Decode");
|
|
40
|
+
|
|
41
|
+
static const unsigned char kCurrentLosslessEncodingVersionNumber = 1;
|
|
42
|
+
|
|
43
|
+
vector<S2CellId> S2CellUnion::ToS2CellIds(const vector<uint64>& ids) {
|
|
44
|
+
vector<S2CellId> cell_ids;
|
|
45
|
+
cell_ids.reserve(ids.size());
|
|
46
|
+
for (auto id : ids) cell_ids.push_back(S2CellId(id));
|
|
47
|
+
return cell_ids;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
S2CellUnion::S2CellUnion(const vector<uint64>& cell_ids)
|
|
51
|
+
: cell_ids_(ToS2CellIds(cell_ids)) {
|
|
52
|
+
Normalize();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
S2CellUnion S2CellUnion::WholeSphere() {
|
|
56
|
+
return S2CellUnion({S2CellId::FromFace(0), S2CellId::FromFace(1),
|
|
57
|
+
S2CellId::FromFace(2), S2CellId::FromFace(3),
|
|
58
|
+
S2CellId::FromFace(4), S2CellId::FromFace(5)});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
S2CellUnion S2CellUnion::FromMinMax(S2CellId min_id, S2CellId max_id) {
|
|
62
|
+
S2CellUnion result;
|
|
63
|
+
result.InitFromMinMax(min_id, max_id);
|
|
64
|
+
return result;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
S2CellUnion S2CellUnion::FromBeginEnd(S2CellId begin, S2CellId end) {
|
|
68
|
+
S2CellUnion result;
|
|
69
|
+
result.InitFromBeginEnd(begin, end);
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
void S2CellUnion::Init(const vector<uint64>& cell_ids) {
|
|
74
|
+
cell_ids_ = ToS2CellIds(cell_ids);
|
|
75
|
+
Normalize();
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
void S2CellUnion::InitFromMinMax(S2CellId min_id, S2CellId max_id) {
|
|
79
|
+
S2_DCHECK(max_id.is_valid());
|
|
80
|
+
InitFromBeginEnd(min_id, max_id.next());
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
void S2CellUnion::InitFromBeginEnd(S2CellId begin, S2CellId end) {
|
|
84
|
+
S2_DCHECK(begin.is_leaf());
|
|
85
|
+
S2_DCHECK(end.is_leaf());
|
|
86
|
+
S2_DCHECK_LE(begin, end);
|
|
87
|
+
|
|
88
|
+
// We repeatedly add the largest cell we can.
|
|
89
|
+
cell_ids_.clear();
|
|
90
|
+
for (S2CellId id = begin.maximum_tile(end);
|
|
91
|
+
id != end; id = id.next().maximum_tile(end)) {
|
|
92
|
+
cell_ids_.push_back(id);
|
|
93
|
+
}
|
|
94
|
+
// The output is already normalized.
|
|
95
|
+
S2_DCHECK(IsNormalized());
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
void S2CellUnion::Pack(int excess) {
|
|
99
|
+
if (cell_ids_.capacity() - cell_ids_.size() > excess) {
|
|
100
|
+
cell_ids_.shrink_to_fit();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
S2CellUnion* S2CellUnion::Clone() const {
|
|
105
|
+
return new S2CellUnion(cell_ids_, VERBATIM);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Returns true if the given four cells have a common parent.
|
|
109
|
+
// REQUIRES: The four cells are distinct.
|
|
110
|
+
inline static bool AreSiblings(S2CellId a, S2CellId b, S2CellId c, S2CellId d) {
|
|
111
|
+
// A necessary (but not sufficient) condition is that the XOR of the
|
|
112
|
+
// four cells must be zero. This is also very fast to test.
|
|
113
|
+
if ((a.id() ^ b.id() ^ c.id()) != d.id()) return false;
|
|
114
|
+
|
|
115
|
+
// Now we do a slightly more expensive but exact test. First, compute a
|
|
116
|
+
// mask that blocks out the two bits that encode the child position of
|
|
117
|
+
// "id" with respect to its parent, then check that the other three
|
|
118
|
+
// children all agree with "mask".
|
|
119
|
+
uint64 mask = d.lsb() << 1;
|
|
120
|
+
mask = ~(mask + (mask << 1));
|
|
121
|
+
uint64 id_masked = (d.id() & mask);
|
|
122
|
+
return ((a.id() & mask) == id_masked &&
|
|
123
|
+
(b.id() & mask) == id_masked &&
|
|
124
|
+
(c.id() & mask) == id_masked &&
|
|
125
|
+
!d.is_face());
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
bool S2CellUnion::IsValid() const {
|
|
129
|
+
if (num_cells() > 0 && !cell_id(0).is_valid()) return false;
|
|
130
|
+
for (int i = 1; i < num_cells(); ++i) {
|
|
131
|
+
if (!cell_id(i).is_valid()) return false;
|
|
132
|
+
if (cell_id(i - 1).range_max() >= cell_id(i).range_min()) return false;
|
|
133
|
+
}
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
bool S2CellUnion::IsNormalized() const {
|
|
138
|
+
if (num_cells() > 0 && !cell_id(0).is_valid()) return false;
|
|
139
|
+
for (int i = 1; i < num_cells(); ++i) {
|
|
140
|
+
if (!cell_id(i).is_valid()) return false;
|
|
141
|
+
if (cell_id(i - 1).range_max() >= cell_id(i).range_min()) return false;
|
|
142
|
+
if (i >= 3 && AreSiblings(cell_id(i - 3), cell_id(i - 2),
|
|
143
|
+
cell_id(i - 1), cell_id(i))) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
bool S2CellUnion::Normalize() {
|
|
151
|
+
return Normalize(&cell_ids_);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/*static*/ bool S2CellUnion::Normalize(vector<S2CellId>* ids) {
|
|
155
|
+
// Optimize the representation by discarding cells contained by other cells,
|
|
156
|
+
// and looking for cases where all subcells of a parent cell are present.
|
|
157
|
+
|
|
158
|
+
std::sort(ids->begin(), ids->end());
|
|
159
|
+
int out = 0;
|
|
160
|
+
for (S2CellId id : *ids) {
|
|
161
|
+
// Check whether this cell is contained by the previous cell.
|
|
162
|
+
if (out > 0 && (*ids)[out-1].contains(id)) continue;
|
|
163
|
+
|
|
164
|
+
// Discard any previous cells contained by this cell.
|
|
165
|
+
while (out > 0 && id.contains((*ids)[out-1])) --out;
|
|
166
|
+
|
|
167
|
+
// Check whether the last 3 elements plus "id" can be collapsed into a
|
|
168
|
+
// single parent cell.
|
|
169
|
+
while (out >= 3 && AreSiblings((*ids)[out - 3], (*ids)[out - 2],
|
|
170
|
+
(*ids)[out - 1], id)) {
|
|
171
|
+
// Replace four children by their parent cell.
|
|
172
|
+
id = id.parent();
|
|
173
|
+
out -= 3;
|
|
174
|
+
}
|
|
175
|
+
(*ids)[out++] = id;
|
|
176
|
+
}
|
|
177
|
+
if (ids->size() == out) return false;
|
|
178
|
+
ids->resize(out);
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
void S2CellUnion::Denormalize(int min_level, int level_mod,
|
|
183
|
+
vector<S2CellId>* out) const {
|
|
184
|
+
Denormalize(cell_ids_, min_level, level_mod, out);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
void S2CellUnion::Denormalize(const vector<S2CellId>& in,
|
|
188
|
+
int min_level, int level_mod,
|
|
189
|
+
vector<S2CellId>* out) {
|
|
190
|
+
S2_DCHECK_GE(min_level, 0);
|
|
191
|
+
S2_DCHECK_LE(min_level, S2CellId::kMaxLevel);
|
|
192
|
+
S2_DCHECK_GE(level_mod, 1);
|
|
193
|
+
S2_DCHECK_LE(level_mod, 3);
|
|
194
|
+
S2_DCHECK_NE(out, &in);
|
|
195
|
+
|
|
196
|
+
out->clear();
|
|
197
|
+
out->reserve(in.size());
|
|
198
|
+
for (S2CellId id : in) {
|
|
199
|
+
int level = id.level();
|
|
200
|
+
int new_level = max(min_level, level);
|
|
201
|
+
if (level_mod > 1) {
|
|
202
|
+
// Round up so that (new_level - min_level) is a multiple of level_mod.
|
|
203
|
+
// (Note that S2CellId::kMaxLevel is a multiple of 1, 2, and 3.)
|
|
204
|
+
new_level += (S2CellId::kMaxLevel - (new_level - min_level)) % level_mod;
|
|
205
|
+
new_level = min(S2CellId::kMaxLevel, new_level);
|
|
206
|
+
}
|
|
207
|
+
if (new_level == level) {
|
|
208
|
+
out->push_back(id);
|
|
209
|
+
} else {
|
|
210
|
+
S2CellId end = id.child_end(new_level);
|
|
211
|
+
for (id = id.child_begin(new_level); id != end; id = id.next()) {
|
|
212
|
+
out->push_back(id);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
S2Cap S2CellUnion::GetCapBound() const {
|
|
219
|
+
// Compute the approximate centroid of the region. This won't produce the
|
|
220
|
+
// bounding cap of minimal area, but it should be close enough.
|
|
221
|
+
if (cell_ids_.empty()) return S2Cap::Empty();
|
|
222
|
+
S2Point centroid(0, 0, 0);
|
|
223
|
+
for (S2CellId id : *this) {
|
|
224
|
+
double area = S2Cell::AverageArea(id.level());
|
|
225
|
+
centroid += area * id.ToPoint();
|
|
226
|
+
}
|
|
227
|
+
if (centroid == S2Point(0, 0, 0)) {
|
|
228
|
+
centroid = S2Point(1, 0, 0);
|
|
229
|
+
} else {
|
|
230
|
+
centroid = centroid.Normalize();
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Use the centroid as the cap axis, and expand the cap angle so that it
|
|
234
|
+
// contains the bounding caps of all the individual cells. Note that it is
|
|
235
|
+
// *not* sufficient to just bound all the cell vertices because the bounding
|
|
236
|
+
// cap may be concave (i.e. cover more than one hemisphere).
|
|
237
|
+
S2Cap cap = S2Cap::FromPoint(centroid);
|
|
238
|
+
for (S2CellId id : *this) {
|
|
239
|
+
cap.AddCap(S2Cell(id).GetCapBound());
|
|
240
|
+
}
|
|
241
|
+
return cap;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
S2LatLngRect S2CellUnion::GetRectBound() const {
|
|
245
|
+
S2LatLngRect bound = S2LatLngRect::Empty();
|
|
246
|
+
for (S2CellId id : *this) {
|
|
247
|
+
bound = bound.Union(S2Cell(id).GetRectBound());
|
|
248
|
+
}
|
|
249
|
+
return bound;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
bool S2CellUnion::Contains(S2CellId id) const {
|
|
253
|
+
// This is an exact test. Each cell occupies a linear span of the S2
|
|
254
|
+
// space-filling curve, and the cell id is simply the position at the center
|
|
255
|
+
// of this span. The cell union ids are sorted in increasing order along
|
|
256
|
+
// the space-filling curve. So we simply find the pair of cell ids that
|
|
257
|
+
// surround the given cell id (using binary search). There is containment
|
|
258
|
+
// if and only if one of these two cell ids contains this cell.
|
|
259
|
+
|
|
260
|
+
vector<S2CellId>::const_iterator i =
|
|
261
|
+
std::lower_bound(cell_ids_.begin(), cell_ids_.end(), id);
|
|
262
|
+
if (i != cell_ids_.end() && i->range_min() <= id) return true;
|
|
263
|
+
return i != cell_ids_.begin() && (--i)->range_max() >= id;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
bool S2CellUnion::Intersects(S2CellId id) const {
|
|
267
|
+
// This is an exact test; see the comments for Contains() above.
|
|
268
|
+
|
|
269
|
+
vector<S2CellId>::const_iterator i =
|
|
270
|
+
std::lower_bound(cell_ids_.begin(), cell_ids_.end(), id);
|
|
271
|
+
if (i != cell_ids_.end() && i->range_min() <= id.range_max()) return true;
|
|
272
|
+
return i != cell_ids_.begin() && (--i)->range_max() >= id.range_min();
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
bool S2CellUnion::Contains(const S2CellUnion& y) const {
|
|
276
|
+
// TODO(ericv): A divide-and-conquer or alternating-skip-search
|
|
277
|
+
// approach may be sigificantly faster in both the average and worst case.
|
|
278
|
+
|
|
279
|
+
for (S2CellId y_id : y) {
|
|
280
|
+
if (!Contains(y_id)) return false;
|
|
281
|
+
}
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
bool S2CellUnion::Intersects(const S2CellUnion& y) const {
|
|
286
|
+
// TODO(ericv): A divide-and-conquer or alternating-skip-search
|
|
287
|
+
// approach may be sigificantly faster in both the average and worst case.
|
|
288
|
+
|
|
289
|
+
for (S2CellId y_id : y) {
|
|
290
|
+
if (Intersects(y_id)) return true;
|
|
291
|
+
}
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
S2CellUnion S2CellUnion::Union(const S2CellUnion& y) const {
|
|
296
|
+
vector<S2CellId> cell_ids;
|
|
297
|
+
cell_ids.reserve(num_cells() + y.num_cells());
|
|
298
|
+
cell_ids = cell_ids_;
|
|
299
|
+
cell_ids.insert(cell_ids.end(), y.cell_ids_.begin(), y.cell_ids_.end());
|
|
300
|
+
return S2CellUnion(std::move(cell_ids));
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
S2CellUnion S2CellUnion::Intersection(S2CellId id) const {
|
|
304
|
+
S2CellUnion result;
|
|
305
|
+
if (Contains(id)) {
|
|
306
|
+
result.cell_ids_.push_back(id);
|
|
307
|
+
} else {
|
|
308
|
+
vector<S2CellId>::const_iterator i = std::lower_bound(
|
|
309
|
+
cell_ids_.begin(), cell_ids_.end(), id.range_min());
|
|
310
|
+
S2CellId id_max = id.range_max();
|
|
311
|
+
while (i != cell_ids_.end() && *i <= id_max)
|
|
312
|
+
result.cell_ids_.push_back(*i++);
|
|
313
|
+
}
|
|
314
|
+
S2_DCHECK(result.IsNormalized() || !IsNormalized());
|
|
315
|
+
return result;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
S2CellUnion S2CellUnion::Intersection(const S2CellUnion& y) const {
|
|
319
|
+
S2CellUnion result;
|
|
320
|
+
GetIntersection(cell_ids_, y.cell_ids_, &result.cell_ids_);
|
|
321
|
+
// The output is normalized as long as at least one input is normalized.
|
|
322
|
+
S2_DCHECK(result.IsNormalized() || (!IsNormalized() && !y.IsNormalized()));
|
|
323
|
+
return result;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/*static*/ void S2CellUnion::GetIntersection(const vector<S2CellId>& x,
|
|
327
|
+
const vector<S2CellId>& y,
|
|
328
|
+
vector<S2CellId>* out) {
|
|
329
|
+
S2_DCHECK_NE(out, &x);
|
|
330
|
+
S2_DCHECK_NE(out, &y);
|
|
331
|
+
S2_DCHECK(is_sorted(x.begin(), x.end()));
|
|
332
|
+
S2_DCHECK(is_sorted(y.begin(), y.end()));
|
|
333
|
+
|
|
334
|
+
// This is a fairly efficient calculation that uses binary search to skip
|
|
335
|
+
// over sections of both input vectors. It takes logarithmic time if all the
|
|
336
|
+
// cells of "x" come before or after all the cells of "y" in S2CellId order.
|
|
337
|
+
|
|
338
|
+
out->clear();
|
|
339
|
+
vector<S2CellId>::const_iterator i = x.begin();
|
|
340
|
+
vector<S2CellId>::const_iterator j = y.begin();
|
|
341
|
+
while (i != x.end() && j != y.end()) {
|
|
342
|
+
S2CellId imin = i->range_min();
|
|
343
|
+
S2CellId jmin = j->range_min();
|
|
344
|
+
if (imin > jmin) {
|
|
345
|
+
// Either j->contains(*i) or the two cells are disjoint.
|
|
346
|
+
if (*i <= j->range_max()) {
|
|
347
|
+
out->push_back(*i++);
|
|
348
|
+
} else {
|
|
349
|
+
// Advance "j" to the first cell possibly contained by *i.
|
|
350
|
+
j = std::lower_bound(j + 1, y.end(), imin);
|
|
351
|
+
// The previous cell *(j-1) may now contain *i.
|
|
352
|
+
if (*i <= (j - 1)->range_max()) --j;
|
|
353
|
+
}
|
|
354
|
+
} else if (jmin > imin) {
|
|
355
|
+
// Identical to the code above with "i" and "j" reversed.
|
|
356
|
+
if (*j <= i->range_max()) {
|
|
357
|
+
out->push_back(*j++);
|
|
358
|
+
} else {
|
|
359
|
+
i = std::lower_bound(i + 1, x.end(), jmin);
|
|
360
|
+
if (*j <= (i - 1)->range_max()) --i;
|
|
361
|
+
}
|
|
362
|
+
} else {
|
|
363
|
+
// "i" and "j" have the same range_min(), so one contains the other.
|
|
364
|
+
if (*i < *j)
|
|
365
|
+
out->push_back(*i++);
|
|
366
|
+
else
|
|
367
|
+
out->push_back(*j++);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
// The output is generated in sorted order.
|
|
371
|
+
S2_DCHECK(is_sorted(out->begin(), out->end()));
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
static void GetDifferenceInternal(S2CellId cell,
|
|
375
|
+
const S2CellUnion& y,
|
|
376
|
+
vector<S2CellId>* cell_ids) {
|
|
377
|
+
// Add the difference between cell and y to cell_ids.
|
|
378
|
+
// If they intersect but the difference is non-empty, divide and conquer.
|
|
379
|
+
if (!y.Intersects(cell)) {
|
|
380
|
+
cell_ids->push_back(cell);
|
|
381
|
+
} else if (!y.Contains(cell)) {
|
|
382
|
+
S2CellId child = cell.child_begin();
|
|
383
|
+
for (int i = 0; ; ++i) {
|
|
384
|
+
GetDifferenceInternal(child, y, cell_ids);
|
|
385
|
+
if (i == 3) break; // Avoid unnecessary next() computation.
|
|
386
|
+
child = child.next();
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
S2CellUnion S2CellUnion::Difference(const S2CellUnion& y) const {
|
|
392
|
+
// TODO(ericv): this is approximately O(N*log(N)), but could probably
|
|
393
|
+
// use similar techniques as GetIntersection() to be more efficient.
|
|
394
|
+
|
|
395
|
+
S2CellUnion result;
|
|
396
|
+
for (S2CellId id : *this) {
|
|
397
|
+
GetDifferenceInternal(id, y, &result.cell_ids_);
|
|
398
|
+
}
|
|
399
|
+
// The output is normalized as long as the first argument is normalized.
|
|
400
|
+
S2_DCHECK(result.IsNormalized() || !IsNormalized());
|
|
401
|
+
return result;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
void S2CellUnion::Expand(int expand_level) {
|
|
405
|
+
vector<S2CellId> output;
|
|
406
|
+
uint64 level_lsb = S2CellId::lsb_for_level(expand_level);
|
|
407
|
+
for (int i = num_cells(); --i >= 0; ) {
|
|
408
|
+
S2CellId id = cell_id(i);
|
|
409
|
+
if (id.lsb() < level_lsb) {
|
|
410
|
+
id = id.parent(expand_level);
|
|
411
|
+
// Optimization: skip over any cells contained by this one. This is
|
|
412
|
+
// especially important when very small regions are being expanded.
|
|
413
|
+
while (i > 0 && id.contains(cell_id(i - 1))) --i;
|
|
414
|
+
}
|
|
415
|
+
output.push_back(id);
|
|
416
|
+
id.AppendAllNeighbors(expand_level, &output);
|
|
417
|
+
}
|
|
418
|
+
Init(std::move(output));
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
void S2CellUnion::Expand(S1Angle min_radius, int max_level_diff) {
|
|
422
|
+
int min_level = S2CellId::kMaxLevel;
|
|
423
|
+
for (S2CellId id : *this) {
|
|
424
|
+
min_level = min(min_level, id.level());
|
|
425
|
+
}
|
|
426
|
+
// Find the maximum level such that all cells are at least "min_radius" wide.
|
|
427
|
+
int radius_level = S2::kMinWidth.GetLevelForMinValue(min_radius.radians());
|
|
428
|
+
if (radius_level == 0 && min_radius.radians() > S2::kMinWidth.GetValue(0)) {
|
|
429
|
+
// The requested expansion is greater than the width of a face cell.
|
|
430
|
+
// The easiest way to handle this is to expand twice.
|
|
431
|
+
Expand(0);
|
|
432
|
+
}
|
|
433
|
+
Expand(min(min_level + max_level_diff, radius_level));
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
uint64 S2CellUnion::LeafCellsCovered() const {
|
|
437
|
+
uint64 num_leaves = 0;
|
|
438
|
+
for (S2CellId id : *this) {
|
|
439
|
+
const int inverted_level = S2CellId::kMaxLevel - id.level();
|
|
440
|
+
num_leaves += (1ULL << (inverted_level << 1));
|
|
441
|
+
}
|
|
442
|
+
return num_leaves;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
double S2CellUnion::AverageBasedArea() const {
|
|
446
|
+
return S2Cell::AverageArea(S2CellId::kMaxLevel) * LeafCellsCovered();
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
double S2CellUnion::ApproxArea() const {
|
|
450
|
+
double area = 0;
|
|
451
|
+
for (S2CellId id : *this) {
|
|
452
|
+
area += S2Cell(id).ApproxArea();
|
|
453
|
+
}
|
|
454
|
+
return area;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
double S2CellUnion::ExactArea() const {
|
|
458
|
+
double area = 0;
|
|
459
|
+
for (S2CellId id : *this) {
|
|
460
|
+
area += S2Cell(id).ExactArea();
|
|
461
|
+
}
|
|
462
|
+
return area;
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
bool operator==(const S2CellUnion& x, const S2CellUnion& y) {
|
|
466
|
+
return x.cell_ids() == y.cell_ids();
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
bool operator!=(const S2CellUnion& x, const S2CellUnion& y) {
|
|
470
|
+
return x.cell_ids() != y.cell_ids();
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
bool S2CellUnion::Contains(const S2Cell& cell) const {
|
|
474
|
+
return Contains(cell.id());
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
bool S2CellUnion::MayIntersect(const S2Cell& cell) const {
|
|
478
|
+
return Intersects(cell.id());
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
void S2CellUnion::Encode(Encoder* const encoder) const {
|
|
482
|
+
// Unsigned char for version number, and N+1 uint64's for N cell_ids
|
|
483
|
+
// (1 for vector length, N for the ids).
|
|
484
|
+
encoder->Ensure(sizeof(unsigned char) +
|
|
485
|
+
sizeof(uint64) * (1 + cell_ids_.size()));
|
|
486
|
+
|
|
487
|
+
encoder->put8(kCurrentLosslessEncodingVersionNumber);
|
|
488
|
+
encoder->put64(uint64{cell_ids_.size()});
|
|
489
|
+
for (const S2CellId& cell_id : cell_ids_) {
|
|
490
|
+
cell_id.Encode(encoder);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
bool S2CellUnion::Decode(Decoder* const decoder) {
|
|
495
|
+
// Should contain at least version and vector length.
|
|
496
|
+
if (decoder->avail() < sizeof(unsigned char) + sizeof(uint64)) return false;
|
|
497
|
+
unsigned char version = decoder->get8();
|
|
498
|
+
if (version > kCurrentLosslessEncodingVersionNumber) return false;
|
|
499
|
+
|
|
500
|
+
uint64 num_cells = decoder->get64();
|
|
501
|
+
if (num_cells > FLAGS_s2cell_union_decode_max_num_cells) {
|
|
502
|
+
return false;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
vector<S2CellId> temp_cell_ids(num_cells);
|
|
506
|
+
for (int i = 0; i < num_cells; ++i) {
|
|
507
|
+
if (!temp_cell_ids[i].Decode(decoder)) return false;
|
|
508
|
+
}
|
|
509
|
+
cell_ids_.swap(temp_cell_ids);
|
|
510
|
+
return true;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
bool S2CellUnion::Contains(const S2Point& p) const {
|
|
514
|
+
return Contains(S2CellId(p));
|
|
515
|
+
}
|