@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,138 @@
|
|
|
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_measures.h"
|
|
19
|
+
|
|
20
|
+
#include <cmath>
|
|
21
|
+
#include <vector>
|
|
22
|
+
#include "s2/s2loop_measures.h"
|
|
23
|
+
#include "s2/s2polyline_measures.h"
|
|
24
|
+
|
|
25
|
+
using std::fabs;
|
|
26
|
+
using std::vector;
|
|
27
|
+
|
|
28
|
+
namespace S2 {
|
|
29
|
+
|
|
30
|
+
S1Angle GetLength(const S2Shape& shape) {
|
|
31
|
+
if (shape.dimension() != 1) return S1Angle::Zero();
|
|
32
|
+
S1Angle length;
|
|
33
|
+
vector<S2Point> vertices;
|
|
34
|
+
int num_chains = shape.num_chains();
|
|
35
|
+
for (int chain_id = 0; chain_id < num_chains; ++chain_id) {
|
|
36
|
+
GetChainVertices(shape, chain_id, &vertices);
|
|
37
|
+
length += S2::GetLength(vertices);
|
|
38
|
+
}
|
|
39
|
+
return length;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
S1Angle GetPerimeter(const S2Shape& shape) {
|
|
43
|
+
if (shape.dimension() != 2) return S1Angle::Zero();
|
|
44
|
+
S1Angle perimeter;
|
|
45
|
+
vector<S2Point> vertices;
|
|
46
|
+
int num_chains = shape.num_chains();
|
|
47
|
+
for (int chain_id = 0; chain_id < num_chains; ++chain_id) {
|
|
48
|
+
GetChainVertices(shape, chain_id, &vertices);
|
|
49
|
+
perimeter += S2::GetPerimeter(S2PointLoopSpan(vertices));
|
|
50
|
+
}
|
|
51
|
+
return perimeter;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
double GetArea(const S2Shape& shape) {
|
|
55
|
+
if (shape.dimension() != 2) return 0.0;
|
|
56
|
+
|
|
57
|
+
// Since S2Shape uses the convention that the interior of the shape is to
|
|
58
|
+
// the left of all edges, in theory we could compute the area of the polygon
|
|
59
|
+
// by simply adding up all the loop areas modulo 4*Pi. The problem with
|
|
60
|
+
// this approach is that polygons holes typically have areas near 4*Pi,
|
|
61
|
+
// which can create large cancellation errors when computing the area of
|
|
62
|
+
// small polygons with holes. For example, a shell with an area of 4 square
|
|
63
|
+
// meters (1e-13 steradians) surrounding a hole with an area of 3 square
|
|
64
|
+
// meters (7.5e-14 sterians) would lose almost all of its accuracy if the
|
|
65
|
+
// area of the hole was computed as 12.566370614359098.
|
|
66
|
+
//
|
|
67
|
+
// So instead we use S2::GetSignedArea() to ensure that all loops have areas
|
|
68
|
+
// in the range [-2*Pi, 2*Pi].
|
|
69
|
+
double area = 0;
|
|
70
|
+
vector<S2Point> vertices;
|
|
71
|
+
int num_chains = shape.num_chains();
|
|
72
|
+
for (int chain_id = 0; chain_id < num_chains; ++chain_id) {
|
|
73
|
+
GetChainVertices(shape, chain_id, &vertices);
|
|
74
|
+
area += S2::GetSignedArea(S2PointLoopSpan(vertices));
|
|
75
|
+
}
|
|
76
|
+
// Note that S2::GetSignedArea() guarantees that the full loop (containing
|
|
77
|
+
// all points on the sphere) has a very small negative area.
|
|
78
|
+
S2_DCHECK_LE(fabs(area), 4 * M_PI);
|
|
79
|
+
if (area < 0.0) area += 4 * M_PI;
|
|
80
|
+
return area;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
double GetApproxArea(const S2Shape& shape) {
|
|
84
|
+
if (shape.dimension() != 2) return 0.0;
|
|
85
|
+
|
|
86
|
+
double area = 0;
|
|
87
|
+
vector<S2Point> vertices;
|
|
88
|
+
int num_chains = shape.num_chains();
|
|
89
|
+
for (int chain_id = 0; chain_id < num_chains; ++chain_id) {
|
|
90
|
+
GetChainVertices(shape, chain_id, &vertices);
|
|
91
|
+
area += S2::GetApproxArea(S2PointLoopSpan(vertices));
|
|
92
|
+
}
|
|
93
|
+
// Special case to ensure that full polygons are handled correctly.
|
|
94
|
+
if (area <= 4 * M_PI) return area;
|
|
95
|
+
return fmod(area, 4 * M_PI);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
S2Point GetCentroid(const S2Shape& shape) {
|
|
99
|
+
S2Point centroid;
|
|
100
|
+
vector<S2Point> vertices;
|
|
101
|
+
int dimension = shape.dimension();
|
|
102
|
+
int num_chains = shape.num_chains();
|
|
103
|
+
for (int chain_id = 0; chain_id < num_chains; ++chain_id) {
|
|
104
|
+
switch (dimension) {
|
|
105
|
+
case 0:
|
|
106
|
+
centroid += shape.edge(chain_id).v0;
|
|
107
|
+
break;
|
|
108
|
+
case 1:
|
|
109
|
+
GetChainVertices(shape, chain_id, &vertices);
|
|
110
|
+
centroid += S2::GetCentroid(S2PointSpan(vertices));
|
|
111
|
+
break;
|
|
112
|
+
default:
|
|
113
|
+
GetChainVertices(shape, chain_id, &vertices);
|
|
114
|
+
centroid += S2::GetCentroid(S2PointLoopSpan(vertices));
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return centroid;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
void GetChainVertices(const S2Shape& shape, int chain_id,
|
|
122
|
+
std::vector<S2Point>* vertices) {
|
|
123
|
+
S2Shape::Chain chain = shape.chain(chain_id);
|
|
124
|
+
int num_vertices = chain.length + (shape.dimension() == 1);
|
|
125
|
+
vertices->clear();
|
|
126
|
+
vertices->reserve(num_vertices);
|
|
127
|
+
int e = 0;
|
|
128
|
+
if (num_vertices & 1) {
|
|
129
|
+
vertices->push_back(shape.chain_edge(chain_id, e++).v0);
|
|
130
|
+
}
|
|
131
|
+
for (; e < num_vertices; e += 2) {
|
|
132
|
+
auto edge = shape.chain_edge(chain_id, e);
|
|
133
|
+
vertices->push_back(edge.v0);
|
|
134
|
+
vertices->push_back(edge.v1);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
} // namespace S2
|
|
@@ -0,0 +1,95 @@
|
|
|
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 S2Shape objects. Unlike the
|
|
19
|
+
// built-in S2Polygon and S2Polyline methods, these methods allow the
|
|
20
|
+
// underlying data to be represented arbitrarily.
|
|
21
|
+
|
|
22
|
+
#ifndef S2_S2SHAPE_MEASURES_H_
|
|
23
|
+
#define S2_S2SHAPE_MEASURES_H_
|
|
24
|
+
|
|
25
|
+
#include <vector>
|
|
26
|
+
|
|
27
|
+
#include "s2/s1angle.h"
|
|
28
|
+
#include "s2/s2point.h"
|
|
29
|
+
#include "s2/s2shape.h"
|
|
30
|
+
|
|
31
|
+
namespace S2 {
|
|
32
|
+
|
|
33
|
+
// For shapes of dimension 1, returns the sum of all polyline lengths on the
|
|
34
|
+
// unit sphere. Otherwise returns zero. (See GetPerimeter for shapes of
|
|
35
|
+
// dimension 2.)
|
|
36
|
+
//
|
|
37
|
+
// All edges are modeled as spherical geodesics. The result can be converted
|
|
38
|
+
// to a distance on the Earth's surface (with a worst-case error of 0.562%
|
|
39
|
+
// near the equator) using the functions in s2earth.h.
|
|
40
|
+
S1Angle GetLength(const S2Shape& shape);
|
|
41
|
+
|
|
42
|
+
// For shapes of dimension 2, returns the sum of all loop perimeters on the
|
|
43
|
+
// unit sphere. Otherwise returns zero. (See GetLength for shapes of
|
|
44
|
+
// dimension 1.)
|
|
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 GetPerimeter(const S2Shape& shape);
|
|
50
|
+
|
|
51
|
+
// For shapes of dimension 2, returns the area of the shape on the unit
|
|
52
|
+
// sphere. The result is between 0 and 4*Pi steradians. Otherwise returns
|
|
53
|
+
// zero. This method has good relative accuracy for both very large and very
|
|
54
|
+
// small regions.
|
|
55
|
+
//
|
|
56
|
+
// All edges are modeled as spherical geodesics. The result can be converted
|
|
57
|
+
// to an area on the Earth's surface (with a worst-case error of 0.900% near
|
|
58
|
+
// the poles) using the functions in s2earth.h.
|
|
59
|
+
double GetArea(const S2Shape& shape);
|
|
60
|
+
|
|
61
|
+
// Like GetArea(), except that this method is faster and has more error. The
|
|
62
|
+
// additional error is at most 2.22e-15 steradians per vertex, which works out
|
|
63
|
+
// to about 0.09 square meters per vertex on the Earth's surface. For
|
|
64
|
+
// example, a loop with 100 vertices has a maximum error of about 9 square
|
|
65
|
+
// meters. (The actual error is typically much smaller than this.)
|
|
66
|
+
double GetApproxArea(const S2Shape& shape);
|
|
67
|
+
|
|
68
|
+
// Returns the centroid of the shape multiplied by the measure of the shape,
|
|
69
|
+
// which is defined as follows:
|
|
70
|
+
//
|
|
71
|
+
// - For dimension 0 shapes, the measure is shape->num_edges().
|
|
72
|
+
// - For dimension 1 shapes, the measure is GetLength(shape).
|
|
73
|
+
// - For dimension 2 shapes, the measure is GetArea(shape).
|
|
74
|
+
//
|
|
75
|
+
// Note that the result is not unit length, so you may need to call
|
|
76
|
+
// Normalize() before passing it to other S2 functions.
|
|
77
|
+
//
|
|
78
|
+
// The result is scaled by the measure defined above for two reasons: (1) it
|
|
79
|
+
// is cheaper to compute this way, and (2) this makes it easier to compute the
|
|
80
|
+
// centroid of a collection of shapes. (This requires simply summing the
|
|
81
|
+
// centroids of all shapes in the collection whose dimension is maximal.)
|
|
82
|
+
S2Point GetCentroid(const S2Shape& shape);
|
|
83
|
+
|
|
84
|
+
// Overwrites "vertices" with the vertices of the given edge chain of "shape".
|
|
85
|
+
// If dimension == 1, the chain will have (chain.length + 1) vertices, and
|
|
86
|
+
// otherwise it will have (chain.length) vertices.
|
|
87
|
+
//
|
|
88
|
+
// This is a low-level helper method used in the implementations of some of
|
|
89
|
+
// the methods above.
|
|
90
|
+
void GetChainVertices(const S2Shape& shape, int chain_id,
|
|
91
|
+
std::vector<S2Point>* vertices);
|
|
92
|
+
|
|
93
|
+
} // namespace S2
|
|
94
|
+
|
|
95
|
+
#endif // S2_S2SHAPE_MEASURES_H_
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// Copyright 2018 Google Inc. All Rights Reserved.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS-IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
//
|
|
15
|
+
|
|
16
|
+
// Author: ericv@google.com (Eric Veach)
|
|
17
|
+
//
|
|
18
|
+
// Note that the "real" testing of these methods is in s2loop_measures_test
|
|
19
|
+
// and s2polyline_measures_test. This file only checks the handling of shapes
|
|
20
|
+
// of different dimensions and shapes with multiple edge chains.
|
|
21
|
+
|
|
22
|
+
#include "s2/s2shape_measures.h"
|
|
23
|
+
|
|
24
|
+
#include <gtest/gtest.h>
|
|
25
|
+
#include "s2/mutable_s2shape_index.h"
|
|
26
|
+
#include "s2/s2edge_vector_shape.h"
|
|
27
|
+
#include "s2/s2lax_polygon_shape.h"
|
|
28
|
+
#include "s2/s2lax_polyline_shape.h"
|
|
29
|
+
#include "s2/s2pointutil.h"
|
|
30
|
+
#include "s2/s2polygon.h"
|
|
31
|
+
#include "s2/s2text_format.h"
|
|
32
|
+
|
|
33
|
+
using s2textformat::MakeIndexOrDie;
|
|
34
|
+
using s2textformat::MakeLaxPolygonOrDie;
|
|
35
|
+
using s2textformat::MakeLaxPolylineOrDie;
|
|
36
|
+
using s2textformat::MakePolygonOrDie;
|
|
37
|
+
using s2textformat::ParsePointsOrDie;
|
|
38
|
+
|
|
39
|
+
namespace {
|
|
40
|
+
|
|
41
|
+
TEST(GetLength, WrongDimension) {
|
|
42
|
+
EXPECT_EQ(S1Angle::Zero(),
|
|
43
|
+
S2::GetLength(*MakeIndexOrDie("0:0 # #")->shape(0)));
|
|
44
|
+
EXPECT_EQ(S1Angle::Zero(),
|
|
45
|
+
S2::GetLength(*MakeLaxPolygonOrDie("0:0, 0:1, 1:0")));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
TEST(GetLength, NoPolylines) {
|
|
49
|
+
EXPECT_EQ(S1Angle::Zero(), S2::GetLength(*MakeLaxPolylineOrDie("")));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
TEST(GetLength, ThreePolylinesInOneShape) {
|
|
53
|
+
// S2EdgeVectorShape is the only standard S2Shape that can have more than
|
|
54
|
+
// one edge chain of dimension 1.
|
|
55
|
+
auto p = ParsePointsOrDie("0:0, 1:0, 2:0, 3:0");
|
|
56
|
+
S2EdgeVectorShape shape({{p[0], p[1]}, {p[0], p[2]}, {p[0], p[3]}});
|
|
57
|
+
EXPECT_EQ(S1Angle::Degrees(6), S2::GetLength(shape));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
TEST(GetPerimeter, WrongDimension) {
|
|
61
|
+
EXPECT_EQ(S1Angle::Zero(),
|
|
62
|
+
S2::GetPerimeter(*MakeIndexOrDie("0:0 # #")->shape(0)));
|
|
63
|
+
EXPECT_EQ(S1Angle::Zero(),
|
|
64
|
+
S2::GetPerimeter(*MakeLaxPolylineOrDie("0:0, 0:1, 1:0")));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
TEST(GetPerimeter, EmptyPolygon) {
|
|
68
|
+
EXPECT_EQ(S1Angle::Zero(), S2::GetPerimeter(*MakeLaxPolygonOrDie("empty")));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
TEST(GetPerimeter, FullPolygon) {
|
|
72
|
+
EXPECT_EQ(S1Angle::Zero(), S2::GetPerimeter(*MakeLaxPolygonOrDie("full")));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
TEST(GetPerimeter, TwoLoopPolygon) {
|
|
76
|
+
// To ensure that all edges are 1 degree long, we use degenerate loops.
|
|
77
|
+
EXPECT_EQ(S1Angle::Degrees(6),
|
|
78
|
+
S2::GetPerimeter(*MakeLaxPolygonOrDie("0:0, 1:0; 0:1, 0:2, 0:3")));
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
TEST(GetArea, WrongDimension) {
|
|
82
|
+
EXPECT_EQ(0.0, S2::GetArea(*MakeIndexOrDie("0:0 # #")->shape(0)));
|
|
83
|
+
EXPECT_EQ(0.0, S2::GetArea(*MakeLaxPolylineOrDie("0:0, 0:1, 1:0")));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
TEST(GetArea, EmptyPolygon) {
|
|
87
|
+
EXPECT_EQ(0.0, S2::GetArea(*MakeLaxPolygonOrDie("empty")));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
TEST(GetArea, FullPolygon) {
|
|
91
|
+
EXPECT_EQ(4 * M_PI, S2::GetArea(*MakeLaxPolygonOrDie("full")));
|
|
92
|
+
EXPECT_EQ(4 * M_PI,
|
|
93
|
+
S2::GetArea(S2Polygon::OwningShape(MakePolygonOrDie("full"))));
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
TEST(GetArea, TwoTinyShells) {
|
|
97
|
+
// Two small squares with sides about 10 um (micrometers) long.
|
|
98
|
+
double side = S1Angle::Degrees(1e-10).radians();
|
|
99
|
+
EXPECT_EQ(2 * side * side, S2::GetArea(*MakeLaxPolygonOrDie(
|
|
100
|
+
"0:0, 0:1e-10, 1e-10:1e-10, 1e-10:0; "
|
|
101
|
+
"0:0, 0:-1e-10, -1e-10:-1e-10, -1e-10:0")));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
TEST(GetArea, TinyShellAndHole) {
|
|
105
|
+
// A square about 20 um on each side with a hole 10 um on each side.
|
|
106
|
+
double side = S1Angle::Degrees(1e-10).radians();
|
|
107
|
+
EXPECT_EQ(3 * side * side, S2::GetArea(*MakeLaxPolygonOrDie(
|
|
108
|
+
"0:0, 0:2e-10, 2e-10:2e-10, 2e-10:0; "
|
|
109
|
+
"0.5e-10:0.5e-10, 1.5e-10:0.5e-10, 1.5e-10:1.5e-10, 0.5e-10:1.5e-10")));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
TEST(GetApproxArea, LargeShellAndHolePolygon) {
|
|
113
|
+
// Make sure that GetApproxArea works well for large polygons.
|
|
114
|
+
EXPECT_NEAR(S2::GetApproxArea(*MakeLaxPolygonOrDie(
|
|
115
|
+
"0:0, 0:90, 90:0; 0:22.5, 90:0, 0:67.5")),
|
|
116
|
+
M_PI_4, 1e-12);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
TEST(GetCentroid, Points) {
|
|
120
|
+
// GetCentroid() returns the centroid multiplied by the number of points.
|
|
121
|
+
EXPECT_EQ(S2Point(1, 1, 0),
|
|
122
|
+
S2::GetCentroid(*MakeIndexOrDie("0:0 | 0:90 # #")->shape(0)));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
TEST(GetCentroid, Polyline) {
|
|
126
|
+
// GetCentroid returns the centroid multiplied by the length of the polyline.
|
|
127
|
+
EXPECT_TRUE(S2::ApproxEquals(
|
|
128
|
+
S2Point(1, 1, 0),
|
|
129
|
+
S2::GetCentroid(*MakeLaxPolylineOrDie("0:0, 0:90"))));
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
TEST(GetCentroid, Polygon) {
|
|
133
|
+
// GetCentroid returns the centroid multiplied by the area of the polygon.
|
|
134
|
+
EXPECT_TRUE(S2::ApproxEquals(
|
|
135
|
+
S2Point(M_PI_4, M_PI_4, M_PI_4),
|
|
136
|
+
S2::GetCentroid(*MakeLaxPolygonOrDie("0:0, 0:90, 90:0"))));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
} // namespace
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// Copyright 2013 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/s2shapeutil_build_polygon_boundaries.h"
|
|
19
|
+
|
|
20
|
+
#include "s2/util/gtl/btree_map.h"
|
|
21
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
22
|
+
#include "s2/mutable_s2shape_index.h"
|
|
23
|
+
#include "s2/s2contains_point_query.h"
|
|
24
|
+
#include "s2/s2shape_index.h"
|
|
25
|
+
#include "s2/s2shapeutil_contains_brute_force.h"
|
|
26
|
+
|
|
27
|
+
using absl::WrapUnique;
|
|
28
|
+
using std::vector;
|
|
29
|
+
|
|
30
|
+
namespace s2shapeutil {
|
|
31
|
+
|
|
32
|
+
void BuildPolygonBoundaries(const vector<vector<S2Shape*>>& components,
|
|
33
|
+
vector<vector<S2Shape*>>* polygons) {
|
|
34
|
+
polygons->clear();
|
|
35
|
+
if (components.empty()) return;
|
|
36
|
+
|
|
37
|
+
// Since the loop boundaries do not cross, a loop nesting hierarchy can be
|
|
38
|
+
// defined by choosing any point on the sphere as the "point at infinity".
|
|
39
|
+
// Loop A then contains loop B if (1) A contains the boundary of B and (2)
|
|
40
|
+
// loop A does not contain the point at infinity.
|
|
41
|
+
//
|
|
42
|
+
// We choose S2::Origin() for this purpose. The loop nesting hierarchy then
|
|
43
|
+
// determines the face structure. Here are the details:
|
|
44
|
+
//
|
|
45
|
+
// 1. Build an S2ShapeIndex of all loops that do not contain S2::Origin().
|
|
46
|
+
// This leaves at most one unindexed loop per connected component
|
|
47
|
+
// (the "outer loop").
|
|
48
|
+
//
|
|
49
|
+
// 2. For each component, choose a representative vertex and determine
|
|
50
|
+
// which indexed loops contain it. The "depth" of this component is
|
|
51
|
+
// defined as the number of such loops.
|
|
52
|
+
//
|
|
53
|
+
// 3. Assign the outer loop of each component to the containing loop whose
|
|
54
|
+
// depth is one less. This generates a set of multi-loop polygons.
|
|
55
|
+
//
|
|
56
|
+
// 4. The outer loops of all components at depth 0 become a single face.
|
|
57
|
+
|
|
58
|
+
MutableS2ShapeIndex index;
|
|
59
|
+
// A map from shape.id() to the corresponding component number.
|
|
60
|
+
vector<int> component_ids;
|
|
61
|
+
vector<S2Shape*> outer_loops;
|
|
62
|
+
for (int i = 0; i < components.size(); ++i) {
|
|
63
|
+
const auto& component = components[i];
|
|
64
|
+
for (S2Shape* loop : component) {
|
|
65
|
+
if (component.size() > 1 &&
|
|
66
|
+
!s2shapeutil::ContainsBruteForce(*loop, S2::Origin())) {
|
|
67
|
+
// Ownership is transferred back at the end of this function.
|
|
68
|
+
index.Add(WrapUnique(loop));
|
|
69
|
+
component_ids.push_back(i);
|
|
70
|
+
} else {
|
|
71
|
+
outer_loops.push_back(loop);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Check that there is exactly one outer loop in each component.
|
|
75
|
+
S2_DCHECK_EQ(i + 1, outer_loops.size()) << "Component is not a subdivision";
|
|
76
|
+
}
|
|
77
|
+
// Find the loops containing each component.
|
|
78
|
+
vector<vector<S2Shape*>> ancestors(components.size());
|
|
79
|
+
auto contains_query = MakeS2ContainsPointQuery(&index);
|
|
80
|
+
for (int i = 0; i < outer_loops.size(); ++i) {
|
|
81
|
+
auto loop = outer_loops[i];
|
|
82
|
+
S2_DCHECK_GT(loop->num_edges(), 0);
|
|
83
|
+
ancestors[i] = contains_query.GetContainingShapes(loop->edge(0).v0);
|
|
84
|
+
}
|
|
85
|
+
// Assign each outer loop to the component whose depth is one less.
|
|
86
|
+
// Components at depth 0 become a single face.
|
|
87
|
+
gtl::btree_map<S2Shape*, vector<S2Shape*>> children;
|
|
88
|
+
for (int i = 0; i < outer_loops.size(); ++i) {
|
|
89
|
+
S2Shape* ancestor = nullptr;
|
|
90
|
+
int depth = ancestors[i].size();
|
|
91
|
+
if (depth > 0) {
|
|
92
|
+
for (auto candidate : ancestors[i]) {
|
|
93
|
+
if (ancestors[component_ids[candidate->id()]].size() == depth - 1) {
|
|
94
|
+
S2_DCHECK(ancestor == nullptr);
|
|
95
|
+
ancestor = candidate;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
S2_DCHECK(ancestor != nullptr);
|
|
99
|
+
}
|
|
100
|
+
children[ancestor].push_back(outer_loops[i]);
|
|
101
|
+
}
|
|
102
|
+
// There is one face per loop that is not an outer loop, plus one for the
|
|
103
|
+
// outer loops of components at depth 0.
|
|
104
|
+
polygons->resize(index.num_shape_ids() + 1);
|
|
105
|
+
for (int i = 0; i < index.num_shape_ids(); ++i) {
|
|
106
|
+
auto polygon = &(*polygons)[i];
|
|
107
|
+
auto loop = index.shape(i);
|
|
108
|
+
auto itr = children.find(loop);
|
|
109
|
+
if (itr != children.end()) {
|
|
110
|
+
*polygon = itr->second;
|
|
111
|
+
}
|
|
112
|
+
polygon->push_back(loop);
|
|
113
|
+
}
|
|
114
|
+
polygons->back() = children[nullptr];
|
|
115
|
+
|
|
116
|
+
// Explicitly release the shapes from the index so they are not deleted.
|
|
117
|
+
for (auto& ptr : index.ReleaseAll()) ptr.release();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
} // namespace s2shapeutil
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Copyright 2013 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_S2SHAPEUTIL_BUILD_POLYGON_BOUNDARIES_H_
|
|
19
|
+
#define S2_S2SHAPEUTIL_BUILD_POLYGON_BOUNDARIES_H_
|
|
20
|
+
|
|
21
|
+
#include <vector>
|
|
22
|
+
|
|
23
|
+
#include "s2/s2shape_index.h"
|
|
24
|
+
|
|
25
|
+
namespace s2shapeutil {
|
|
26
|
+
|
|
27
|
+
// The purpose of this function is to construct polygons consisting of
|
|
28
|
+
// multiple loops. It takes as input a collection of loops whose boundaries
|
|
29
|
+
// do not cross, and groups them into polygons whose interiors do not
|
|
30
|
+
// intersect (where the boundary of each polygon may consist of multiple
|
|
31
|
+
// loops).
|
|
32
|
+
//
|
|
33
|
+
// some of those islands have lakes, then the input to this function would
|
|
34
|
+
// islands, and their lakes. Each loop would actually be present twice, once
|
|
35
|
+
// in each direction (see below). The output would consist of one polygon
|
|
36
|
+
// representing each lake, one polygon representing each island not including
|
|
37
|
+
// islands or their lakes, and one polygon representing the rest of the world
|
|
38
|
+
//
|
|
39
|
+
// This method is intended for internal use; external clients should use
|
|
40
|
+
// S2Builder, which has more convenient interface.
|
|
41
|
+
//
|
|
42
|
+
// The input consists of a set of connected components, where each component
|
|
43
|
+
// consists of one or more loops. The components must satisfy the following
|
|
44
|
+
// properties:
|
|
45
|
+
//
|
|
46
|
+
// - The loops in each component must form a subdivision of the sphere (i.e.,
|
|
47
|
+
// they must cover the entire sphere without overlap), except that a
|
|
48
|
+
// component may consist of a single loop if and only if that loop is
|
|
49
|
+
// degenerate (i.e., its interior is empty).
|
|
50
|
+
//
|
|
51
|
+
// - The boundaries of different components must be disjoint (i.e. no
|
|
52
|
+
// crossing edges or shared vertices).
|
|
53
|
+
//
|
|
54
|
+
// - No component should be empty, and no loop should have zero edges.
|
|
55
|
+
//
|
|
56
|
+
// The output consists of a set of polygons, where each polygon is defined by
|
|
57
|
+
// the collection of loops that form its boundary. This function does not
|
|
58
|
+
// actually construct any S2Shapes; it simply identifies the loops that belong
|
|
59
|
+
// to each polygon.
|
|
60
|
+
void BuildPolygonBoundaries(
|
|
61
|
+
const std::vector<std::vector<S2Shape*>>& components,
|
|
62
|
+
std::vector<std::vector<S2Shape*>>* polygons);
|
|
63
|
+
|
|
64
|
+
} // namespace s2shapeutil
|
|
65
|
+
|
|
66
|
+
#endif // S2_S2SHAPEUTIL_BUILD_POLYGON_BOUNDARIES_H_
|