@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,312 @@
|
|
|
1
|
+
// Copyright 2016 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/s2builderutil_s2polygon_layer.h"
|
|
19
|
+
|
|
20
|
+
#include <algorithm>
|
|
21
|
+
#include <map>
|
|
22
|
+
#include <memory>
|
|
23
|
+
#include <set>
|
|
24
|
+
#include <string>
|
|
25
|
+
#include "s2/base/casts.h"
|
|
26
|
+
#include "s2/base/integral_types.h"
|
|
27
|
+
#include <gtest/gtest.h>
|
|
28
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
29
|
+
#include "s2/mutable_s2shape_index.h"
|
|
30
|
+
#include "s2/s2debug.h"
|
|
31
|
+
#include "s2/s2text_format.h"
|
|
32
|
+
|
|
33
|
+
using absl::make_unique;
|
|
34
|
+
using s2builderutil::IndexedS2PolygonLayer;
|
|
35
|
+
using s2builderutil::S2PolygonLayer;
|
|
36
|
+
using s2textformat::MakePolylineOrDie;
|
|
37
|
+
using std::map;
|
|
38
|
+
using std::set;
|
|
39
|
+
using std::unique_ptr;
|
|
40
|
+
using std::vector;
|
|
41
|
+
|
|
42
|
+
using EdgeType = S2Builder::EdgeType;
|
|
43
|
+
|
|
44
|
+
namespace {
|
|
45
|
+
|
|
46
|
+
void TestS2Polygon(const vector<const char*>& input_strs,
|
|
47
|
+
const char* expected_str, EdgeType edge_type) {
|
|
48
|
+
SCOPED_TRACE(edge_type == EdgeType::DIRECTED ? "DIRECTED" : "UNDIRECTED");
|
|
49
|
+
S2Builder builder{S2Builder::Options()};
|
|
50
|
+
S2Polygon output;
|
|
51
|
+
builder.StartLayer(make_unique<S2PolygonLayer>(
|
|
52
|
+
&output, S2PolygonLayer::Options(edge_type)));
|
|
53
|
+
bool is_full = false;
|
|
54
|
+
for (auto input_str : input_strs) {
|
|
55
|
+
if (string(input_str) == "full") is_full = true;
|
|
56
|
+
builder.AddPolygon(*s2textformat::MakeVerbatimPolygonOrDie(input_str));
|
|
57
|
+
}
|
|
58
|
+
builder.AddIsFullPolygonPredicate(S2Builder::IsFullPolygon(is_full));
|
|
59
|
+
S2Error error;
|
|
60
|
+
ASSERT_TRUE(builder.Build(&error));
|
|
61
|
+
// The input strings in tests may not be in normalized form, so we build an
|
|
62
|
+
// S2Polygon and convert it back to a string.
|
|
63
|
+
unique_ptr<S2Polygon> expected(s2textformat::MakePolygon(expected_str));
|
|
64
|
+
EXPECT_EQ(s2textformat::ToString(*expected),
|
|
65
|
+
s2textformat::ToString(output));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
void TestS2Polygon(const vector<const char*>& input_strs,
|
|
69
|
+
const char* expected_str) {
|
|
70
|
+
TestS2Polygon(input_strs, expected_str, EdgeType::DIRECTED);
|
|
71
|
+
TestS2Polygon(input_strs, expected_str, EdgeType::UNDIRECTED);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
void TestS2PolygonUnchanged(const char* input_str) {
|
|
75
|
+
TestS2Polygon(vector<const char*>{input_str}, input_str);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Unlike the methods above, the input consists of a set of *polylines*.
|
|
79
|
+
void TestS2PolygonError(const vector<const char*>& input_strs,
|
|
80
|
+
S2Error::Code expected_error, EdgeType edge_type) {
|
|
81
|
+
SCOPED_TRACE(edge_type == EdgeType::DIRECTED ? "DIRECTED" : "UNDIRECTED");
|
|
82
|
+
S2Builder builder{S2Builder::Options()};
|
|
83
|
+
S2Polygon output;
|
|
84
|
+
S2PolygonLayer::Options options(edge_type);
|
|
85
|
+
options.set_validate(true);
|
|
86
|
+
builder.StartLayer(make_unique<S2PolygonLayer>(&output, options));
|
|
87
|
+
for (auto input_str : input_strs) {
|
|
88
|
+
builder.AddPolyline(*s2textformat::MakePolyline(input_str));
|
|
89
|
+
}
|
|
90
|
+
S2Error error;
|
|
91
|
+
ASSERT_FALSE(builder.Build(&error));
|
|
92
|
+
EXPECT_EQ(expected_error, error.code());
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
void TestS2PolygonError(const vector<const char*>& input_strs,
|
|
96
|
+
S2Error::Code expected_error) {
|
|
97
|
+
TestS2PolygonError(input_strs, expected_error, EdgeType::DIRECTED);
|
|
98
|
+
TestS2PolygonError(input_strs, expected_error, EdgeType::UNDIRECTED);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
TEST(S2PolygonLayer, Empty) {
|
|
102
|
+
TestS2PolygonUnchanged("");
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
TEST(S2PolygonLayer, Full) {
|
|
106
|
+
TestS2PolygonUnchanged("full");
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
TEST(S2PolygonLayer, SmallLoop) {
|
|
110
|
+
TestS2PolygonUnchanged("0:0, 0:1, 1:1");
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
TEST(S2PolygonLayer, ThreeLoops) {
|
|
114
|
+
// The second two loops are nested.
|
|
115
|
+
TestS2PolygonUnchanged("0:1, 1:1, 0:0; "
|
|
116
|
+
"3:3, 3:6, 6:6, 6:3; "
|
|
117
|
+
"4:4, 4:5, 5:5, 5:4");
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
TEST(S2PolygonLayer, PartialLoop) {
|
|
121
|
+
TestS2PolygonError({"0:1, 2:3, 4:5"},
|
|
122
|
+
S2Error::BUILDER_EDGES_DO_NOT_FORM_LOOPS);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
TEST(S2PolygonLayer, InvalidPolygon) {
|
|
126
|
+
TestS2PolygonError({"0:0, 0:10, 10:0, 10:10, 0:0"},
|
|
127
|
+
S2Error::LOOP_SELF_INTERSECTION);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
TEST(S2PolygonLayer, DuplicateInputEdges) {
|
|
131
|
+
// Check that S2PolygonLayer can assemble polygons even when there are
|
|
132
|
+
// duplicate edges (after sibling pairs are removed), and then report the
|
|
133
|
+
// duplicate edges as an error.
|
|
134
|
+
S2Builder builder{S2Builder::Options()};
|
|
135
|
+
S2Polygon output;
|
|
136
|
+
S2PolygonLayer::Options options;
|
|
137
|
+
options.set_validate(true);
|
|
138
|
+
builder.StartLayer(make_unique<S2PolygonLayer>(&output, options));
|
|
139
|
+
builder.AddPolyline(*MakePolylineOrDie(
|
|
140
|
+
"0:0, 0:2, 2:2, 1:1, 0:2, 2:2, 2:0, 0:0"));
|
|
141
|
+
S2Error error;
|
|
142
|
+
EXPECT_FALSE(builder.Build(&error));
|
|
143
|
+
EXPECT_EQ(S2Error::POLYGON_LOOPS_SHARE_EDGE, error.code());
|
|
144
|
+
ASSERT_EQ(2, output.num_loops());
|
|
145
|
+
unique_ptr<S2Loop> loop0(s2textformat::MakeLoop("0:0, 0:2, 2:2, 2:0"));
|
|
146
|
+
unique_ptr<S2Loop> loop1(s2textformat::MakeLoop("0:2, 2:2, 1:1"));
|
|
147
|
+
EXPECT_TRUE(loop0->Equals(output.loop(0)));
|
|
148
|
+
EXPECT_TRUE(loop1->Equals(output.loop(1)));
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Since we don't expect to have any crossing edges, the key for each edge is
|
|
152
|
+
// simply the sum of its endpoints. This key has the advantage of being
|
|
153
|
+
// unchanged when the endpoints of an edge are swapped.
|
|
154
|
+
using EdgeLabelMap = map<S2Point, set<int32>>;
|
|
155
|
+
|
|
156
|
+
void AddPolylineWithLabels(const S2Polyline& polyline, EdgeType edge_type,
|
|
157
|
+
int32 label_begin, S2Builder* builder,
|
|
158
|
+
EdgeLabelMap *edge_label_map) {
|
|
159
|
+
for (int i = 0; i + 1 < polyline.num_vertices(); ++i) {
|
|
160
|
+
int32 label = label_begin + i;
|
|
161
|
+
builder->set_label(label);
|
|
162
|
+
// With undirected edges, reverse the direction of every other input edge.
|
|
163
|
+
int dir = edge_type == EdgeType::DIRECTED ? 1 : (i & 1);
|
|
164
|
+
builder->AddEdge(polyline.vertex(i + (1 - dir)), polyline.vertex(i + dir));
|
|
165
|
+
S2Point key = polyline.vertex(i) + polyline.vertex(i + 1);
|
|
166
|
+
(*edge_label_map)[key].insert(label);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
static void TestEdgeLabels(EdgeType edge_type) {
|
|
171
|
+
S2Builder builder{S2Builder::Options()};
|
|
172
|
+
S2Polygon output;
|
|
173
|
+
S2PolygonLayer::LabelSetIds label_set_ids;
|
|
174
|
+
IdSetLexicon label_set_lexicon;
|
|
175
|
+
builder.StartLayer(make_unique<S2PolygonLayer>(
|
|
176
|
+
&output, &label_set_ids, &label_set_lexicon,
|
|
177
|
+
S2PolygonLayer::Options(edge_type)));
|
|
178
|
+
|
|
179
|
+
// We use a polygon consisting of 3 loops. The loops are reordered and
|
|
180
|
+
// some of the loops are inverted during S2Polygon construction.
|
|
181
|
+
EdgeLabelMap edge_label_map;
|
|
182
|
+
AddPolylineWithLabels(*MakePolylineOrDie("0:0, 9:1, 1:9, 0:0, 2:8, 8:2, "
|
|
183
|
+
"0:0, 0:10, 10:10, 10:0, 0:0"),
|
|
184
|
+
edge_type, 0, &builder, &edge_label_map);
|
|
185
|
+
S2Error error;
|
|
186
|
+
ASSERT_TRUE(builder.Build(&error));
|
|
187
|
+
vector<int> expected_loop_sizes = { 4, 3, 3 };
|
|
188
|
+
ASSERT_EQ(expected_loop_sizes.size(), label_set_ids.size());
|
|
189
|
+
for (int i = 0; i < expected_loop_sizes.size(); ++i) {
|
|
190
|
+
ASSERT_EQ(expected_loop_sizes[i], label_set_ids[i].size());
|
|
191
|
+
for (int j = 0; j < label_set_ids[i].size(); ++j) {
|
|
192
|
+
S2Point key = output.loop(i)->vertex(j) + output.loop(i)->vertex(j + 1);
|
|
193
|
+
const set<int32>& expected_labels = edge_label_map[key];
|
|
194
|
+
ASSERT_EQ(expected_labels.size(),
|
|
195
|
+
label_set_lexicon.id_set(label_set_ids[i][j]).size());
|
|
196
|
+
EXPECT_TRUE(std::equal(
|
|
197
|
+
expected_labels.begin(), expected_labels.end(),
|
|
198
|
+
label_set_lexicon.id_set(label_set_ids[i][j]).begin()));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
TEST(S2PolygonLayer, DirectedEdgeLabels) {
|
|
204
|
+
TestEdgeLabels(EdgeType::DIRECTED);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
TEST(S2PolygonLayer, UndirectedEdgeLabels) {
|
|
208
|
+
TestEdgeLabels(EdgeType::UNDIRECTED);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
TEST(S2PolygonLayer, ThreeLoopsIntoOne) {
|
|
212
|
+
// Three loops (two shells and one hole) that combine into one.
|
|
213
|
+
TestS2Polygon(
|
|
214
|
+
{"10:0, 0:0, 0:10, 5:10, 10:10, 10:5",
|
|
215
|
+
"0:10, 0:15, 5:15, 5:10",
|
|
216
|
+
"10:10, 5:10, 5:5, 10:5"},
|
|
217
|
+
"10:5, 10:0, 0:0, 0:10, 0:15, 5:15, 5:10, 5:5");
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
TEST(S2PolygonLayer, TrianglePyramid) {
|
|
221
|
+
// A big CCW triangle containing 3 CW triangular holes. The whole thing
|
|
222
|
+
// looks like a pyramid of nine triangles. The output consists of 6
|
|
223
|
+
// positive triangles with no holes.
|
|
224
|
+
TestS2Polygon(
|
|
225
|
+
{"0:0, 0:2, 0:4, 0:6, 1:5, 2:4, 3:3, 2:2, 1:1",
|
|
226
|
+
"0:2, 1:1, 1:3",
|
|
227
|
+
"0:4, 1:3, 1:5",
|
|
228
|
+
"1:3, 2:2, 2:4"},
|
|
229
|
+
"0:4, 0:6, 1:5; 2:4, 3:3, 2:2; 2:2, 1:1, 1:3; "
|
|
230
|
+
"1:1, 0:0, 0:2; 1:3, 0:2, 0:4; 1:3, 1:5, 2:4");
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
TEST(S2PolygonLayer, ComplexNesting) {
|
|
234
|
+
// A complex set of nested polygons, with the loops in random order and the
|
|
235
|
+
// vertices in random cyclic order within each loop. This test checks that
|
|
236
|
+
// the order (after S2Polygon::InitNested is called) is preserved exactly,
|
|
237
|
+
// whether directed or undirected edges are used.
|
|
238
|
+
TestS2PolygonUnchanged(
|
|
239
|
+
"47:15, 47:5, 5:5, 5:15; "
|
|
240
|
+
"35:12, 35:7, 27:7, 27:12; "
|
|
241
|
+
"1:50, 50:50, 50:1, 1:1; "
|
|
242
|
+
"42:22, 10:22, 10:25, 42:25; "
|
|
243
|
+
"47:30, 47:17, 5:17, 5:30; "
|
|
244
|
+
"7:27, 45:27, 45:20, 7:20; "
|
|
245
|
+
"37:7, 37:12, 45:12, 45:7; "
|
|
246
|
+
"47:47, 47:32, 5:32, 5:47; "
|
|
247
|
+
"50:60, 50:55, 1:55, 1:60; "
|
|
248
|
+
"25:7, 17:7, 17:12, 25:12; "
|
|
249
|
+
"7:7, 7:12, 15:12, 15:7");
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
TEST(S2PolygonLayer, FiveLoopsTouchingAtOneCommonPoint) {
|
|
253
|
+
// Five nested loops that touch at one common point.
|
|
254
|
+
TestS2PolygonUnchanged("0:0, 0:10, 10:10, 10:0; "
|
|
255
|
+
"0:0, 1:9, 9:9, 9:1; "
|
|
256
|
+
"0:0, 2:8, 8:8, 8:2; "
|
|
257
|
+
"0:0, 3:7, 7:7, 7:3; "
|
|
258
|
+
"0:0, 4:6, 6:6, 6:4");
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
TEST(S2PolygonLayer, FourNestedDiamondsTouchingAtTwoPointsPerPair) {
|
|
262
|
+
// Four diamonds nested inside each other, where each diamond shares two
|
|
263
|
+
// vertices with the diamond inside it and shares its other two vertices
|
|
264
|
+
// with the diamond that contains it. The resulting shape looks vaguely
|
|
265
|
+
// like an eye made out of chevrons.
|
|
266
|
+
TestS2Polygon(
|
|
267
|
+
{"0:10, -10:0, 0:-10, 10:0",
|
|
268
|
+
"0:-20, -10:0, 0:20, 10:0",
|
|
269
|
+
"0:-10, -5:0, 0:10, 5:0",
|
|
270
|
+
"0:5, -5:0, 0:-5, 5:0"},
|
|
271
|
+
"10:0, 0:10, -10:0, 0:20; "
|
|
272
|
+
"0:-20, -10:0, 0:-10, 10:0; "
|
|
273
|
+
"5:0, 0:-10, -5:0, 0:-5; "
|
|
274
|
+
"0:5, -5:0, 0:10, 5:0");
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
TEST(S2PolygonLayer, SevenDiamondsTouchingAtOnePointPerPair) {
|
|
278
|
+
// Seven diamonds nested within each other touching at one
|
|
279
|
+
// point between each nested pair.
|
|
280
|
+
TestS2PolygonUnchanged("0:-70, -70:0, 0:70, 70:0; "
|
|
281
|
+
"0:-70, -60:0, 0:60, 60:0; "
|
|
282
|
+
"0:-50, -60:0, 0:50, 50:0; "
|
|
283
|
+
"0:-40, -40:0, 0:50, 40:0; "
|
|
284
|
+
"0:-30, -30:0, 0:30, 40:0; "
|
|
285
|
+
"0:-20, -20:0, 0:30, 20:0; "
|
|
286
|
+
"0:-10, -20:0, 0:10, 10:0");
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
TEST(IndexedS2PolygonLayer, AddsShape) {
|
|
290
|
+
S2Builder builder{S2Builder::Options()};
|
|
291
|
+
MutableS2ShapeIndex index;
|
|
292
|
+
builder.StartLayer(make_unique<IndexedS2PolygonLayer>(&index));
|
|
293
|
+
const string& polygon_str = "0:0, 0:10, 10:0";
|
|
294
|
+
builder.AddPolygon(*s2textformat::MakePolygon(polygon_str));
|
|
295
|
+
S2Error error;
|
|
296
|
+
ASSERT_TRUE(builder.Build(&error));
|
|
297
|
+
EXPECT_EQ(1, index.num_shape_ids());
|
|
298
|
+
const S2Polygon* polygon = down_cast<const S2Polygon::Shape*>(
|
|
299
|
+
index.shape(0))->polygon();
|
|
300
|
+
EXPECT_EQ(polygon_str, s2textformat::ToString(*polygon));
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
TEST(IndexedS2PolygonLayer, IgnoresEmptyShape) {
|
|
304
|
+
S2Builder builder{S2Builder::Options()};
|
|
305
|
+
MutableS2ShapeIndex index;
|
|
306
|
+
builder.StartLayer(make_unique<IndexedS2PolygonLayer>(&index));
|
|
307
|
+
S2Error error;
|
|
308
|
+
ASSERT_TRUE(builder.Build(&error));
|
|
309
|
+
EXPECT_EQ(0, index.num_shape_ids());
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
} // namespace
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// Copyright 2016 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/s2builderutil_s2polyline_layer.h"
|
|
19
|
+
|
|
20
|
+
#include "s2/s2debug.h"
|
|
21
|
+
|
|
22
|
+
using std::vector;
|
|
23
|
+
|
|
24
|
+
using EdgeType = S2Builder::EdgeType;
|
|
25
|
+
using Graph = S2Builder::Graph;
|
|
26
|
+
using GraphOptions = S2Builder::GraphOptions;
|
|
27
|
+
using Label = S2Builder::Label;
|
|
28
|
+
|
|
29
|
+
using DegenerateEdges = GraphOptions::DegenerateEdges;
|
|
30
|
+
using DuplicateEdges = GraphOptions::DuplicateEdges;
|
|
31
|
+
using SiblingPairs = GraphOptions::SiblingPairs;
|
|
32
|
+
|
|
33
|
+
using EdgeId = Graph::EdgeId;
|
|
34
|
+
using PolylineType = Graph::PolylineType;
|
|
35
|
+
|
|
36
|
+
namespace s2builderutil {
|
|
37
|
+
|
|
38
|
+
S2PolylineLayer::S2PolylineLayer(S2Polyline* polyline,
|
|
39
|
+
const S2PolylineLayer::Options& options) {
|
|
40
|
+
Init(polyline, nullptr, nullptr, options);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
S2PolylineLayer::S2PolylineLayer(
|
|
44
|
+
S2Polyline* polyline, LabelSetIds* label_set_ids,
|
|
45
|
+
IdSetLexicon* label_set_lexicon, const Options& options) {
|
|
46
|
+
Init(polyline, label_set_ids, label_set_lexicon, options);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
void S2PolylineLayer::Init(S2Polyline* polyline, LabelSetIds* label_set_ids,
|
|
50
|
+
IdSetLexicon* label_set_lexicon,
|
|
51
|
+
const Options& options) {
|
|
52
|
+
S2_DCHECK_EQ(label_set_ids == nullptr, label_set_lexicon == nullptr);
|
|
53
|
+
polyline_ = polyline;
|
|
54
|
+
label_set_ids_ = label_set_ids;
|
|
55
|
+
label_set_lexicon_ = label_set_lexicon;
|
|
56
|
+
options_ = options;
|
|
57
|
+
|
|
58
|
+
if (options_.validate()) {
|
|
59
|
+
polyline_->set_s2debug_override(S2Debug::DISABLE);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
GraphOptions S2PolylineLayer::graph_options() const {
|
|
64
|
+
// Remove edges that collapse to a single vertex, but keep duplicate and
|
|
65
|
+
// sibling edges, since merging duplicates or discarding siblings can make
|
|
66
|
+
// it impossible to assemble the edges into a single polyline.
|
|
67
|
+
return GraphOptions(options_.edge_type(), DegenerateEdges::DISCARD,
|
|
68
|
+
DuplicateEdges::KEEP, SiblingPairs::KEEP);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
void S2PolylineLayer::Build(const Graph& g, S2Error* error) {
|
|
72
|
+
if (g.num_edges() == 0) {
|
|
73
|
+
polyline_->Init(vector<S2Point>{});
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
vector<Graph::EdgePolyline> edge_polylines =
|
|
77
|
+
g.GetPolylines(PolylineType::WALK);
|
|
78
|
+
if (edge_polylines.size() != 1) {
|
|
79
|
+
error->Init(S2Error::BUILDER_EDGES_DO_NOT_FORM_POLYLINE,
|
|
80
|
+
"Input edges cannot be assembled into polyline");
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const Graph::EdgePolyline& edge_polyline = edge_polylines[0];
|
|
84
|
+
vector<S2Point> vertices; // Temporary storage for vertices.
|
|
85
|
+
vertices.reserve(edge_polyline.size());
|
|
86
|
+
vertices.push_back(g.vertex(g.edge(edge_polyline[0]).first));
|
|
87
|
+
for (EdgeId e : edge_polyline) {
|
|
88
|
+
vertices.push_back(g.vertex(g.edge(e).second));
|
|
89
|
+
}
|
|
90
|
+
if (label_set_ids_) {
|
|
91
|
+
Graph::LabelFetcher fetcher(g, options_.edge_type());
|
|
92
|
+
vector<Label> labels; // Temporary storage for labels.
|
|
93
|
+
label_set_ids_->reserve(edge_polyline.size());
|
|
94
|
+
for (EdgeId e : edge_polyline) {
|
|
95
|
+
fetcher.Fetch(e, &labels);
|
|
96
|
+
label_set_ids_->push_back(label_set_lexicon_->Add(labels));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
polyline_->Init(vertices);
|
|
100
|
+
if (options_.validate()) {
|
|
101
|
+
polyline_->FindValidationError(error);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
} // namespace s2builderutil
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
// Copyright 2016 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_S2BUILDERUTIL_S2POLYLINE_LAYER_H_
|
|
19
|
+
#define S2_S2BUILDERUTIL_S2POLYLINE_LAYER_H_
|
|
20
|
+
|
|
21
|
+
#include <memory>
|
|
22
|
+
#include <vector>
|
|
23
|
+
#include "s2/base/logging.h"
|
|
24
|
+
#include "s2/third_party/absl/memory/memory.h"
|
|
25
|
+
#include "s2/id_set_lexicon.h"
|
|
26
|
+
#include "s2/mutable_s2shape_index.h"
|
|
27
|
+
#include "s2/s2builder.h"
|
|
28
|
+
#include "s2/s2builder_graph.h"
|
|
29
|
+
#include "s2/s2builder_layer.h"
|
|
30
|
+
#include "s2/s2error.h"
|
|
31
|
+
#include "s2/s2polyline.h"
|
|
32
|
+
|
|
33
|
+
namespace s2builderutil {
|
|
34
|
+
|
|
35
|
+
// A layer type that assembles edges (directed or undirected) into an
|
|
36
|
+
// S2Polyline. Returns an error if the edges cannot be assembled into a
|
|
37
|
+
// single unbroken polyline.
|
|
38
|
+
//
|
|
39
|
+
// Duplicate edges are handled correctly (e.g., if a polyline backtracks on
|
|
40
|
+
// itself, or loops around and retraces some of its previous edges.) The
|
|
41
|
+
// implementation attempts to preserve the order of directed input edges
|
|
42
|
+
// whenever possible, so that if the input is a polyline and it is not
|
|
43
|
+
// modified by S2Builder, then the output will be the same polyline (even if
|
|
44
|
+
// the polyline backtracks on itself or forms a loop). With undirected edges,
|
|
45
|
+
// there are no such guarantees; for example, even if the input consists of a
|
|
46
|
+
// single undirected edge, then either directed edge may be returned.
|
|
47
|
+
//
|
|
48
|
+
// S2PolylineLayer does not support options such as discarding sibling pairs
|
|
49
|
+
// or merging duplicate edges because these options can split the polyline
|
|
50
|
+
// into several pieces. Use S2PolylineVectorLayer if you need these features.
|
|
51
|
+
class S2PolylineLayer : public S2Builder::Layer {
|
|
52
|
+
public:
|
|
53
|
+
class Options {
|
|
54
|
+
public:
|
|
55
|
+
// Constructor that uses the default options (listed below).
|
|
56
|
+
Options();
|
|
57
|
+
|
|
58
|
+
// Constructor that specifies the edge type.
|
|
59
|
+
explicit Options(S2Builder::EdgeType edge_type);
|
|
60
|
+
|
|
61
|
+
// Indicates whether the input edges provided to S2Builder are directed or
|
|
62
|
+
// undirected. Directed edges should be used whenever possible to avoid
|
|
63
|
+
// ambiguity.
|
|
64
|
+
//
|
|
65
|
+
// DEFAULT: S2Builder::EdgeType::DIRECTED
|
|
66
|
+
S2Builder::EdgeType edge_type() const;
|
|
67
|
+
void set_edge_type(S2Builder::EdgeType edge_type);
|
|
68
|
+
|
|
69
|
+
// If true, calls FindValidationError() on the output polyline. If any
|
|
70
|
+
// error is found, it will be returned by S2Builder::Build().
|
|
71
|
+
//
|
|
72
|
+
// Note that this option calls set_s2debug_override(S2Debug::DISABLE) in
|
|
73
|
+
// order to turn off the default error checking in debug builds.
|
|
74
|
+
//
|
|
75
|
+
// DEFAULT: false
|
|
76
|
+
bool validate() const;
|
|
77
|
+
void set_validate(bool validate);
|
|
78
|
+
|
|
79
|
+
private:
|
|
80
|
+
S2Builder::EdgeType edge_type_;
|
|
81
|
+
bool validate_;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
// Specifies that a polyline should be constructed using the given options.
|
|
85
|
+
explicit S2PolylineLayer(S2Polyline* polyline,
|
|
86
|
+
const Options& options = Options());
|
|
87
|
+
|
|
88
|
+
// Specifies that a polyline should be constructed using the given options,
|
|
89
|
+
// and that any labels attached to the input edges should be returned in
|
|
90
|
+
// "label_set_ids" and "label_set_lexicion".
|
|
91
|
+
//
|
|
92
|
+
// The labels associated with the edge "polyline.vertex({j, j+1})" can be
|
|
93
|
+
// retrieved as follows:
|
|
94
|
+
//
|
|
95
|
+
// for (int32 label : label_set_lexicon.id_set(label_set_ids[j])) {...}
|
|
96
|
+
using LabelSetIds = std::vector<LabelSetId>;
|
|
97
|
+
S2PolylineLayer(S2Polyline* polyline, LabelSetIds* label_set_ids,
|
|
98
|
+
IdSetLexicon* label_set_lexicon,
|
|
99
|
+
const Options& options = Options());
|
|
100
|
+
|
|
101
|
+
// Layer interface:
|
|
102
|
+
GraphOptions graph_options() const override;
|
|
103
|
+
void Build(const Graph& g, S2Error* error) override;
|
|
104
|
+
|
|
105
|
+
private:
|
|
106
|
+
void Init(S2Polyline* polyline, LabelSetIds* label_set_ids,
|
|
107
|
+
IdSetLexicon* label_set_lexicon, const Options& options);
|
|
108
|
+
|
|
109
|
+
S2Polyline* polyline_;
|
|
110
|
+
LabelSetIds* label_set_ids_;
|
|
111
|
+
IdSetLexicon* label_set_lexicon_;
|
|
112
|
+
Options options_;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
// Like S2PolylineLayer, but adds the polyline to a MutableS2ShapeIndex (if the
|
|
116
|
+
// polyline is non-empty).
|
|
117
|
+
class IndexedS2PolylineLayer : public S2Builder::Layer {
|
|
118
|
+
public:
|
|
119
|
+
using Options = S2PolylineLayer::Options;
|
|
120
|
+
explicit IndexedS2PolylineLayer(MutableS2ShapeIndex* index,
|
|
121
|
+
const Options& options = Options())
|
|
122
|
+
: index_(index), polyline_(new S2Polyline),
|
|
123
|
+
layer_(polyline_.get(), options) {}
|
|
124
|
+
|
|
125
|
+
GraphOptions graph_options() const override {
|
|
126
|
+
return layer_.graph_options();
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
void Build(const Graph& g, S2Error* error) override {
|
|
130
|
+
layer_.Build(g, error);
|
|
131
|
+
if (error->ok() && polyline_->num_vertices() > 0) {
|
|
132
|
+
index_->Add(
|
|
133
|
+
absl::make_unique<S2Polyline::OwningShape>(std::move(polyline_)));
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
private:
|
|
138
|
+
MutableS2ShapeIndex* index_;
|
|
139
|
+
std::unique_ptr<S2Polyline> polyline_;
|
|
140
|
+
S2PolylineLayer layer_;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
////////////////// Implementation details follow ////////////////////
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
inline S2PolylineLayer::Options::Options()
|
|
148
|
+
: edge_type_(S2Builder::EdgeType::DIRECTED), validate_(false) {
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
inline S2PolylineLayer::Options::Options(S2Builder::EdgeType edge_type)
|
|
152
|
+
: edge_type_(edge_type), validate_(false) {
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
inline S2Builder::EdgeType S2PolylineLayer::Options::edge_type() const {
|
|
156
|
+
return edge_type_;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
inline void S2PolylineLayer::Options::set_edge_type(
|
|
160
|
+
S2Builder::EdgeType edge_type) {
|
|
161
|
+
edge_type_ = edge_type;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
inline bool S2PolylineLayer::Options::validate() const {
|
|
165
|
+
return validate_;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
inline void S2PolylineLayer::Options::set_validate(bool validate) {
|
|
169
|
+
validate_ = validate;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
} // namespace s2builderutil
|
|
173
|
+
|
|
174
|
+
#endif // S2_S2BUILDERUTIL_S2POLYLINE_LAYER_H_
|