@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,270 @@
|
|
|
1
|
+
// Copyright 2017 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
//
|
|
18
|
+
// Indexing Strategy
|
|
19
|
+
// -----------------
|
|
20
|
+
//
|
|
21
|
+
// Given a query region, we want to find all of the document regions that
|
|
22
|
+
// intersect it. The first step is to represent all the regions as S2Cell
|
|
23
|
+
// coverings (see S2RegionCoverer). We then split the problem into two parts,
|
|
24
|
+
// namely finding the document regions that are "smaller" than the query
|
|
25
|
+
// region and those that are "larger" than the query region.
|
|
26
|
+
//
|
|
27
|
+
// We do this by defining two terms for each S2CellId: a "covering term" and
|
|
28
|
+
// an "ancestor term". (In the implementation below, covering terms are
|
|
29
|
+
// distinguished by prefixing a '$' to them.) For each document region, we
|
|
30
|
+
// insert a covering term for every cell in the region's covering, and we
|
|
31
|
+
// insert an ancestor term for these cells *and* all of their ancestors.
|
|
32
|
+
//
|
|
33
|
+
// Then given a query region, we can look up all the document regions that
|
|
34
|
+
// intersect its covering by querying the union of the following terms:
|
|
35
|
+
//
|
|
36
|
+
// 1. An "ancestor term" for each cell in the query region. These terms
|
|
37
|
+
// ensure that we find all document regions that are "smaller" than the
|
|
38
|
+
// query region, i.e. where the query region contains a cell that is either
|
|
39
|
+
// a cell of a document region or one of its ancestors.
|
|
40
|
+
//
|
|
41
|
+
// 2. A "covering term" for every ancestor of the cells in the query region.
|
|
42
|
+
// These terms ensure that we find all the document regions that are
|
|
43
|
+
// "larger" than the query region, i.e. where document region contains a
|
|
44
|
+
// cell that is a (proper) ancestor of a cell in the query region.
|
|
45
|
+
//
|
|
46
|
+
// Together, these terms find all of the document regions that intersect the
|
|
47
|
+
// query region. Furthermore, the number of terms to be indexed and queried
|
|
48
|
+
// are both fairly small, and can be bounded in terms of max_cells() and the
|
|
49
|
+
// number of cell levels used.
|
|
50
|
+
//
|
|
51
|
+
// Optimizations
|
|
52
|
+
// -------------
|
|
53
|
+
//
|
|
54
|
+
// + Cells at the maximum level being indexed (max_level()) have the special
|
|
55
|
+
// property that they will never be an ancestor of a cell in the query
|
|
56
|
+
// region. Therefore we can safely skip generating "covering terms" for
|
|
57
|
+
// these cells (see query step 2 above).
|
|
58
|
+
//
|
|
59
|
+
// + If the index will contain only points (rather than general regions), then
|
|
60
|
+
// we can skip all the covering terms mentioned above because there will
|
|
61
|
+
// never be any document regions larger than the query region. This can
|
|
62
|
+
// significantly reduce the size of queries.
|
|
63
|
+
//
|
|
64
|
+
// + If it is more important to optimize index size rather than query speed,
|
|
65
|
+
// the number of index terms can be reduced by creating ancestor terms only
|
|
66
|
+
// for the *proper* ancestors of the cells in a document region, and
|
|
67
|
+
// compensating for this by including covering terms for all cells in the
|
|
68
|
+
// query region (in addition to their ancestors).
|
|
69
|
+
//
|
|
70
|
+
// Effectively, when the query region and a document region contain exactly
|
|
71
|
+
// the same cell, we have a choice about whether to treat this match as a
|
|
72
|
+
// "covering term" or an "ancestor term". One choice minimizes query size
|
|
73
|
+
// while the other minimizes index size.
|
|
74
|
+
|
|
75
|
+
#include "s2/s2region_term_indexer.h"
|
|
76
|
+
|
|
77
|
+
#include <cctype>
|
|
78
|
+
|
|
79
|
+
#include "s2/base/logging.h"
|
|
80
|
+
#include "s2/s1angle.h"
|
|
81
|
+
#include "s2/s2cap.h"
|
|
82
|
+
#include "s2/s2cell_id.h"
|
|
83
|
+
#include "s2/s2region.h"
|
|
84
|
+
#include "s2/third_party/absl/strings/str_cat.h"
|
|
85
|
+
|
|
86
|
+
using absl::string_view;
|
|
87
|
+
using std::vector;
|
|
88
|
+
|
|
89
|
+
S2RegionTermIndexer::Options::Options() {
|
|
90
|
+
// Override the S2RegionCoverer defaults.
|
|
91
|
+
set_max_cells(8);
|
|
92
|
+
set_min_level(4);
|
|
93
|
+
set_max_level(16);
|
|
94
|
+
set_level_mod(1);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
void S2RegionTermIndexer::Options::set_marker_character(char ch) {
|
|
98
|
+
S2_DCHECK(!std::isalnum(ch));
|
|
99
|
+
marker_ = string(1, ch);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
S2RegionTermIndexer::S2RegionTermIndexer(const Options& options)
|
|
103
|
+
: options_(options) {
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Defaulted in the implementation to prevent inline bloat.
|
|
107
|
+
S2RegionTermIndexer::S2RegionTermIndexer() = default;
|
|
108
|
+
S2RegionTermIndexer::~S2RegionTermIndexer() = default;
|
|
109
|
+
S2RegionTermIndexer::S2RegionTermIndexer(S2RegionTermIndexer&&) = default;
|
|
110
|
+
S2RegionTermIndexer& S2RegionTermIndexer::operator=(S2RegionTermIndexer&&) =
|
|
111
|
+
default;
|
|
112
|
+
|
|
113
|
+
string S2RegionTermIndexer::GetTerm(TermType term_type, const S2CellId& id,
|
|
114
|
+
string_view prefix) const {
|
|
115
|
+
// There are generally more ancestor terms than covering terms, so we add
|
|
116
|
+
// the extra "marker" character to the covering terms to distinguish them.
|
|
117
|
+
if (term_type == TermType::ANCESTOR) {
|
|
118
|
+
return absl::StrCat(prefix, id.ToToken());
|
|
119
|
+
} else {
|
|
120
|
+
return absl::StrCat(prefix, options_.marker(), id.ToToken());
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
vector<string> S2RegionTermIndexer::GetIndexTerms(const S2Point& point,
|
|
125
|
+
string_view prefix) {
|
|
126
|
+
// See the top of this file for an overview of the indexing strategy.
|
|
127
|
+
//
|
|
128
|
+
// The last cell generated by this loop is effectively the covering for
|
|
129
|
+
// the given point. You might expect that this cell would be indexed as a
|
|
130
|
+
// covering term, but as an optimization we always index these cells as
|
|
131
|
+
// ancestor terms only. This is possible because query regions will never
|
|
132
|
+
// contain a descendant of such cells. Note that this is true even when
|
|
133
|
+
// max_level() != true_max_level() (see S2RegionCoverer::Options).
|
|
134
|
+
|
|
135
|
+
const S2CellId id(point);
|
|
136
|
+
vector<string> terms;
|
|
137
|
+
for (int level = options_.min_level(); level <= options_.max_level();
|
|
138
|
+
level += options_.level_mod()) {
|
|
139
|
+
terms.push_back(GetTerm(TermType::ANCESTOR, id.parent(level), prefix));
|
|
140
|
+
}
|
|
141
|
+
return terms;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
vector<string> S2RegionTermIndexer::GetIndexTerms(const S2Region& region,
|
|
145
|
+
string_view prefix) {
|
|
146
|
+
// Note that options may have changed since the last call.
|
|
147
|
+
*coverer_.mutable_options() = options_;
|
|
148
|
+
S2CellUnion covering = coverer_.GetCovering(region);
|
|
149
|
+
return GetIndexTermsForCanonicalCovering(covering, prefix);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
vector<string> S2RegionTermIndexer::GetIndexTermsForCanonicalCovering(
|
|
153
|
+
const S2CellUnion& covering, string_view prefix) {
|
|
154
|
+
// See the top of this file for an overview of the indexing strategy.
|
|
155
|
+
//
|
|
156
|
+
// Cells in the covering are normally indexed as covering terms. If we are
|
|
157
|
+
// optimizing for query time rather than index space, they are also indexed
|
|
158
|
+
// as ancestor terms (since this lets us reduce the number of terms in the
|
|
159
|
+
// query). Finally, as an optimization we always index true_max_level()
|
|
160
|
+
// cells as ancestor cells only, since these cells have the special property
|
|
161
|
+
// that query regions will never contain a descendant of these cells.
|
|
162
|
+
|
|
163
|
+
S2_CHECK(!options_.index_contains_points_only());
|
|
164
|
+
if (google::DEBUG_MODE) {
|
|
165
|
+
*coverer_.mutable_options() = options_;
|
|
166
|
+
S2_CHECK(coverer_.IsCanonical(covering));
|
|
167
|
+
}
|
|
168
|
+
vector<string> terms;
|
|
169
|
+
S2CellId prev_id = S2CellId::None();
|
|
170
|
+
int true_max_level = options_.true_max_level();
|
|
171
|
+
for (S2CellId id : covering) {
|
|
172
|
+
// IsCanonical() already checks the following conditions, but we repeat
|
|
173
|
+
// them here for documentation purposes.
|
|
174
|
+
int level = id.level();
|
|
175
|
+
S2_DCHECK_GE(level, options_.min_level());
|
|
176
|
+
S2_DCHECK_LE(level, options_.max_level());
|
|
177
|
+
S2_DCHECK_EQ(0, (level - options_.min_level()) % options_.level_mod());
|
|
178
|
+
|
|
179
|
+
if (level < true_max_level) {
|
|
180
|
+
// Add a covering term for this cell.
|
|
181
|
+
terms.push_back(GetTerm(TermType::COVERING, id, prefix));
|
|
182
|
+
}
|
|
183
|
+
if (level == true_max_level || !options_.optimize_for_space()) {
|
|
184
|
+
// Add an ancestor term for this cell at the constrained level.
|
|
185
|
+
terms.push_back(GetTerm(TermType::ANCESTOR, id.parent(level), prefix));
|
|
186
|
+
}
|
|
187
|
+
// Finally, add ancestor terms for all the ancestors of this cell.
|
|
188
|
+
while ((level -= options_.level_mod()) >= options_.min_level()) {
|
|
189
|
+
S2CellId ancestor_id = id.parent(level);
|
|
190
|
+
if (prev_id != S2CellId::None() && prev_id.level() > level &&
|
|
191
|
+
prev_id.parent(level) == ancestor_id) {
|
|
192
|
+
break; // We have already processed this cell and its ancestors.
|
|
193
|
+
}
|
|
194
|
+
terms.push_back(GetTerm(TermType::ANCESTOR, ancestor_id, prefix));
|
|
195
|
+
}
|
|
196
|
+
prev_id = id;
|
|
197
|
+
}
|
|
198
|
+
return terms;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
vector<string> S2RegionTermIndexer::GetQueryTerms(const S2Point& point,
|
|
202
|
+
string_view prefix) {
|
|
203
|
+
// See the top of this file for an overview of the indexing strategy.
|
|
204
|
+
|
|
205
|
+
const S2CellId id(point);
|
|
206
|
+
vector<string> terms;
|
|
207
|
+
// Recall that all true_max_level() cells are indexed only as ancestor terms.
|
|
208
|
+
int level = options_.true_max_level();
|
|
209
|
+
terms.push_back(GetTerm(TermType::ANCESTOR, id.parent(level), prefix));
|
|
210
|
+
if (options_.index_contains_points_only()) return terms;
|
|
211
|
+
|
|
212
|
+
// Add covering terms for all the ancestor cells.
|
|
213
|
+
for (; level >= options_.min_level(); level -= options_.level_mod()) {
|
|
214
|
+
terms.push_back(GetTerm(TermType::COVERING, id.parent(level), prefix));
|
|
215
|
+
}
|
|
216
|
+
return terms;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
vector<string> S2RegionTermIndexer::GetQueryTerms(const S2Region& region,
|
|
220
|
+
string_view prefix) {
|
|
221
|
+
// Note that options may have changed since the last call.
|
|
222
|
+
*coverer_.mutable_options() = options_;
|
|
223
|
+
S2CellUnion covering = coverer_.GetCovering(region);
|
|
224
|
+
return GetQueryTermsForCanonicalCovering(covering, prefix);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
vector<string> S2RegionTermIndexer::GetQueryTermsForCanonicalCovering(
|
|
228
|
+
const S2CellUnion& covering, string_view prefix) {
|
|
229
|
+
// See the top of this file for an overview of the indexing strategy.
|
|
230
|
+
|
|
231
|
+
if (google::DEBUG_MODE) {
|
|
232
|
+
*coverer_.mutable_options() = options_;
|
|
233
|
+
S2_CHECK(coverer_.IsCanonical(covering));
|
|
234
|
+
}
|
|
235
|
+
vector<string> terms;
|
|
236
|
+
S2CellId prev_id = S2CellId::None();
|
|
237
|
+
int true_max_level = options_.true_max_level();
|
|
238
|
+
for (S2CellId id : covering) {
|
|
239
|
+
// IsCanonical() already checks the following conditions, but we repeat
|
|
240
|
+
// them here for documentation purposes.
|
|
241
|
+
int level = id.level();
|
|
242
|
+
S2_DCHECK_GE(level, options_.min_level());
|
|
243
|
+
S2_DCHECK_LE(level, options_.max_level());
|
|
244
|
+
S2_DCHECK_EQ(0, (level - options_.min_level()) % options_.level_mod());
|
|
245
|
+
|
|
246
|
+
// Cells in the covering are always queried as ancestor terms.
|
|
247
|
+
terms.push_back(GetTerm(TermType::ANCESTOR, id, prefix));
|
|
248
|
+
|
|
249
|
+
// If the index only contains points, there are no covering terms.
|
|
250
|
+
if (options_.index_contains_points_only()) continue;
|
|
251
|
+
|
|
252
|
+
// If we are optimizing for index space rather than query time, cells are
|
|
253
|
+
// also queried as covering terms (except for true_max_level() cells,
|
|
254
|
+
// which are indexed and queried as ancestor cells only).
|
|
255
|
+
if (options_.optimize_for_space() && level < true_max_level) {
|
|
256
|
+
terms.push_back(GetTerm(TermType::COVERING, id, prefix));
|
|
257
|
+
}
|
|
258
|
+
// Finally, add covering terms for all the ancestors of this cell.
|
|
259
|
+
while ((level -= options_.level_mod()) >= options_.min_level()) {
|
|
260
|
+
S2CellId ancestor_id = id.parent(level);
|
|
261
|
+
if (prev_id != S2CellId::None() && prev_id.level() > level &&
|
|
262
|
+
prev_id.parent(level) == ancestor_id) {
|
|
263
|
+
break; // We have already processed this cell and its ancestors.
|
|
264
|
+
}
|
|
265
|
+
terms.push_back(GetTerm(TermType::COVERING, ancestor_id, prefix));
|
|
266
|
+
}
|
|
267
|
+
prev_id = id;
|
|
268
|
+
}
|
|
269
|
+
return terms;
|
|
270
|
+
}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
// Copyright 2017 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
//
|
|
18
|
+
// S2RegionTermIndexer is a helper class for adding spatial data to an
|
|
19
|
+
// information retrieval system. Such systems work by converting documents
|
|
20
|
+
// into a collection of "index terms" (e.g., representing words or phrases),
|
|
21
|
+
// and then building an "inverted index" that maps each term to a list of
|
|
22
|
+
// documents (and document positions) where that term occurs.
|
|
23
|
+
//
|
|
24
|
+
// This class deals with the problem of converting spatial data into index
|
|
25
|
+
// terms, which can then be indexed along with the other document information.
|
|
26
|
+
//
|
|
27
|
+
// Spatial data is represented using the S2Region type. Useful S2Region
|
|
28
|
+
// subtypes include:
|
|
29
|
+
//
|
|
30
|
+
// S2Cap
|
|
31
|
+
// - a disc-shaped region
|
|
32
|
+
//
|
|
33
|
+
// S2LatLngRect
|
|
34
|
+
// - a rectangle in latitude-longitude coordinates
|
|
35
|
+
//
|
|
36
|
+
// S2Polyline
|
|
37
|
+
// - a polyline
|
|
38
|
+
//
|
|
39
|
+
// S2Polygon
|
|
40
|
+
// - a polygon, possibly with multiple holes and/or shells
|
|
41
|
+
//
|
|
42
|
+
// S2CellUnion
|
|
43
|
+
// - a region approximated as a collection of S2CellIds
|
|
44
|
+
//
|
|
45
|
+
// S2ShapeIndexRegion
|
|
46
|
+
// - an arbitrary collection of points, polylines, and polygons
|
|
47
|
+
//
|
|
48
|
+
// S2ShapeIndexBufferedRegion
|
|
49
|
+
// - like the above, but expanded by a given radius
|
|
50
|
+
//
|
|
51
|
+
// S2RegionUnion, S2RegionIntersection
|
|
52
|
+
// - the union or intersection of arbitrary other regions
|
|
53
|
+
//
|
|
54
|
+
// So for example, if you want to query documents that are within 500 meters
|
|
55
|
+
// of a polyline, you could use an S2ShapeIndexBufferedRegion containing the
|
|
56
|
+
// polyline with a radius of 500 meters.
|
|
57
|
+
//
|
|
58
|
+
// Example usage:
|
|
59
|
+
//
|
|
60
|
+
// // This class is intended to be used with an external key-value store,
|
|
61
|
+
// // but for this example will we use an unordered_map. The key is an
|
|
62
|
+
// // index term, and the value is a set of document ids.
|
|
63
|
+
// std::unordered_map<string, std::vector<int>> index;
|
|
64
|
+
//
|
|
65
|
+
// // Create an indexer that uses up to 10 cells to approximate each region.
|
|
66
|
+
// S2RegionTermIndexer::Options options;
|
|
67
|
+
// options.set_max_cells(10);
|
|
68
|
+
// S2RegionTermIndexer indexer(options);
|
|
69
|
+
//
|
|
70
|
+
// // For this example, we index a disc-shaped region with a 10km radius.
|
|
71
|
+
// S2LatLng center = S2LatLng::FromDegrees(44.1, -56.235);
|
|
72
|
+
// S1Angle radius = S2Earth::ToAngle(util::units::Kilometers(10.0));
|
|
73
|
+
// S2Cap cap(center.ToPoint(), radius);
|
|
74
|
+
//
|
|
75
|
+
// // Add the terms for this disc-shaped region to the index.
|
|
76
|
+
// for (const auto& term : indexer.GetIndexTerms(cap)) {
|
|
77
|
+
// index[term].push_back(kSomeDocumentId);
|
|
78
|
+
// }
|
|
79
|
+
//
|
|
80
|
+
// // And now at query time: build a latitude-longitude rectangle.
|
|
81
|
+
// S2LatLngRect rect(S2LatLng::FromDegrees(-12.1, 10.2),
|
|
82
|
+
// S2LatLng::FromDegrees(-9.2, 120.5));
|
|
83
|
+
//
|
|
84
|
+
// // Convert the query region to a set of terms, and compute the union
|
|
85
|
+
// // of the document ids associated with those terms.
|
|
86
|
+
// std::set<int> doc_ids;
|
|
87
|
+
// for (const auto& term : indexer.GetQueryTerms(rect)) {
|
|
88
|
+
// doc_ids.insert(index[term].begin(), index[term].end());
|
|
89
|
+
// }
|
|
90
|
+
//
|
|
91
|
+
// // "doc_ids" now contains all documents that intersect the query region,
|
|
92
|
+
// // along with some documents that nearly intersect it. The results can
|
|
93
|
+
// // be further pruned if desired by retrieving the original regions that
|
|
94
|
+
// // were indexed (i.e., the document contents) and checking for exact
|
|
95
|
+
// // intersection with the query region.
|
|
96
|
+
|
|
97
|
+
#ifndef S2_S2REGION_TERM_INDEXER_H_
|
|
98
|
+
#define S2_S2REGION_TERM_INDEXER_H_
|
|
99
|
+
|
|
100
|
+
#include <string>
|
|
101
|
+
#include <vector>
|
|
102
|
+
|
|
103
|
+
#include "s2/s2cell_union.h"
|
|
104
|
+
#include "s2/s2region.h"
|
|
105
|
+
#include "s2/s2region_coverer.h"
|
|
106
|
+
#include "s2/third_party/absl/strings/string_view.h"
|
|
107
|
+
|
|
108
|
+
class S2RegionTermIndexer {
|
|
109
|
+
public:
|
|
110
|
+
// The following parameters control the tradeoffs between index size, query
|
|
111
|
+
// size, and accuracy (see s2region_coverer.h for details).
|
|
112
|
+
//
|
|
113
|
+
// IMPORTANT: You must use the same values for min_level(), max_level(), and
|
|
114
|
+
// level_mod() for both indexing and queries, otherwise queries will return
|
|
115
|
+
// incorrect results. However, max_cells() can be changed as often as
|
|
116
|
+
// desired -- you can even change this parameter for every region.
|
|
117
|
+
|
|
118
|
+
class Options : public S2RegionCoverer::Options {
|
|
119
|
+
public:
|
|
120
|
+
Options();
|
|
121
|
+
|
|
122
|
+
///////////////// Options Inherited From S2RegionCoverer ////////////////
|
|
123
|
+
|
|
124
|
+
// max_cells() controls the maximum number of cells when approximating
|
|
125
|
+
// each region. This parameter value may be changed as often as desired
|
|
126
|
+
// (using mutable_options(), see below), e.g. to approximate some regions
|
|
127
|
+
// more accurately than others.
|
|
128
|
+
//
|
|
129
|
+
// Increasing this value during indexing will make indexes more accurate
|
|
130
|
+
// but larger. Increasing this value for queries will make queries more
|
|
131
|
+
// accurate but slower. (See s2region_coverer.h for details on how this
|
|
132
|
+
// parameter affects accuracy.) For example, if you don't mind large
|
|
133
|
+
// indexes but want fast serving, it might be reasonable to set
|
|
134
|
+
// max_cells() == 100 during indexing and max_cells() == 8 for queries.
|
|
135
|
+
//
|
|
136
|
+
// DEFAULT: 8 (coarse approximations)
|
|
137
|
+
using S2RegionCoverer::Options::max_cells;
|
|
138
|
+
using S2RegionCoverer::Options::set_max_cells;
|
|
139
|
+
|
|
140
|
+
// min_level() and max_level() control the minimum and maximum size of the
|
|
141
|
+
// S2Cells used to approximate regions. Setting these parameters
|
|
142
|
+
// appropriately can reduce the size of the index and speed up queries by
|
|
143
|
+
// reducing the number of terms needed. For example, if you know that
|
|
144
|
+
// your query regions will rarely be less than 100 meters in width, then
|
|
145
|
+
// you could set max_level() as follows:
|
|
146
|
+
//
|
|
147
|
+
// options.set_max_level(S2::kAvgEdge.GetClosestLevel(
|
|
148
|
+
// S2Earth::MetersToRadians(100)));
|
|
149
|
+
//
|
|
150
|
+
// This restricts the index to S2Cells that are approximately 100 meters
|
|
151
|
+
// across or larger. Similar, if you know that query regions will rarely
|
|
152
|
+
// be larger than 1000km across, then you could set min_level() similarly.
|
|
153
|
+
//
|
|
154
|
+
// If min_level() is set too high, then large regions may generate too
|
|
155
|
+
// many query terms. If max_level() is set too low, then small query
|
|
156
|
+
// regions will not be able to discriminate which regions they intersect
|
|
157
|
+
// very precisely and may return many more candidates than necessary.
|
|
158
|
+
//
|
|
159
|
+
// If you have no idea about the scale of the regions being queried,
|
|
160
|
+
// it is perfectly fine to set min_level() == 0 and max_level() == 30
|
|
161
|
+
// (== S2::kMaxLevel). The only drawback is that may result in a larger
|
|
162
|
+
// index and slower queries.
|
|
163
|
+
//
|
|
164
|
+
// The default parameter values are suitable for query regions ranging
|
|
165
|
+
// from about 100 meters to 3000 km across.
|
|
166
|
+
//
|
|
167
|
+
// DEFAULT: 4 (average cell width == 600km)
|
|
168
|
+
using S2RegionCoverer::Options::min_level;
|
|
169
|
+
using S2RegionCoverer::Options::set_min_level;
|
|
170
|
+
|
|
171
|
+
// DEFAULT: 16 (average cell width == 150m)
|
|
172
|
+
using S2RegionCoverer::Options::max_level;
|
|
173
|
+
using S2RegionCoverer::Options::set_max_level;
|
|
174
|
+
|
|
175
|
+
// Setting level_mod() to a value greater than 1 increases the effective
|
|
176
|
+
// branching factor of the S2Cell hierarchy by skipping some levels. For
|
|
177
|
+
// example, if level_mod() == 2 then every second level is skipped (which
|
|
178
|
+
// increases the effective branching factor to 16). You might want to
|
|
179
|
+
// consider doing this if your query regions are typically very small
|
|
180
|
+
// (e.g., single points) and you don't mind increasing the index size
|
|
181
|
+
// (since skipping levels will reduce the accuracy of cell coverings for a
|
|
182
|
+
// given max_cells() limit).
|
|
183
|
+
//
|
|
184
|
+
// DEFAULT: 1 (don't skip any cell levels)
|
|
185
|
+
using S2RegionCoverer::Options::level_mod;
|
|
186
|
+
using S2RegionCoverer::Options::set_level_mod;
|
|
187
|
+
|
|
188
|
+
// If your index will only contain points (rather than regions), be sure
|
|
189
|
+
// to set this flag. This will generate smaller and faster queries that
|
|
190
|
+
// are specialized for the points-only case.
|
|
191
|
+
//
|
|
192
|
+
// With the default quality settings, this flag reduces the number of
|
|
193
|
+
// query terms by about a factor of two. (The improvement gets smaller
|
|
194
|
+
// as max_cells() is increased, but there is really no reason not to use
|
|
195
|
+
// this flag if your index consists entirely of points.)
|
|
196
|
+
//
|
|
197
|
+
// DEFAULT: false
|
|
198
|
+
bool index_contains_points_only() const { return points_only_; }
|
|
199
|
+
void set_index_contains_points_only(bool value) { points_only_ = value; }
|
|
200
|
+
|
|
201
|
+
// If true, the index will be optimized for space rather than for query
|
|
202
|
+
// time. With the default quality settings, this flag reduces the number
|
|
203
|
+
// of index terms and increases the number of query terms by the same
|
|
204
|
+
// factor (approximately 1.3). The factor increases up to a limiting
|
|
205
|
+
// ratio of 2.0 as max_cells() is increased.
|
|
206
|
+
//
|
|
207
|
+
// CAVEAT: This option has no effect if the index contains only points.
|
|
208
|
+
//
|
|
209
|
+
// DEFAULT: false
|
|
210
|
+
bool optimize_for_space() const { return optimize_for_space_; }
|
|
211
|
+
void set_optimize_for_space(bool value) { optimize_for_space_ = value; }
|
|
212
|
+
|
|
213
|
+
// A non-alphanumeric character that is used internally to distinguish
|
|
214
|
+
// between two different types of terms (by adding this character).
|
|
215
|
+
//
|
|
216
|
+
// REQUIRES: "ch" is non-alphanumeric.
|
|
217
|
+
// DEFAULT: '$'
|
|
218
|
+
const string& marker() const { return marker_; }
|
|
219
|
+
char marker_character() const { return marker_[0]; }
|
|
220
|
+
void set_marker_character(char ch);
|
|
221
|
+
|
|
222
|
+
private:
|
|
223
|
+
bool points_only_ = false;
|
|
224
|
+
bool optimize_for_space_ = false;
|
|
225
|
+
string marker_ = string(1, '$');
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
// Default constructor. Options can be set using mutable_options().
|
|
229
|
+
S2RegionTermIndexer();
|
|
230
|
+
~S2RegionTermIndexer();
|
|
231
|
+
|
|
232
|
+
// Constructs an S2RegionTermIndexer with the given options.
|
|
233
|
+
explicit S2RegionTermIndexer(const Options& options);
|
|
234
|
+
|
|
235
|
+
// S2RegionTermIndexer is movable but not copyable.
|
|
236
|
+
S2RegionTermIndexer(const S2RegionTermIndexer&) = delete;
|
|
237
|
+
S2RegionTermIndexer& operator=(const S2RegionTermIndexer&) = delete;
|
|
238
|
+
S2RegionTermIndexer(S2RegionTermIndexer&&);
|
|
239
|
+
S2RegionTermIndexer& operator=(S2RegionTermIndexer&&);
|
|
240
|
+
|
|
241
|
+
// Returns the current options. Options can be modifed between calls.
|
|
242
|
+
const Options& options() const { return options_; }
|
|
243
|
+
Options* mutable_options() { return &options_; }
|
|
244
|
+
|
|
245
|
+
// Converts the given region into a set of terms for indexing. Terms
|
|
246
|
+
// consist of lowercase letters, numbers, '$', and an optional prefix.
|
|
247
|
+
//
|
|
248
|
+
// "prefix" is a unique prefix used to distinguish S2 terms from other terms
|
|
249
|
+
// in the repository. The prefix may also be used to index documents with
|
|
250
|
+
// multiple types of location information (e.g. store footprint, entrances,
|
|
251
|
+
// parking lots, etc). The prefix should be kept short since it is
|
|
252
|
+
// prepended to every term.
|
|
253
|
+
std::vector<string> GetIndexTerms(const S2Region& region,
|
|
254
|
+
absl::string_view prefix);
|
|
255
|
+
|
|
256
|
+
// Converts a given query region into a set of terms. If you compute the
|
|
257
|
+
// union of all the documents associated with these terms, the result will
|
|
258
|
+
// include all documents whose index region intersects the query region.
|
|
259
|
+
//
|
|
260
|
+
// "prefix" should match the corresponding value used when indexing.
|
|
261
|
+
std::vector<string> GetQueryTerms(const S2Region& region,
|
|
262
|
+
absl::string_view prefix);
|
|
263
|
+
|
|
264
|
+
// Convenience methods that accept an S2Point rather than S2Region. (These
|
|
265
|
+
// methods are also faster.)
|
|
266
|
+
//
|
|
267
|
+
// Note that you can index an S2LatLng by converting it to an S2Point first:
|
|
268
|
+
// auto terms = GetIndexTerms(S2Point(latlng), ...);
|
|
269
|
+
std::vector<string> GetIndexTerms(const S2Point& point,
|
|
270
|
+
absl::string_view prefix);
|
|
271
|
+
std::vector<string> GetQueryTerms(const S2Point& point,
|
|
272
|
+
absl::string_view prefix);
|
|
273
|
+
|
|
274
|
+
// Low-level methods that accept an S2CellUnion covering of the region to be
|
|
275
|
+
// indexed or queried.
|
|
276
|
+
//
|
|
277
|
+
// REQUIRES: "covering" satisfies the S2RegionCoverer::Options for this
|
|
278
|
+
// class (i.e., max_cells, min_level, max_level, and level_mod).
|
|
279
|
+
//
|
|
280
|
+
// If you have a covering that was computed using different options, then
|
|
281
|
+
// you can either call the regular S2Region methods (since S2CellUnion is a
|
|
282
|
+
// type of S2Region), or "canonicalize" the covering first by calling
|
|
283
|
+
// S2RegionCoverer::CanonicalizeCovering() with the same options.
|
|
284
|
+
std::vector<string> GetIndexTermsForCanonicalCovering(
|
|
285
|
+
const S2CellUnion& covering, absl::string_view prefix);
|
|
286
|
+
std::vector<string> GetQueryTermsForCanonicalCovering(
|
|
287
|
+
const S2CellUnion& covering, absl::string_view prefix);
|
|
288
|
+
|
|
289
|
+
private:
|
|
290
|
+
enum TermType { ANCESTOR, COVERING };
|
|
291
|
+
|
|
292
|
+
string GetTerm(TermType term_type, const S2CellId& id,
|
|
293
|
+
absl::string_view prefix) const;
|
|
294
|
+
|
|
295
|
+
Options options_;
|
|
296
|
+
S2RegionCoverer coverer_;
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
#endif // S2_S2REGION_TERM_INDEXER_H_
|