@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,113 @@
|
|
|
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
|
+
#include "s2/s2shape_index_buffered_region.h"
|
|
19
|
+
|
|
20
|
+
#include <algorithm>
|
|
21
|
+
#include <vector>
|
|
22
|
+
#include "s2/s2metrics.h"
|
|
23
|
+
#include "s2/s2shape_index_region.h"
|
|
24
|
+
|
|
25
|
+
using std::min;
|
|
26
|
+
using std::vector;
|
|
27
|
+
|
|
28
|
+
S2ShapeIndexBufferedRegion::S2ShapeIndexBufferedRegion() {
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
void S2ShapeIndexBufferedRegion::Init(const S2ShapeIndex* index,
|
|
32
|
+
S1ChordAngle radius) {
|
|
33
|
+
radius_ = radius;
|
|
34
|
+
radius_successor_ = radius.Successor();
|
|
35
|
+
query_.Init(index);
|
|
36
|
+
query_.mutable_options()->set_include_interiors(true);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
S2ShapeIndexBufferedRegion* S2ShapeIndexBufferedRegion::Clone() const {
|
|
40
|
+
return new S2ShapeIndexBufferedRegion(&index(), radius_);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
S2Cap S2ShapeIndexBufferedRegion::GetCapBound() const {
|
|
44
|
+
S2Cap orig_cap = MakeS2ShapeIndexRegion(&index()).GetCapBound();
|
|
45
|
+
return S2Cap(orig_cap.center(), orig_cap.radius() + radius_);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
S2LatLngRect S2ShapeIndexBufferedRegion::GetRectBound() const {
|
|
49
|
+
S2LatLngRect orig_rect = MakeS2ShapeIndexRegion(&index()).GetRectBound();
|
|
50
|
+
return orig_rect.ExpandedByDistance(radius_.ToAngle());
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
void S2ShapeIndexBufferedRegion::GetCellUnionBound(vector<S2CellId> *cellids)
|
|
54
|
+
const {
|
|
55
|
+
// We start with a covering of the original S2ShapeIndex, and then expand it
|
|
56
|
+
// by replacing each cell with a block of 4 cells whose union contains the
|
|
57
|
+
// original cell buffered by the given radius.
|
|
58
|
+
//
|
|
59
|
+
// This increases the number of cells in the covering by a factor of 4 and
|
|
60
|
+
// increases the covered area by a factor of 16, so it is not a very good
|
|
61
|
+
// covering, but it is much better than always returning the 6 face cells.
|
|
62
|
+
vector<S2CellId> orig_cellids;
|
|
63
|
+
MakeS2ShapeIndexRegion(&index()).GetCellUnionBound(&orig_cellids);
|
|
64
|
+
|
|
65
|
+
double radians = radius_.ToAngle().radians();
|
|
66
|
+
int max_level = S2::kMinWidth.GetLevelForMinValue(radians) - 1;
|
|
67
|
+
if (max_level < 0) {
|
|
68
|
+
return S2Cap::Full().GetCellUnionBound(cellids);
|
|
69
|
+
}
|
|
70
|
+
cellids->clear();
|
|
71
|
+
for (S2CellId id : orig_cellids) {
|
|
72
|
+
if (id.is_face()) {
|
|
73
|
+
return S2Cap::Full().GetCellUnionBound(cellids);
|
|
74
|
+
}
|
|
75
|
+
id.AppendVertexNeighbors(min(max_level, id.level() - 1), cellids);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
bool S2ShapeIndexBufferedRegion::Contains(const S2Cell& cell) const {
|
|
80
|
+
// To implement this method perfectly would require computing the directed
|
|
81
|
+
// Hausdorff distance, which is expensive (and not currently implemented).
|
|
82
|
+
// However the following heuristic is almost as good in practice and much
|
|
83
|
+
// cheaper to compute.
|
|
84
|
+
|
|
85
|
+
// Return true if the unbuffered region contains this cell.
|
|
86
|
+
if (MakeS2ShapeIndexRegion(&index()).Contains(cell)) return true;
|
|
87
|
+
|
|
88
|
+
// Otherwise approximate the cell by its bounding cap.
|
|
89
|
+
//
|
|
90
|
+
// NOTE(ericv): It would be slightly more accurate to first find the closest
|
|
91
|
+
// point in the indexed geometry to the cell, and then measure the actual
|
|
92
|
+
// maximum distance from that point to the cell (a poor man's Hausdorff
|
|
93
|
+
// distance). But based on actual tests this is not worthwhile.
|
|
94
|
+
S2Cap cap = cell.GetCapBound();
|
|
95
|
+
if (radius_ < cap.radius()) return false;
|
|
96
|
+
|
|
97
|
+
// Return true if the distance to the cell center plus the radius of the
|
|
98
|
+
// cell's bounding cap is less than or equal to "radius_".
|
|
99
|
+
S2ClosestEdgeQuery::PointTarget target(cell.GetCenter());
|
|
100
|
+
return query_.IsDistanceLess(&target, radius_successor_ - cap.radius());
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
bool S2ShapeIndexBufferedRegion::MayIntersect(const S2Cell& cell) const {
|
|
104
|
+
// Return true if the distance is less than or equal to "radius_".
|
|
105
|
+
S2ClosestEdgeQuery::CellTarget target(cell);
|
|
106
|
+
return query_.IsDistanceLess(&target, radius_successor_);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
bool S2ShapeIndexBufferedRegion::Contains(const S2Point& p) const {
|
|
110
|
+
S2ClosestEdgeQuery::PointTarget target(p);
|
|
111
|
+
// Return true if the distance is less than or equal to "radius_".
|
|
112
|
+
return query_.IsDistanceLess(&target, radius_successor_);
|
|
113
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
// Copyright 2017 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
|
|
18
|
+
#ifndef S2_S2SHAPE_INDEX_BUFFERED_REGION_H_
|
|
19
|
+
#define S2_S2SHAPE_INDEX_BUFFERED_REGION_H_
|
|
20
|
+
|
|
21
|
+
#include <vector>
|
|
22
|
+
#include "s2/s2cap.h"
|
|
23
|
+
#include "s2/s2cell.h"
|
|
24
|
+
#include "s2/s2cell_union.h"
|
|
25
|
+
#include "s2/s2closest_edge_query.h"
|
|
26
|
+
#include "s2/s2latlng_rect.h"
|
|
27
|
+
#include "s2/s2region.h"
|
|
28
|
+
#include "s2/s2shape_index.h"
|
|
29
|
+
|
|
30
|
+
// This class provides a way to expand an arbitrary collection of geometry by
|
|
31
|
+
// a fixed radius (an operation variously known as "buffering", "offsetting",
|
|
32
|
+
// or "Minkowski sum with a disc") in order to compute an S2CellId covering
|
|
33
|
+
// (see S2RegionCoverer). The resulting covering contains all points within
|
|
34
|
+
// the given radius of any point in the original geometry.
|
|
35
|
+
//
|
|
36
|
+
// This class does not actually buffer the geometry; instead it implements the
|
|
37
|
+
// S2Region API by computing the distance from candidate S2CellIds to the
|
|
38
|
+
// original geometry. If this distance is below the given radius then the
|
|
39
|
+
// S2CellId intersects the buffered geometry. For example, if the original
|
|
40
|
+
// geometry consists of a single S2Point then the buffered geometry is exactly
|
|
41
|
+
// equivalent to an S2Cap with the given radius. (Note that the region is not
|
|
42
|
+
// approximated as a polygonal loop.)
|
|
43
|
+
//
|
|
44
|
+
// Example usage:
|
|
45
|
+
//
|
|
46
|
+
// S2CellUnion GetBufferedCovering(const S2ShapeIndex& index, S1Angle radius) {
|
|
47
|
+
// S2RegionCoverer coverer;
|
|
48
|
+
// coverer.mutable_options()->set_max_cells(20);
|
|
49
|
+
// S2CellUnion covering;
|
|
50
|
+
// S2ShapeIndexBufferedRegion region(&index, radius);
|
|
51
|
+
// coverer.GetCovering(region, &covering);
|
|
52
|
+
// return covering;
|
|
53
|
+
// }
|
|
54
|
+
//
|
|
55
|
+
// This class is not thread-safe. To use it in parallel, each thread should
|
|
56
|
+
// construct its own instance (this is not expensive).
|
|
57
|
+
class S2ShapeIndexBufferedRegion final : public S2Region {
|
|
58
|
+
public:
|
|
59
|
+
// Default constructor; requires Init() to be called.
|
|
60
|
+
S2ShapeIndexBufferedRegion();
|
|
61
|
+
|
|
62
|
+
// Constructs a region representing all points within the given radius of
|
|
63
|
+
// any point in the given S2ShapeIndex.
|
|
64
|
+
S2ShapeIndexBufferedRegion(const S2ShapeIndex* index,
|
|
65
|
+
S1ChordAngle radius);
|
|
66
|
+
|
|
67
|
+
// Convenience constructor that accepts an S1Angle for the radius.
|
|
68
|
+
// REQUIRES: radius >= S1Angle::Zero()
|
|
69
|
+
S2ShapeIndexBufferedRegion(const S2ShapeIndex* index, S1Angle radius)
|
|
70
|
+
: S2ShapeIndexBufferedRegion(index, S1ChordAngle(radius)) {}
|
|
71
|
+
|
|
72
|
+
// Equivalent to the constructor above.
|
|
73
|
+
void Init(const S2ShapeIndex* index, S1ChordAngle radius);
|
|
74
|
+
|
|
75
|
+
const S2ShapeIndex& index() const;
|
|
76
|
+
S1ChordAngle radius() const;
|
|
77
|
+
|
|
78
|
+
////////////////////////////////////////////////////////////////////////
|
|
79
|
+
// S2Region interface (see s2region.h for details):
|
|
80
|
+
|
|
81
|
+
// Clone() returns a *shallow* copy; it does not make a copy of the
|
|
82
|
+
// underlying S2ShapeIndex.
|
|
83
|
+
S2ShapeIndexBufferedRegion* Clone() const override;
|
|
84
|
+
|
|
85
|
+
S2Cap GetCapBound() const override;
|
|
86
|
+
S2LatLngRect GetRectBound() const override;
|
|
87
|
+
|
|
88
|
+
// This method returns a small non-optimal covering that may include
|
|
89
|
+
// duplicate or overlapping cells. It should not be used directly.
|
|
90
|
+
// Instead, use S2RegionCoverer::GetCovering or GetFastCovering.
|
|
91
|
+
void GetCellUnionBound(std::vector<S2CellId> *cellids) const override;
|
|
92
|
+
|
|
93
|
+
// The implementation is approximate but conservative; it always returns
|
|
94
|
+
// "false" if the cell is not contained by the buffered region, but it may
|
|
95
|
+
// also return false in some cases where "cell" is in fact contained.
|
|
96
|
+
bool Contains(const S2Cell& cell) const override;
|
|
97
|
+
|
|
98
|
+
// Returns true if any buffered shape intersects "cell" (to within a very
|
|
99
|
+
// small error margin).
|
|
100
|
+
bool MayIntersect(const S2Cell& cell) const override;
|
|
101
|
+
|
|
102
|
+
// Returns true if the given point is contained by the buffered region,
|
|
103
|
+
// i.e. if it is within the given radius of any original shape.
|
|
104
|
+
bool Contains(const S2Point& p) const override;
|
|
105
|
+
|
|
106
|
+
private:
|
|
107
|
+
S1ChordAngle radius_;
|
|
108
|
+
|
|
109
|
+
// In order to handle (radius_ == 0) corectly, we need to test whether
|
|
110
|
+
// distances are less than or equal to "radius_". This is done by testing
|
|
111
|
+
// whether distances are less than radius_.Successor().
|
|
112
|
+
S1ChordAngle radius_successor_;
|
|
113
|
+
|
|
114
|
+
mutable S2ClosestEdgeQuery query_; // This class is not thread-safe!
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
////////////////// Implementation details follow ////////////////////
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
inline S2ShapeIndexBufferedRegion::S2ShapeIndexBufferedRegion(
|
|
122
|
+
const S2ShapeIndex* index, S1ChordAngle radius)
|
|
123
|
+
: radius_(radius), radius_successor_(radius.Successor()), query_(index) {
|
|
124
|
+
query_.mutable_options()->set_include_interiors(true);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
inline const S2ShapeIndex& S2ShapeIndexBufferedRegion::index() const {
|
|
128
|
+
return query_.index();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
inline S1ChordAngle S2ShapeIndexBufferedRegion::radius() const {
|
|
132
|
+
return radius_;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
#endif // S2_S2SHAPE_INDEX_BUFFERED_REGION_H_
|
|
@@ -0,0 +1,162 @@
|
|
|
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
|
+
#include "s2/s2shape_index_buffered_region.h"
|
|
19
|
+
|
|
20
|
+
#include <iostream>
|
|
21
|
+
#include <memory>
|
|
22
|
+
#include <gtest/gtest.h>
|
|
23
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
24
|
+
#include "s2/mutable_s2shape_index.h"
|
|
25
|
+
#include "s2/s2cap.h"
|
|
26
|
+
#include "s2/s2cell_union.h"
|
|
27
|
+
#include "s2/s2polygon.h"
|
|
28
|
+
#include "s2/s2region_coverer.h"
|
|
29
|
+
#include "s2/s2shape_index.h"
|
|
30
|
+
#include "s2/s2testing.h"
|
|
31
|
+
#include "s2/s2text_format.h"
|
|
32
|
+
|
|
33
|
+
using absl::make_unique;
|
|
34
|
+
using s2textformat::MakeIndexOrDie;
|
|
35
|
+
using s2textformat::MakePointOrDie;
|
|
36
|
+
using std::cout;
|
|
37
|
+
|
|
38
|
+
TEST(S2ShapeIndexBufferedRegion, EmptyIndex) {
|
|
39
|
+
// Test buffering an empty S2ShapeIndex.
|
|
40
|
+
MutableS2ShapeIndex index;
|
|
41
|
+
S1ChordAngle radius(S1Angle::Degrees(2));
|
|
42
|
+
S2ShapeIndexBufferedRegion region(&index, radius);
|
|
43
|
+
S2RegionCoverer coverer;
|
|
44
|
+
S2CellUnion covering = coverer.GetCovering(region);
|
|
45
|
+
EXPECT_TRUE(covering.empty());
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
TEST(S2ShapeIndexBufferedRegion, FullPolygon) {
|
|
49
|
+
// Test buffering an S2ShapeIndex that contains a full polygon.
|
|
50
|
+
auto index = MakeIndexOrDie("# # full");
|
|
51
|
+
S1ChordAngle radius(S1Angle::Degrees(2));
|
|
52
|
+
S2ShapeIndexBufferedRegion region(index.get(), radius);
|
|
53
|
+
S2RegionCoverer coverer;
|
|
54
|
+
S2CellUnion covering = coverer.GetCovering(region);
|
|
55
|
+
ASSERT_EQ(6, covering.num_cells());
|
|
56
|
+
for (S2CellId id : covering) {
|
|
57
|
+
EXPECT_TRUE(id.is_face());
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
TEST(S2ShapeIndexBufferedRegion, FullAfterBuffering) {
|
|
62
|
+
// Test a region that becomes the full polygon after buffering.
|
|
63
|
+
auto index = MakeIndexOrDie("0:0 | 0:90 | 0:180 | 0:-90 | 90:0 | -90:0 # #");
|
|
64
|
+
S1ChordAngle radius(S1Angle::Degrees(60));
|
|
65
|
+
S2ShapeIndexBufferedRegion region(index.get(), radius);
|
|
66
|
+
S2RegionCoverer coverer;
|
|
67
|
+
coverer.mutable_options()->set_max_cells(1000);
|
|
68
|
+
S2CellUnion covering = coverer.GetCovering(region);
|
|
69
|
+
ASSERT_EQ(6, covering.num_cells());
|
|
70
|
+
for (S2CellId id : covering) {
|
|
71
|
+
EXPECT_TRUE(id.is_face());
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
TEST(S2ShapeIndexBufferedRegion, PointZeroRadius) {
|
|
76
|
+
// Test that buffering a point using a zero radius produces a non-empty
|
|
77
|
+
// covering. (This requires using "less than or equal to" distance tests.)
|
|
78
|
+
auto index = MakeIndexOrDie("34:25 # #");
|
|
79
|
+
S2ShapeIndexBufferedRegion region(index.get(), S1ChordAngle::Zero());
|
|
80
|
+
S2RegionCoverer coverer;
|
|
81
|
+
S2CellUnion covering = coverer.GetCovering(region);
|
|
82
|
+
EXPECT_EQ(1, covering.num_cells());
|
|
83
|
+
for (S2CellId id : covering) {
|
|
84
|
+
EXPECT_TRUE(id.is_leaf());
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
TEST(S2ShapeIndexBufferedRegion, BufferedPointVsCap) {
|
|
89
|
+
// Compute an S2Cell covering of a buffered S2Point, then make sure that the
|
|
90
|
+
// covering is equivalent to the corresponding S2Cap.
|
|
91
|
+
auto index = MakeIndexOrDie("3:5 # #");
|
|
92
|
+
S2Point point = MakePointOrDie("3:5");
|
|
93
|
+
S1ChordAngle radius(S1Angle::Degrees(2));
|
|
94
|
+
S2ShapeIndexBufferedRegion region(index.get(), radius);
|
|
95
|
+
S2RegionCoverer coverer;
|
|
96
|
+
coverer.mutable_options()->set_max_cells(50);
|
|
97
|
+
S2CellUnion covering = coverer.GetCovering(region);
|
|
98
|
+
S2Cap equivalent_cap(point, radius);
|
|
99
|
+
S2Testing::CheckCovering(equivalent_cap, covering, true);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Verifies that an arbitrary S2ShapeIndex is buffered correctly, by first
|
|
103
|
+
// converting the covering to an S2Polygon and then checking that (a) the
|
|
104
|
+
// S2Polygon contains the original geometry and (b) the distance between the
|
|
105
|
+
// original geometry and the boundary of the S2Polygon is at least "radius".
|
|
106
|
+
//
|
|
107
|
+
// The "radius" parameter is an S1Angle for convenience.
|
|
108
|
+
// TODO(ericv): Add Degrees, Radians, etc, methods to S1ChordAngle?
|
|
109
|
+
void TestBufferIndex(const string& index_str, S1Angle radius_angle,
|
|
110
|
+
S2RegionCoverer* coverer) {
|
|
111
|
+
auto index = MakeIndexOrDie(index_str);
|
|
112
|
+
S1ChordAngle radius(radius_angle);
|
|
113
|
+
S2ShapeIndexBufferedRegion region(index.get(), radius);
|
|
114
|
+
S2CellUnion covering = coverer->GetCovering(region);
|
|
115
|
+
S2_LOG(INFO) << "Covering uses " << covering.num_cells()
|
|
116
|
+
<< " cells vs. max of " << coverer->options().max_cells();
|
|
117
|
+
if (S2_VLOG_IS_ON(2)) {
|
|
118
|
+
// Output the cells in the covering for visualization purposes.
|
|
119
|
+
for (S2CellId id : covering) {
|
|
120
|
+
cout << "\nS2Polygon: " << s2textformat::ToString(S2Polygon(S2Cell(id)));
|
|
121
|
+
}
|
|
122
|
+
cout << "\n\n" << std::flush;
|
|
123
|
+
}
|
|
124
|
+
// Compute an S2Polygon representing the union of the cells in the covering.
|
|
125
|
+
S2Polygon covering_polygon;
|
|
126
|
+
covering_polygon.InitToCellUnionBorder(covering);
|
|
127
|
+
MutableS2ShapeIndex covering_index;
|
|
128
|
+
covering_index.Add(make_unique<S2Polygon::Shape>(&covering_polygon));
|
|
129
|
+
|
|
130
|
+
// (a) Check that the covering contains the original index.
|
|
131
|
+
EXPECT_TRUE(S2BooleanOperation::Contains(covering_index, *index));
|
|
132
|
+
|
|
133
|
+
// (b) Check that the distance between the boundary of the covering and the
|
|
134
|
+
// the original indexed geometry is at least "radius".
|
|
135
|
+
S2ClosestEdgeQuery query(&covering_index);
|
|
136
|
+
query.mutable_options()->set_include_interiors(false);
|
|
137
|
+
S2ClosestEdgeQuery::ShapeIndexTarget target(index.get());
|
|
138
|
+
EXPECT_FALSE(query.IsDistanceLess(&target, radius));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
TEST(S2ShapeIndexBufferedRegion, PointSet) {
|
|
142
|
+
// Test buffering a set of points.
|
|
143
|
+
S2RegionCoverer coverer;
|
|
144
|
+
coverer.mutable_options()->set_max_cells(100);
|
|
145
|
+
TestBufferIndex("10:20 | 10:23 | 10:26 # #", S1Angle::Degrees(5), &coverer);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
TEST(S2ShapeIndexBufferedRegion, Polyline) {
|
|
149
|
+
// Test buffering a polyline.
|
|
150
|
+
S2RegionCoverer coverer;
|
|
151
|
+
coverer.mutable_options()->set_max_cells(100);
|
|
152
|
+
TestBufferIndex("# 10:5, 20:30, -10:60, -60:100 #",
|
|
153
|
+
S1Angle::Degrees(2), &coverer);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
TEST(S2ShapeIndexBufferedRegion, PolygonWithHole) {
|
|
157
|
+
// Test buffering a polygon with a hole.
|
|
158
|
+
S2RegionCoverer coverer;
|
|
159
|
+
coverer.mutable_options()->set_max_cells(100);
|
|
160
|
+
TestBufferIndex("# # 10:10, 10:100, 70:0; 11:11, 69:0, 11:99",
|
|
161
|
+
S1Angle::Degrees(2), &coverer);
|
|
162
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// Copyright 2018 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
|
|
18
|
+
#include "s2/s2shape_index_measures.h"
|
|
19
|
+
|
|
20
|
+
#include "s2/s2shape_measures.h"
|
|
21
|
+
|
|
22
|
+
namespace S2 {
|
|
23
|
+
|
|
24
|
+
int GetDimension(const S2ShapeIndex& index) {
|
|
25
|
+
int dim = -1;
|
|
26
|
+
for (int i = 0; i < index.num_shape_ids(); ++i) {
|
|
27
|
+
S2Shape* shape = index.shape(i);
|
|
28
|
+
if (shape) dim = std::max(dim, shape->dimension());
|
|
29
|
+
}
|
|
30
|
+
return dim;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
int GetNumPoints(const S2ShapeIndex& index) {
|
|
34
|
+
int count = 0;
|
|
35
|
+
for (int i = 0; i < index.num_shape_ids(); ++i) {
|
|
36
|
+
S2Shape* shape = index.shape(i);
|
|
37
|
+
if (shape && shape->dimension() == 0) {
|
|
38
|
+
count += shape->num_edges();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return count;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
S1Angle GetLength(const S2ShapeIndex& index) {
|
|
45
|
+
S1Angle length;
|
|
46
|
+
for (int i = 0; i < index.num_shape_ids(); ++i) {
|
|
47
|
+
S2Shape* shape = index.shape(i);
|
|
48
|
+
if (shape) length += S2::GetLength(*shape);
|
|
49
|
+
}
|
|
50
|
+
return length;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
S1Angle GetPerimeter(const S2ShapeIndex& index) {
|
|
54
|
+
S1Angle perimeter;
|
|
55
|
+
for (int i = 0; i < index.num_shape_ids(); ++i) {
|
|
56
|
+
S2Shape* shape = index.shape(i);
|
|
57
|
+
if (shape) perimeter += S2::GetPerimeter(*shape);
|
|
58
|
+
}
|
|
59
|
+
return perimeter;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
double GetArea(const S2ShapeIndex& index) {
|
|
63
|
+
double area = 0;
|
|
64
|
+
for (int i = 0; i < index.num_shape_ids(); ++i) {
|
|
65
|
+
S2Shape* shape = index.shape(i);
|
|
66
|
+
if (shape) area += S2::GetArea(*shape);
|
|
67
|
+
}
|
|
68
|
+
return area;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
double GetApproxArea(const S2ShapeIndex& index) {
|
|
72
|
+
double area = 0;
|
|
73
|
+
for (int i = 0; i < index.num_shape_ids(); ++i) {
|
|
74
|
+
S2Shape* shape = index.shape(i);
|
|
75
|
+
if (shape) area += S2::GetApproxArea(*shape);
|
|
76
|
+
}
|
|
77
|
+
return area;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
S2Point GetCentroid(const S2ShapeIndex& index) {
|
|
81
|
+
int dim = GetDimension(index);
|
|
82
|
+
S2Point centroid;
|
|
83
|
+
for (int i = 0; i < index.num_shape_ids(); ++i) {
|
|
84
|
+
S2Shape* shape = index.shape(i);
|
|
85
|
+
if (shape && shape->dimension() == dim) {
|
|
86
|
+
centroid += S2::GetCentroid(*shape);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return centroid;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
} // namespace S2
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// Copyright 2018 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
//
|
|
18
|
+
// Defines various angle and area measures for S2ShapeIndex objects. In
|
|
19
|
+
// general, these methods return the sum of the corresponding measure for the
|
|
20
|
+
// S2Shapes in the index.
|
|
21
|
+
|
|
22
|
+
#ifndef S2_S2SHAPE_INDEX_MEASURES_H_
|
|
23
|
+
#define S2_S2SHAPE_INDEX_MEASURES_H_
|
|
24
|
+
|
|
25
|
+
#include "s2/s1angle.h"
|
|
26
|
+
#include "s2/s2point.h"
|
|
27
|
+
#include "s2/s2shape_index.h"
|
|
28
|
+
|
|
29
|
+
namespace S2 {
|
|
30
|
+
|
|
31
|
+
// Returns the maximum dimension of any shape in the index. Returns -1 if the
|
|
32
|
+
// index does not contain any shapes.
|
|
33
|
+
//
|
|
34
|
+
// Note that the dimension does *not* depend on whether the shapes in the
|
|
35
|
+
// index contain any points; for example, the dimension of an empty point set
|
|
36
|
+
// is 0, and the dimension of an empty polygon is 2.
|
|
37
|
+
int GetDimension(const S2ShapeIndex& index);
|
|
38
|
+
|
|
39
|
+
// Returns the number of points (objects of dimension zero) in the index.
|
|
40
|
+
// Note that polyline and polygon vertices are *not* included in this count.
|
|
41
|
+
int GetNumPoints(const S2ShapeIndex& index);
|
|
42
|
+
|
|
43
|
+
// Returns the total length of all polylines in the index. Returns zero if no
|
|
44
|
+
// polylines are present.
|
|
45
|
+
//
|
|
46
|
+
// All edges are modeled as spherical geodesics. The result can be converted
|
|
47
|
+
// to a distance on the Earth's surface (with a worst-case error of 0.562%
|
|
48
|
+
// near the equator) using the functions in s2earth.h.
|
|
49
|
+
S1Angle GetLength(const S2ShapeIndex& index);
|
|
50
|
+
|
|
51
|
+
// Returns the total perimeter of all polygons in the index (including both
|
|
52
|
+
// "shells" and "holes"). Returns zero if no polygons are present.
|
|
53
|
+
//
|
|
54
|
+
// All edges are modeled as spherical geodesics. The result can be converted
|
|
55
|
+
// to a distance on the Earth's surface (with a worst-case error of 0.562%
|
|
56
|
+
// near the equator) using the functions in s2earth.h.
|
|
57
|
+
S1Angle GetPerimeter(const S2ShapeIndex& index);
|
|
58
|
+
|
|
59
|
+
// Returns the total area of all polygons in the index. Returns zero if no
|
|
60
|
+
// polygons are present. This method has good relative accuracy for both very
|
|
61
|
+
// large and very small regions. Note that the result may exceed 4*Pi if the
|
|
62
|
+
// index contains overlapping polygons.
|
|
63
|
+
//
|
|
64
|
+
// All edges are modeled as spherical geodesics. The result can be converted
|
|
65
|
+
// to an area on the Earth's surface (with a worst-case error of 0.900% near
|
|
66
|
+
// the poles) using the functions in s2earth.h.
|
|
67
|
+
double GetArea(const S2ShapeIndex& index);
|
|
68
|
+
|
|
69
|
+
// Like GetArea(), except that this method is faster and has more error. The
|
|
70
|
+
// additional error is at most 2.22e-15 steradians per vertex, which works out
|
|
71
|
+
// to about 0.09 square meters per vertex on the Earth's surface. For
|
|
72
|
+
// example, a loop with 100 vertices has a maximum error of about 9 square
|
|
73
|
+
// meters. (The actual error is typically much smaller than this.)
|
|
74
|
+
double GetApproxArea(const S2ShapeIndex& index);
|
|
75
|
+
|
|
76
|
+
// Returns the centroid of all shapes whose dimension is maximal within the
|
|
77
|
+
// index, multiplied by the measure of those shapes. For example, if the
|
|
78
|
+
// index contains points and polylines, then the result is defined as the
|
|
79
|
+
// centroid of the polylines multiplied by the total length of those
|
|
80
|
+
// polylines. The points would be ignored when computing the centroid.
|
|
81
|
+
//
|
|
82
|
+
// The measure of a given shape is defined as follows:
|
|
83
|
+
//
|
|
84
|
+
// - For dimension 0 shapes, the measure is shape->num_edges().
|
|
85
|
+
// - For dimension 1 shapes, the measure is GetLength(shape).
|
|
86
|
+
// - For dimension 2 shapes, the measure is GetArea(shape).
|
|
87
|
+
//
|
|
88
|
+
// Note that the centroid is not unit length, so you may need to call
|
|
89
|
+
// Normalize() before passing it to other S2 functions. Note that this
|
|
90
|
+
// function returns (0, 0, 0) if the index contains no geometry.
|
|
91
|
+
//
|
|
92
|
+
// The centroid is scaled by the total measure of the shapes for two reasons:
|
|
93
|
+
// (1) it is cheaper to compute this way, and (2) this makes it easier to
|
|
94
|
+
// compute the centroid of a collection of shapes (since the individual
|
|
95
|
+
// centroids can simply be summed).
|
|
96
|
+
S2Point GetCentroid(const S2ShapeIndex& index);
|
|
97
|
+
|
|
98
|
+
} // namespace S2
|
|
99
|
+
|
|
100
|
+
#endif // S2_S2SHAPE_INDEX_MEASURES_H_
|