@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.
Files changed (471) hide show
  1. package/.circleci/config.yml +45 -0
  2. package/.dockerignore +1 -0
  3. package/.gitmodules +3 -0
  4. package/CHANGELOG.md +33 -0
  5. package/LICENSE +201 -0
  6. package/README.md +147 -0
  7. package/binding.gyp +170 -0
  8. package/docker/Dockerfile.node20.test +8 -0
  9. package/docker/Dockerfile.node22.test +8 -0
  10. package/docker/Dockerfile.node24.test +8 -0
  11. package/index.d.ts +117 -0
  12. package/index.js +6 -0
  13. package/jest.config.js +184 -0
  14. package/package.json +43 -0
  15. package/publish-linux.sh +18 -0
  16. package/publish-osx.sh +19 -0
  17. package/src/builder.cc +84 -0
  18. package/src/builder.h +29 -0
  19. package/src/cell.cc +71 -0
  20. package/src/cell.h +26 -0
  21. package/src/cell_id.cc +210 -0
  22. package/src/cell_id.h +44 -0
  23. package/src/cell_union.cc +237 -0
  24. package/src/cell_union.h +34 -0
  25. package/src/earth.cc +185 -0
  26. package/src/earth.h +33 -0
  27. package/src/latlng.cc +132 -0
  28. package/src/latlng.h +28 -0
  29. package/src/loop.cc +51 -0
  30. package/src/loop.h +21 -0
  31. package/src/point.cc +69 -0
  32. package/src/point.h +23 -0
  33. package/src/polygon.cc +36 -0
  34. package/src/polygon.h +20 -0
  35. package/src/polyline.cc +186 -0
  36. package/src/polyline.h +34 -0
  37. package/src/region_coverer.cc +450 -0
  38. package/src/region_coverer.h +56 -0
  39. package/src/s2.cc +27 -0
  40. package/test/Cell.test.js +37 -0
  41. package/test/CellId.test.js +135 -0
  42. package/test/CellUnion.test.js +150 -0
  43. package/test/Earth.test.js +62 -0
  44. package/test/LatLng.test.js +45 -0
  45. package/test/Point.test.js +14 -0
  46. package/test/Polyline.test.js +78 -0
  47. package/test/RegionCoverer.test.js +301 -0
  48. package/test.sh +16 -0
  49. package/third_party/s2geometry/.travis.yml +163 -0
  50. package/third_party/s2geometry/AUTHORS +13 -0
  51. package/third_party/s2geometry/CONTRIBUTING.md +65 -0
  52. package/third_party/s2geometry/CONTRIBUTORS +30 -0
  53. package/third_party/s2geometry/LICENSE +202 -0
  54. package/third_party/s2geometry/NOTICE +5 -0
  55. package/third_party/s2geometry/README.md +127 -0
  56. package/third_party/s2geometry/doc/examples/point_index.cc +44 -0
  57. package/third_party/s2geometry/doc/examples/term_index.cc +99 -0
  58. package/third_party/s2geometry/doc/examples/term_index.py +101 -0
  59. package/third_party/s2geometry/src/python/coder.i +125 -0
  60. package/third_party/s2geometry/src/python/pywraps2_test.py +786 -0
  61. package/third_party/s2geometry/src/python/s2.i +37 -0
  62. package/third_party/s2geometry/src/python/s2_common.i +756 -0
  63. package/third_party/s2geometry/src/s2/_fp_contract_off.h +60 -0
  64. package/third_party/s2geometry/src/s2/base/casts.h +318 -0
  65. package/third_party/s2geometry/src/s2/base/commandlineflags.h +67 -0
  66. package/third_party/s2geometry/src/s2/base/integral_types.h +31 -0
  67. package/third_party/s2geometry/src/s2/base/log_severity.h +40 -0
  68. package/third_party/s2geometry/src/s2/base/logging.h +173 -0
  69. package/third_party/s2geometry/src/s2/base/mutex.h +61 -0
  70. package/third_party/s2geometry/src/s2/base/port.h +999 -0
  71. package/third_party/s2geometry/src/s2/base/spinlock.h +60 -0
  72. package/third_party/s2geometry/src/s2/base/stringprintf.cc +107 -0
  73. package/third_party/s2geometry/src/s2/base/stringprintf.h +53 -0
  74. package/third_party/s2geometry/src/s2/base/strtoint.cc +65 -0
  75. package/third_party/s2geometry/src/s2/base/strtoint.h +106 -0
  76. package/third_party/s2geometry/src/s2/base/timer.h +50 -0
  77. package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector.cc +164 -0
  78. package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector.h +110 -0
  79. package/third_party/s2geometry/src/s2/encoded_s2cell_id_vector_test.cc +232 -0
  80. package/third_party/s2geometry/src/s2/encoded_s2point_vector.cc +838 -0
  81. package/third_party/s2geometry/src/s2/encoded_s2point_vector.h +140 -0
  82. package/third_party/s2geometry/src/s2/encoded_s2point_vector_test.cc +344 -0
  83. package/third_party/s2geometry/src/s2/encoded_s2shape_index.cc +181 -0
  84. package/third_party/s2geometry/src/s2/encoded_s2shape_index.h +276 -0
  85. package/third_party/s2geometry/src/s2/encoded_s2shape_index_test.cc +244 -0
  86. package/third_party/s2geometry/src/s2/encoded_string_vector.cc +66 -0
  87. package/third_party/s2geometry/src/s2/encoded_string_vector.h +164 -0
  88. package/third_party/s2geometry/src/s2/encoded_string_vector_test.cc +69 -0
  89. package/third_party/s2geometry/src/s2/encoded_uint_vector.h +299 -0
  90. package/third_party/s2geometry/src/s2/encoded_uint_vector_test.cc +124 -0
  91. package/third_party/s2geometry/src/s2/id_set_lexicon.cc +81 -0
  92. package/third_party/s2geometry/src/s2/id_set_lexicon.h +199 -0
  93. package/third_party/s2geometry/src/s2/id_set_lexicon_test.cc +70 -0
  94. package/third_party/s2geometry/src/s2/mutable_s2shape_index.cc +1585 -0
  95. package/third_party/s2geometry/src/s2/mutable_s2shape_index.h +600 -0
  96. package/third_party/s2geometry/src/s2/mutable_s2shape_index_test.cc +589 -0
  97. package/third_party/s2geometry/src/s2/r1interval.h +220 -0
  98. package/third_party/s2geometry/src/s2/r1interval_test.cc +185 -0
  99. package/third_party/s2geometry/src/s2/r2.h +26 -0
  100. package/third_party/s2geometry/src/s2/r2rect.cc +93 -0
  101. package/third_party/s2geometry/src/s2/r2rect.h +234 -0
  102. package/third_party/s2geometry/src/s2/r2rect_test.cc +228 -0
  103. package/third_party/s2geometry/src/s2/s1angle.cc +54 -0
  104. package/third_party/s2geometry/src/s2/s1angle.h +336 -0
  105. package/third_party/s2geometry/src/s2/s1angle_test.cc +185 -0
  106. package/third_party/s2geometry/src/s2/s1chord_angle.cc +159 -0
  107. package/third_party/s2geometry/src/s2/s1chord_angle.h +369 -0
  108. package/third_party/s2geometry/src/s2/s1chord_angle_test.cc +207 -0
  109. package/third_party/s2geometry/src/s2/s1interval.cc +296 -0
  110. package/third_party/s2geometry/src/s2/s1interval.h +266 -0
  111. package/third_party/s2geometry/src/s2/s1interval_test.cc +469 -0
  112. package/third_party/s2geometry/src/s2/s2boolean_operation.cc +2391 -0
  113. package/third_party/s2geometry/src/s2/s2boolean_operation.h +501 -0
  114. package/third_party/s2geometry/src/s2/s2boolean_operation_test.cc +1400 -0
  115. package/third_party/s2geometry/src/s2/s2builder.cc +1828 -0
  116. package/third_party/s2geometry/src/s2/s2builder.h +1057 -0
  117. package/third_party/s2geometry/src/s2/s2builder_graph.cc +1084 -0
  118. package/third_party/s2geometry/src/s2/s2builder_graph.h +799 -0
  119. package/third_party/s2geometry/src/s2/s2builder_graph_test.cc +462 -0
  120. package/third_party/s2geometry/src/s2/s2builder_layer.h +50 -0
  121. package/third_party/s2geometry/src/s2/s2builder_test.cc +1329 -0
  122. package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer.cc +313 -0
  123. package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer.h +221 -0
  124. package/third_party/s2geometry/src/s2/s2builderutil_closed_set_normalizer_test.cc +261 -0
  125. package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies.cc +392 -0
  126. package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies.h +86 -0
  127. package/third_party/s2geometry/src/s2/s2builderutil_find_polygon_degeneracies_test.cc +182 -0
  128. package/third_party/s2geometry/src/s2/s2builderutil_graph_shape.h +57 -0
  129. package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer.cc +212 -0
  130. package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer.h +218 -0
  131. package/third_party/s2geometry/src/s2/s2builderutil_lax_polygon_layer_test.cc +367 -0
  132. package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer.cc +74 -0
  133. package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer.h +122 -0
  134. package/third_party/s2geometry/src/s2/s2builderutil_s2point_vector_layer_test.cc +167 -0
  135. package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer.cc +191 -0
  136. package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer.h +211 -0
  137. package/third_party/s2geometry/src/s2/s2builderutil_s2polygon_layer_test.cc +312 -0
  138. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer.cc +105 -0
  139. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer.h +174 -0
  140. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_layer_test.cc +220 -0
  141. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer.cc +98 -0
  142. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer.h +292 -0
  143. package/third_party/s2geometry/src/s2/s2builderutil_s2polyline_vector_layer_test.cc +233 -0
  144. package/third_party/s2geometry/src/s2/s2builderutil_snap_functions.cc +354 -0
  145. package/third_party/s2geometry/src/s2/s2builderutil_snap_functions.h +239 -0
  146. package/third_party/s2geometry/src/s2/s2builderutil_snap_functions_test.cc +716 -0
  147. package/third_party/s2geometry/src/s2/s2builderutil_testing.cc +37 -0
  148. package/third_party/s2geometry/src/s2/s2builderutil_testing.h +100 -0
  149. package/third_party/s2geometry/src/s2/s2builderutil_testing_test.cc +85 -0
  150. package/third_party/s2geometry/src/s2/s2cap.cc +347 -0
  151. package/third_party/s2geometry/src/s2/s2cap.h +286 -0
  152. package/third_party/s2geometry/src/s2/s2cap_test.cc +379 -0
  153. package/third_party/s2geometry/src/s2/s2cell.cc +552 -0
  154. package/third_party/s2geometry/src/s2/s2cell.h +249 -0
  155. package/third_party/s2geometry/src/s2/s2cell_id.cc +619 -0
  156. package/third_party/s2geometry/src/s2/s2cell_id.h +705 -0
  157. package/third_party/s2geometry/src/s2/s2cell_id_test.cc +633 -0
  158. package/third_party/s2geometry/src/s2/s2cell_index.cc +149 -0
  159. package/third_party/s2geometry/src/s2/s2cell_index.h +660 -0
  160. package/third_party/s2geometry/src/s2/s2cell_index_test.cc +411 -0
  161. package/third_party/s2geometry/src/s2/s2cell_test.cc +687 -0
  162. package/third_party/s2geometry/src/s2/s2cell_union.cc +515 -0
  163. package/third_party/s2geometry/src/s2/s2cell_union.h +399 -0
  164. package/third_party/s2geometry/src/s2/s2cell_union_test.cc +598 -0
  165. package/third_party/s2geometry/src/s2/s2centroids.cc +84 -0
  166. package/third_party/s2geometry/src/s2/s2centroids.h +87 -0
  167. package/third_party/s2geometry/src/s2/s2centroids_test.cc +82 -0
  168. package/third_party/s2geometry/src/s2/s2closest_cell_query.cc +123 -0
  169. package/third_party/s2geometry/src/s2/s2closest_cell_query.h +385 -0
  170. package/third_party/s2geometry/src/s2/s2closest_cell_query_base.h +841 -0
  171. package/third_party/s2geometry/src/s2/s2closest_cell_query_base_test.cc +63 -0
  172. package/third_party/s2geometry/src/s2/s2closest_cell_query_test.cc +412 -0
  173. package/third_party/s2geometry/src/s2/s2closest_edge_query.cc +106 -0
  174. package/third_party/s2geometry/src/s2/s2closest_edge_query.h +421 -0
  175. package/third_party/s2geometry/src/s2/s2closest_edge_query_base.h +946 -0
  176. package/third_party/s2geometry/src/s2/s2closest_edge_query_base_test.cc +59 -0
  177. package/third_party/s2geometry/src/s2/s2closest_edge_query_test.cc +505 -0
  178. package/third_party/s2geometry/src/s2/s2closest_edge_query_testing.h +91 -0
  179. package/third_party/s2geometry/src/s2/s2closest_point_query.cc +66 -0
  180. package/third_party/s2geometry/src/s2/s2closest_point_query.h +465 -0
  181. package/third_party/s2geometry/src/s2/s2closest_point_query_base.h +767 -0
  182. package/third_party/s2geometry/src/s2/s2closest_point_query_base_test.cc +63 -0
  183. package/third_party/s2geometry/src/s2/s2closest_point_query_test.cc +312 -0
  184. package/third_party/s2geometry/src/s2/s2contains_point_query.h +328 -0
  185. package/third_party/s2geometry/src/s2/s2contains_point_query_test.cc +159 -0
  186. package/third_party/s2geometry/src/s2/s2contains_vertex_query.cc +39 -0
  187. package/third_party/s2geometry/src/s2/s2contains_vertex_query.h +66 -0
  188. package/third_party/s2geometry/src/s2/s2contains_vertex_query_test.cc +67 -0
  189. package/third_party/s2geometry/src/s2/s2convex_hull_query.cc +198 -0
  190. package/third_party/s2geometry/src/s2/s2convex_hull_query.h +110 -0
  191. package/third_party/s2geometry/src/s2/s2convex_hull_query_test.cc +208 -0
  192. package/third_party/s2geometry/src/s2/s2coords.cc +146 -0
  193. package/third_party/s2geometry/src/s2/s2coords.h +459 -0
  194. package/third_party/s2geometry/src/s2/s2coords_internal.h +71 -0
  195. package/third_party/s2geometry/src/s2/s2coords_test.cc +218 -0
  196. package/third_party/s2geometry/src/s2/s2crossing_edge_query.cc +380 -0
  197. package/third_party/s2geometry/src/s2/s2crossing_edge_query.h +220 -0
  198. package/third_party/s2geometry/src/s2/s2crossing_edge_query_test.cc +382 -0
  199. package/third_party/s2geometry/src/s2/s2debug.cc +23 -0
  200. package/third_party/s2geometry/src/s2/s2debug.h +69 -0
  201. package/third_party/s2geometry/src/s2/s2distance_target.h +165 -0
  202. package/third_party/s2geometry/src/s2/s2earth.cc +52 -0
  203. package/third_party/s2geometry/src/s2/s2earth.h +268 -0
  204. package/third_party/s2geometry/src/s2/s2earth_test.cc +146 -0
  205. package/third_party/s2geometry/src/s2/s2edge_clipping.cc +462 -0
  206. package/third_party/s2geometry/src/s2/s2edge_clipping.h +183 -0
  207. package/third_party/s2geometry/src/s2/s2edge_clipping_test.cc +335 -0
  208. package/third_party/s2geometry/src/s2/s2edge_crosser.cc +85 -0
  209. package/third_party/s2geometry/src/s2/s2edge_crosser.h +343 -0
  210. package/third_party/s2geometry/src/s2/s2edge_crosser_test.cc +264 -0
  211. package/third_party/s2geometry/src/s2/s2edge_crossings.cc +515 -0
  212. package/third_party/s2geometry/src/s2/s2edge_crossings.h +138 -0
  213. package/third_party/s2geometry/src/s2/s2edge_crossings_internal.h +59 -0
  214. package/third_party/s2geometry/src/s2/s2edge_crossings_test.cc +246 -0
  215. package/third_party/s2geometry/src/s2/s2edge_distances.cc +419 -0
  216. package/third_party/s2geometry/src/s2/s2edge_distances.h +192 -0
  217. package/third_party/s2geometry/src/s2/s2edge_distances_test.cc +539 -0
  218. package/third_party/s2geometry/src/s2/s2edge_tessellator.cc +276 -0
  219. package/third_party/s2geometry/src/s2/s2edge_tessellator.h +101 -0
  220. package/third_party/s2geometry/src/s2/s2edge_tessellator_test.cc +492 -0
  221. package/third_party/s2geometry/src/s2/s2edge_vector_shape.h +85 -0
  222. package/third_party/s2geometry/src/s2/s2edge_vector_shape_test.cc +66 -0
  223. package/third_party/s2geometry/src/s2/s2error.cc +29 -0
  224. package/third_party/s2geometry/src/s2/s2error.h +147 -0
  225. package/third_party/s2geometry/src/s2/s2error_test.cc +31 -0
  226. package/third_party/s2geometry/src/s2/s2furthest_edge_query.cc +117 -0
  227. package/third_party/s2geometry/src/s2/s2furthest_edge_query.h +439 -0
  228. package/third_party/s2geometry/src/s2/s2furthest_edge_query_test.cc +487 -0
  229. package/third_party/s2geometry/src/s2/s2latlng.cc +90 -0
  230. package/third_party/s2geometry/src/s2/s2latlng.h +234 -0
  231. package/third_party/s2geometry/src/s2/s2latlng_rect.cc +727 -0
  232. package/third_party/s2geometry/src/s2/s2latlng_rect.h +434 -0
  233. package/third_party/s2geometry/src/s2/s2latlng_rect_bounder.cc +344 -0
  234. package/third_party/s2geometry/src/s2/s2latlng_rect_bounder.h +89 -0
  235. package/third_party/s2geometry/src/s2/s2latlng_rect_bounder_test.cc +306 -0
  236. package/third_party/s2geometry/src/s2/s2latlng_rect_test.cc +1030 -0
  237. package/third_party/s2geometry/src/s2/s2latlng_test.cc +165 -0
  238. package/third_party/s2geometry/src/s2/s2lax_loop_shape.cc +104 -0
  239. package/third_party/s2geometry/src/s2/s2lax_loop_shape.h +153 -0
  240. package/third_party/s2geometry/src/s2/s2lax_loop_shape_test.cc +101 -0
  241. package/third_party/s2geometry/src/s2/s2lax_polygon_shape.cc +348 -0
  242. package/third_party/s2geometry/src/s2/s2lax_polygon_shape.h +183 -0
  243. package/third_party/s2geometry/src/s2/s2lax_polygon_shape_test.cc +234 -0
  244. package/third_party/s2geometry/src/s2/s2lax_polyline_shape.cc +118 -0
  245. package/third_party/s2geometry/src/s2/s2lax_polyline_shape.h +124 -0
  246. package/third_party/s2geometry/src/s2/s2lax_polyline_shape_test.cc +62 -0
  247. package/third_party/s2geometry/src/s2/s2loop.cc +1509 -0
  248. package/third_party/s2geometry/src/s2/s2loop.h +711 -0
  249. package/third_party/s2geometry/src/s2/s2loop_measures.cc +313 -0
  250. package/third_party/s2geometry/src/s2/s2loop_measures.h +280 -0
  251. package/third_party/s2geometry/src/s2/s2loop_measures_test.cc +367 -0
  252. package/third_party/s2geometry/src/s2/s2loop_test.cc +1371 -0
  253. package/third_party/s2geometry/src/s2/s2max_distance_targets.cc +265 -0
  254. package/third_party/s2geometry/src/s2/s2max_distance_targets.h +241 -0
  255. package/third_party/s2geometry/src/s2/s2max_distance_targets_test.cc +367 -0
  256. package/third_party/s2geometry/src/s2/s2measures.cc +128 -0
  257. package/third_party/s2geometry/src/s2/s2measures.h +78 -0
  258. package/third_party/s2geometry/src/s2/s2measures_test.cc +135 -0
  259. package/third_party/s2geometry/src/s2/s2metrics.cc +122 -0
  260. package/third_party/s2geometry/src/s2/s2metrics.h +199 -0
  261. package/third_party/s2geometry/src/s2/s2metrics_test.cc +127 -0
  262. package/third_party/s2geometry/src/s2/s2min_distance_targets.cc +295 -0
  263. package/third_party/s2geometry/src/s2/s2min_distance_targets.h +273 -0
  264. package/third_party/s2geometry/src/s2/s2min_distance_targets_test.cc +239 -0
  265. package/third_party/s2geometry/src/s2/s2padded_cell.cc +162 -0
  266. package/third_party/s2geometry/src/s2/s2padded_cell.h +108 -0
  267. package/third_party/s2geometry/src/s2/s2padded_cell_test.cc +138 -0
  268. package/third_party/s2geometry/src/s2/s2point.h +38 -0
  269. package/third_party/s2geometry/src/s2/s2point_compression.cc +388 -0
  270. package/third_party/s2geometry/src/s2/s2point_compression.h +78 -0
  271. package/third_party/s2geometry/src/s2/s2point_compression_test.cc +305 -0
  272. package/third_party/s2geometry/src/s2/s2point_index.h +345 -0
  273. package/third_party/s2geometry/src/s2/s2point_index_test.cc +147 -0
  274. package/third_party/s2geometry/src/s2/s2point_region.cc +72 -0
  275. package/third_party/s2geometry/src/s2/s2point_region.h +76 -0
  276. package/third_party/s2geometry/src/s2/s2point_region_test.cc +100 -0
  277. package/third_party/s2geometry/src/s2/s2point_span.h +57 -0
  278. package/third_party/s2geometry/src/s2/s2point_test.cc +47 -0
  279. package/third_party/s2geometry/src/s2/s2point_vector_shape.h +127 -0
  280. package/third_party/s2geometry/src/s2/s2point_vector_shape_test.cc +59 -0
  281. package/third_party/s2geometry/src/s2/s2pointutil.cc +131 -0
  282. package/third_party/s2geometry/src/s2/s2pointutil.h +138 -0
  283. package/third_party/s2geometry/src/s2/s2pointutil_test.cc +157 -0
  284. package/third_party/s2geometry/src/s2/s2polygon.cc +1569 -0
  285. package/third_party/s2geometry/src/s2/s2polygon.h +934 -0
  286. package/third_party/s2geometry/src/s2/s2polygon_test.cc +3025 -0
  287. package/third_party/s2geometry/src/s2/s2polyline.cc +645 -0
  288. package/third_party/s2geometry/src/s2/s2polyline.h +379 -0
  289. package/third_party/s2geometry/src/s2/s2polyline_alignment.cc +414 -0
  290. package/third_party/s2geometry/src/s2/s2polyline_alignment.h +245 -0
  291. package/third_party/s2geometry/src/s2/s2polyline_alignment_internal.h +158 -0
  292. package/third_party/s2geometry/src/s2/s2polyline_alignment_test.cc +610 -0
  293. package/third_party/s2geometry/src/s2/s2polyline_measures.cc +42 -0
  294. package/third_party/s2geometry/src/s2/s2polyline_measures.h +53 -0
  295. package/third_party/s2geometry/src/s2/s2polyline_measures_test.cc +57 -0
  296. package/third_party/s2geometry/src/s2/s2polyline_simplifier.cc +187 -0
  297. package/third_party/s2geometry/src/s2/s2polyline_simplifier.h +109 -0
  298. package/third_party/s2geometry/src/s2/s2polyline_simplifier_test.cc +165 -0
  299. package/third_party/s2geometry/src/s2/s2polyline_test.cc +554 -0
  300. package/third_party/s2geometry/src/s2/s2predicates.cc +1486 -0
  301. package/third_party/s2geometry/src/s2/s2predicates.h +282 -0
  302. package/third_party/s2geometry/src/s2/s2predicates_internal.h +135 -0
  303. package/third_party/s2geometry/src/s2/s2predicates_test.cc +1427 -0
  304. package/third_party/s2geometry/src/s2/s2projections.cc +109 -0
  305. package/third_party/s2geometry/src/s2/s2projections.h +161 -0
  306. package/third_party/s2geometry/src/s2/s2projections_test.cc +78 -0
  307. package/third_party/s2geometry/src/s2/s2r2rect.cc +88 -0
  308. package/third_party/s2geometry/src/s2/s2r2rect.h +292 -0
  309. package/third_party/s2geometry/src/s2/s2r2rect_test.cc +312 -0
  310. package/third_party/s2geometry/src/s2/s2region.cc +26 -0
  311. package/third_party/s2geometry/src/s2/s2region.h +142 -0
  312. package/third_party/s2geometry/src/s2/s2region_coverer.cc +514 -0
  313. package/third_party/s2geometry/src/s2/s2region_coverer.h +356 -0
  314. package/third_party/s2geometry/src/s2/s2region_coverer_test.cc +509 -0
  315. package/third_party/s2geometry/src/s2/s2region_intersection.cc +84 -0
  316. package/third_party/s2geometry/src/s2/s2region_intersection.h +79 -0
  317. package/third_party/s2geometry/src/s2/s2region_term_indexer.cc +270 -0
  318. package/third_party/s2geometry/src/s2/s2region_term_indexer.h +299 -0
  319. package/third_party/s2geometry/src/s2/s2region_term_indexer_test.cc +209 -0
  320. package/third_party/s2geometry/src/s2/s2region_test.cc +370 -0
  321. package/third_party/s2geometry/src/s2/s2region_union.cc +90 -0
  322. package/third_party/s2geometry/src/s2/s2region_union.h +83 -0
  323. package/third_party/s2geometry/src/s2/s2region_union_test.cc +89 -0
  324. package/third_party/s2geometry/src/s2/s2shape.h +283 -0
  325. package/third_party/s2geometry/src/s2/s2shape_index.cc +321 -0
  326. package/third_party/s2geometry/src/s2/s2shape_index.h +781 -0
  327. package/third_party/s2geometry/src/s2/s2shape_index_buffered_region.cc +113 -0
  328. package/third_party/s2geometry/src/s2/s2shape_index_buffered_region.h +135 -0
  329. package/third_party/s2geometry/src/s2/s2shape_index_buffered_region_test.cc +162 -0
  330. package/third_party/s2geometry/src/s2/s2shape_index_measures.cc +92 -0
  331. package/third_party/s2geometry/src/s2/s2shape_index_measures.h +100 -0
  332. package/third_party/s2geometry/src/s2/s2shape_index_measures_test.cc +136 -0
  333. package/third_party/s2geometry/src/s2/s2shape_index_region.h +350 -0
  334. package/third_party/s2geometry/src/s2/s2shape_index_region_test.cc +161 -0
  335. package/third_party/s2geometry/src/s2/s2shape_index_test.cc +24 -0
  336. package/third_party/s2geometry/src/s2/s2shape_measures.cc +138 -0
  337. package/third_party/s2geometry/src/s2/s2shape_measures.h +95 -0
  338. package/third_party/s2geometry/src/s2/s2shape_measures_test.cc +139 -0
  339. package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries.cc +120 -0
  340. package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries.h +66 -0
  341. package/third_party/s2geometry/src/s2/s2shapeutil_build_polygon_boundaries_test.cc +170 -0
  342. package/third_party/s2geometry/src/s2/s2shapeutil_coding.cc +253 -0
  343. package/third_party/s2geometry/src/s2/s2shapeutil_coding.h +283 -0
  344. package/third_party/s2geometry/src/s2/s2shapeutil_coding_test.cc +54 -0
  345. package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force.cc +40 -0
  346. package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force.h +41 -0
  347. package/third_party/s2geometry/src/s2/s2shapeutil_contains_brute_force_test.cc +55 -0
  348. package/third_party/s2geometry/src/s2/s2shapeutil_count_edges.h +57 -0
  349. package/third_party/s2geometry/src/s2/s2shapeutil_count_edges_test.cc +43 -0
  350. package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator.cc +45 -0
  351. package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator.h +72 -0
  352. package/third_party/s2geometry/src/s2/s2shapeutil_edge_iterator_test.cc +116 -0
  353. package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point.cc +107 -0
  354. package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point.h +48 -0
  355. package/third_party/s2geometry/src/s2/s2shapeutil_get_reference_point_test.cc +104 -0
  356. package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator.cc +58 -0
  357. package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator.h +65 -0
  358. package/third_party/s2geometry/src/s2/s2shapeutil_range_iterator_test.cc +61 -0
  359. package/third_party/s2geometry/src/s2/s2shapeutil_shape_edge.h +58 -0
  360. package/third_party/s2geometry/src/s2/s2shapeutil_shape_edge_id.h +97 -0
  361. package/third_party/s2geometry/src/s2/s2shapeutil_testing.cc +104 -0
  362. package/third_party/s2geometry/src/s2/s2shapeutil_testing.h +36 -0
  363. package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs.cc +440 -0
  364. package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs.h +72 -0
  365. package/third_party/s2geometry/src/s2/s2shapeutil_visit_crossing_edge_pairs_test.cc +184 -0
  366. package/third_party/s2geometry/src/s2/s2testing.cc +464 -0
  367. package/third_party/s2geometry/src/s2/s2testing.h +385 -0
  368. package/third_party/s2geometry/src/s2/s2testing_test.cc +166 -0
  369. package/third_party/s2geometry/src/s2/s2text_format.cc +506 -0
  370. package/third_party/s2geometry/src/s2/s2text_format.h +289 -0
  371. package/third_party/s2geometry/src/s2/s2text_format_test.cc +417 -0
  372. package/third_party/s2geometry/src/s2/s2wedge_relations.cc +80 -0
  373. package/third_party/s2geometry/src/s2/s2wedge_relations.h +64 -0
  374. package/third_party/s2geometry/src/s2/s2wedge_relations_test.cc +89 -0
  375. package/third_party/s2geometry/src/s2/sequence_lexicon.h +296 -0
  376. package/third_party/s2geometry/src/s2/sequence_lexicon_test.cc +113 -0
  377. package/third_party/s2geometry/src/s2/strings/ostringstream.cc +35 -0
  378. package/third_party/s2geometry/src/s2/strings/ostringstream.h +105 -0
  379. package/third_party/s2geometry/src/s2/strings/serialize.cc +46 -0
  380. package/third_party/s2geometry/src/s2/strings/serialize.h +40 -0
  381. package/third_party/s2geometry/src/s2/third_party/absl/algorithm/algorithm.h +187 -0
  382. package/third_party/s2geometry/src/s2/third_party/absl/base/attributes.h +666 -0
  383. package/third_party/s2geometry/src/s2/third_party/absl/base/casts.h +189 -0
  384. package/third_party/s2geometry/src/s2/third_party/absl/base/config.h +462 -0
  385. package/third_party/s2geometry/src/s2/third_party/absl/base/dynamic_annotations.cc +129 -0
  386. package/third_party/s2geometry/src/s2/third_party/absl/base/dynamic_annotations.h +394 -0
  387. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/atomic_hook.h +168 -0
  388. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/identity.h +33 -0
  389. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/inline_variable.h +117 -0
  390. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/invoke.h +188 -0
  391. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/raw_logging.cc +254 -0
  392. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/raw_logging.h +205 -0
  393. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/throw_delegate.cc +106 -0
  394. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/throw_delegate.h +71 -0
  395. package/third_party/s2geometry/src/s2/third_party/absl/base/internal/unaligned_access.h +322 -0
  396. package/third_party/s2geometry/src/s2/third_party/absl/base/log_severity.h +77 -0
  397. package/third_party/s2geometry/src/s2/third_party/absl/base/macros.h +236 -0
  398. package/third_party/s2geometry/src/s2/third_party/absl/base/optimization.h +177 -0
  399. package/third_party/s2geometry/src/s2/third_party/absl/base/policy_checks.h +124 -0
  400. package/third_party/s2geometry/src/s2/third_party/absl/base/port.h +97 -0
  401. package/third_party/s2geometry/src/s2/third_party/absl/base/thread_annotations.h +277 -0
  402. package/third_party/s2geometry/src/s2/third_party/absl/container/fixed_array.h +523 -0
  403. package/third_party/s2geometry/src/s2/third_party/absl/container/inlined_vector.h +1453 -0
  404. package/third_party/s2geometry/src/s2/third_party/absl/container/internal/compressed_tuple.h +191 -0
  405. package/third_party/s2geometry/src/s2/third_party/absl/container/internal/container_memory.h +424 -0
  406. package/third_party/s2geometry/src/s2/third_party/absl/container/internal/layout.h +739 -0
  407. package/third_party/s2geometry/src/s2/third_party/absl/memory/memory.h +755 -0
  408. package/third_party/s2geometry/src/s2/third_party/absl/meta/type_traits.h +436 -0
  409. package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128.cc +232 -0
  410. package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128.h +656 -0
  411. package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128_have_intrinsic.inc +3 -0
  412. package/third_party/s2geometry/src/s2/third_party/absl/numeric/int128_no_intrinsic.inc +3 -0
  413. package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii.cc +198 -0
  414. package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii.h +239 -0
  415. package/third_party/s2geometry/src/s2/third_party/absl/strings/ascii_ctype.h +66 -0
  416. package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/bits.h +53 -0
  417. package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/memutil.cc +110 -0
  418. package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/memutil.h +146 -0
  419. package/third_party/s2geometry/src/s2/third_party/absl/strings/internal/resize_uninitialized.h +72 -0
  420. package/third_party/s2geometry/src/s2/third_party/absl/strings/match.cc +38 -0
  421. package/third_party/s2geometry/src/s2/third_party/absl/strings/match.h +89 -0
  422. package/third_party/s2geometry/src/s2/third_party/absl/strings/numbers.cc +909 -0
  423. package/third_party/s2geometry/src/s2/third_party/absl/strings/numbers.h +187 -0
  424. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_cat.cc +240 -0
  425. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_cat.h +398 -0
  426. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_join.h +22 -0
  427. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_split.cc +47 -0
  428. package/third_party/s2geometry/src/s2/third_party/absl/strings/str_split.h +43 -0
  429. package/third_party/s2geometry/src/s2/third_party/absl/strings/string_view.cc +245 -0
  430. package/third_party/s2geometry/src/s2/third_party/absl/strings/string_view.h +602 -0
  431. package/third_party/s2geometry/src/s2/third_party/absl/strings/strip.cc +42 -0
  432. package/third_party/s2geometry/src/s2/third_party/absl/strings/strip.h +130 -0
  433. package/third_party/s2geometry/src/s2/third_party/absl/types/span.h +793 -0
  434. package/third_party/s2geometry/src/s2/third_party/absl/utility/utility.h +299 -0
  435. package/third_party/s2geometry/src/s2/util/bits/bit-interleave.cc +274 -0
  436. package/third_party/s2geometry/src/s2/util/bits/bit-interleave.h +53 -0
  437. package/third_party/s2geometry/src/s2/util/bits/bits.cc +155 -0
  438. package/third_party/s2geometry/src/s2/util/bits/bits.h +745 -0
  439. package/third_party/s2geometry/src/s2/util/coding/coder.cc +83 -0
  440. package/third_party/s2geometry/src/s2/util/coding/coder.h +553 -0
  441. package/third_party/s2geometry/src/s2/util/coding/nth-derivative.h +134 -0
  442. package/third_party/s2geometry/src/s2/util/coding/transforms.h +62 -0
  443. package/third_party/s2geometry/src/s2/util/coding/varint.cc +289 -0
  444. package/third_party/s2geometry/src/s2/util/coding/varint.h +476 -0
  445. package/third_party/s2geometry/src/s2/util/endian/endian.h +859 -0
  446. package/third_party/s2geometry/src/s2/util/gtl/btree.h +2471 -0
  447. package/third_party/s2geometry/src/s2/util/gtl/btree_container.h +411 -0
  448. package/third_party/s2geometry/src/s2/util/gtl/btree_map.h +79 -0
  449. package/third_party/s2geometry/src/s2/util/gtl/btree_set.h +73 -0
  450. package/third_party/s2geometry/src/s2/util/gtl/compact_array.h +653 -0
  451. package/third_party/s2geometry/src/s2/util/gtl/container_logging.h +291 -0
  452. package/third_party/s2geometry/src/s2/util/gtl/dense_hash_set.h +358 -0
  453. package/third_party/s2geometry/src/s2/util/gtl/densehashtable.h +1493 -0
  454. package/third_party/s2geometry/src/s2/util/gtl/hashtable_common.h +253 -0
  455. package/third_party/s2geometry/src/s2/util/gtl/layout.h +28 -0
  456. package/third_party/s2geometry/src/s2/util/gtl/legacy_random_shuffle.h +77 -0
  457. package/third_party/s2geometry/src/s2/util/hash/mix.h +76 -0
  458. package/third_party/s2geometry/src/s2/util/math/exactfloat/exactfloat.cc +832 -0
  459. package/third_party/s2geometry/src/s2/util/math/exactfloat/exactfloat.h +646 -0
  460. package/third_party/s2geometry/src/s2/util/math/mathutil.cc +75 -0
  461. package/third_party/s2geometry/src/s2/util/math/mathutil.h +189 -0
  462. package/third_party/s2geometry/src/s2/util/math/matrix3x3.h +574 -0
  463. package/third_party/s2geometry/src/s2/util/math/vector.h +569 -0
  464. package/third_party/s2geometry/src/s2/util/math/vector3_hash.h +54 -0
  465. package/third_party/s2geometry/src/s2/util/units/length-units.cc +21 -0
  466. package/third_party/s2geometry/src/s2/util/units/length-units.h +135 -0
  467. package/third_party/s2geometry/src/s2/util/units/physical-units.h +313 -0
  468. package/third_party/s2geometry/src/s2/value_lexicon.h +234 -0
  469. package/third_party/s2geometry/src/s2/value_lexicon_test.cc +121 -0
  470. package/third_party/s2geometry/third_party/cmake/FindGFlags.cmake +48 -0
  471. package/third_party/s2geometry/third_party/cmake/FindGlog.cmake +48 -0
@@ -0,0 +1,233 @@
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_vector_layer.h"
19
+
20
+ #include <memory>
21
+ #include <string>
22
+ #include "s2/base/casts.h"
23
+ #include "s2/base/integral_types.h"
24
+ #include <gtest/gtest.h>
25
+ #include "s2/third_party/absl/memory/memory.h"
26
+ #include "s2/third_party/absl/strings/str_join.h"
27
+ #include "s2/mutable_s2shape_index.h"
28
+ #include "s2/s2builderutil_snap_functions.h"
29
+ #include "s2/s2text_format.h"
30
+
31
+ using absl::make_unique;
32
+ using s2builderutil::IndexedS2PolylineVectorLayer;
33
+ using s2builderutil::S2PolylineVectorLayer;
34
+ using s2textformat::MakePolylineOrDie;
35
+ using std::unique_ptr;
36
+ using std::vector;
37
+
38
+ using EdgeType = S2Builder::EdgeType;
39
+ using PolylineType = S2PolylineVectorLayer::Options::PolylineType;
40
+
41
+ namespace {
42
+
43
+ void TestS2PolylineVector(
44
+ const vector<const char*>& input_strs,
45
+ const vector<const char*>& expected_strs,
46
+ EdgeType edge_type,
47
+ S2PolylineVectorLayer::Options layer_options = // by value
48
+ S2PolylineVectorLayer::Options(),
49
+ const S2Builder::Options& builder_options = S2Builder::Options()) {
50
+ layer_options.set_edge_type(edge_type);
51
+ SCOPED_TRACE(edge_type == EdgeType::DIRECTED ? "DIRECTED" : "UNDIRECTED");
52
+ S2Builder builder(builder_options);
53
+ vector<unique_ptr<S2Polyline>> output;
54
+ builder.StartLayer(
55
+ make_unique<S2PolylineVectorLayer>(&output, layer_options));
56
+ for (auto input_str : input_strs) {
57
+ builder.AddPolyline(*MakePolylineOrDie(input_str));
58
+ }
59
+ S2Error error;
60
+ ASSERT_TRUE(builder.Build(&error));
61
+ vector<string> output_strs;
62
+ for (const auto& polyline : output) {
63
+ output_strs.push_back(s2textformat::ToString(*polyline));
64
+ }
65
+ EXPECT_EQ(absl::StrJoin(expected_strs, "; "),
66
+ absl::StrJoin(output_strs, "; "));
67
+ }
68
+
69
+ // Convenience function that tests both directed and undirected edges.
70
+ void TestS2PolylineVector(
71
+ const vector<const char*>& input_strs,
72
+ const vector<const char*>& expected_strs,
73
+ const S2PolylineVectorLayer::Options& layer_options =
74
+ S2PolylineVectorLayer::Options(),
75
+ const S2Builder::Options& builder_options = S2Builder::Options()) {
76
+ TestS2PolylineVector(input_strs, expected_strs, EdgeType::DIRECTED,
77
+ layer_options, builder_options);
78
+ TestS2PolylineVector(input_strs, expected_strs, EdgeType::UNDIRECTED,
79
+ layer_options, builder_options);
80
+ }
81
+
82
+ void TestS2PolylineVectorUnchanged(const vector<const char*>& input_strs) {
83
+ TestS2PolylineVector(input_strs, input_strs);
84
+ }
85
+
86
+ TEST(S2PolylineVectorLayer, NoEdges) {
87
+ TestS2PolylineVectorUnchanged({});
88
+ }
89
+
90
+ TEST(S2PolylineVectorLayer, TwoPolylines) {
91
+ TestS2PolylineVectorUnchanged({"0:0, 1:1, 2:2", "4:4, 3:3"});
92
+ }
93
+
94
+ TEST(S2PolylineVectorLayer, JoiningPolylines) {
95
+ // Check that polylines are joined together when possible, even if they were
96
+ // not adjacent in the input. For undirected edges, the polyline direction
97
+ // should be chosen such that the first edge of the polyline was added to
98
+ // S2Builder before the last edge of the polyline.
99
+ TestS2PolylineVector({"1:1, 2:2", "3:3, 2:2", "0:0, 1:1"},
100
+ {"3:3, 2:2", "0:0, 1:1, 2:2"}, EdgeType::DIRECTED);
101
+ TestS2PolylineVector({"1:1, 2:2", "3:3, 2:2", "0:0, 1:1"},
102
+ {"3:3, 2:2, 1:1, 0:0"}, EdgeType::UNDIRECTED);
103
+ }
104
+
105
+ TEST(S2PolylineVectorLayer, SegmentNetwork) {
106
+ // Test a complex network of polylines that meet at shared vertices.
107
+ TestS2PolylineVectorUnchanged({
108
+ "0:0, 1:1, 2:2",
109
+ "2:2, 2:3, 2:4",
110
+ "2:4, 3:4, 4:4",
111
+ "2:2, 3:2, 4:2",
112
+ "4:2, 4:3, 4:4",
113
+ "1:0, 2:2",
114
+ "0:1, 2:2",
115
+ "5:4, 4:4",
116
+ "4:5, 4:4",
117
+ "2:4, 2:5, 1:5, 1:4, 2:4",
118
+ "4:2, 6:1, 5:0", // Two nested loops
119
+ "4:2, 7:0, 6:-1",
120
+ "11:1, 11:0, 10:0, 10:1, 11:1" // Isolated loop
121
+ });
122
+ }
123
+
124
+ TEST(S2PolylineVectorLayer, MultipleIntersectingWalks) {
125
+ // This checks idempotency for directed edges in the case of several
126
+ // polylines that share edges (and that even share loops). The test
127
+ // happens to pass for undirected edges as well.
128
+ S2PolylineVectorLayer::Options layer_options;
129
+ layer_options.set_polyline_type(PolylineType::WALK);
130
+ vector<const char*> input = {
131
+ "5:5, 5:6, 6:5, 5:5, 5:4, 5:3",
132
+ "4:4, 5:5, 6:5, 5:6, 5:5, 5:6, 6:5, 5:5, 4:5",
133
+ "3:5, 5:5, 5:6, 6:5, 5:5, 5:6, 6:6, 7:7",
134
+ };
135
+ TestS2PolylineVector(input, input, layer_options);
136
+ }
137
+
138
+ TEST(S2PolylineVectorLayer, EarlyWalkTermination) {
139
+ // This checks idempotency for cases where earlier polylines in the input
140
+ // happen to terminate in the middle of later polylines. This requires
141
+ // building non-maximal polylines.
142
+ S2PolylineVectorLayer::Options layer_options;
143
+ layer_options.set_polyline_type(PolylineType::WALK);
144
+ vector<const char*> input = {
145
+ "0:1, 1:1",
146
+ "1:0, 1:1, 1:2",
147
+ "0:2, 1:2, 2:2",
148
+ "2:1, 2:2, 2:3"
149
+ };
150
+ TestS2PolylineVector(input, input, layer_options);
151
+ }
152
+
153
+ TEST(S2PolylineVectorLayer, InputEdgeStartsMultipleLoops) {
154
+ // A single input edge is split into several segments by removing portions
155
+ // of it, and then each of those segments becomes one edge of a loop.
156
+ S2PolylineVectorLayer::Options layer_options;
157
+ layer_options.set_polyline_type(PolylineType::WALK);
158
+ layer_options.set_sibling_pairs(
159
+ S2PolylineVectorLayer::Options::SiblingPairs::DISCARD);
160
+ S2Builder::Options builder_options;
161
+ builder_options.set_snap_function(s2builderutil::IntLatLngSnapFunction(7));
162
+ vector<const char*> input = {
163
+ "0:10, 0:0",
164
+ "0:6, 1:6, 1:7, 0:7, 0:8",
165
+ "0:8, 1:8, 1:9, 0:9, 0:10",
166
+ "0:2, 1:2, 1:3, 0:3, 0:4",
167
+ "0:0, 1:0, 1:1, 0:1, 0:2",
168
+ "0:4, 1:4, 1:5, 0:5, 0:6",
169
+ };
170
+ vector<const char*> expected = {
171
+ "0:1, 0:0, 1:0, 1:1, 0:1",
172
+ "0:3, 0:2, 1:2, 1:3, 0:3",
173
+ "0:5, 0:4, 1:4, 1:5, 0:5",
174
+ "0:7, 0:6, 1:6, 1:7, 0:7",
175
+ "0:9, 0:8, 1:8, 1:9, 0:9",
176
+ };
177
+ TestS2PolylineVector(input, expected, layer_options, builder_options);
178
+ }
179
+
180
+ TEST(S2PolylineVectorLayer, SimpleEdgeLabels) {
181
+ S2Builder builder{S2Builder::Options()};
182
+ vector<unique_ptr<S2Polyline>> output;
183
+ S2PolylineVectorLayer::LabelSetIds label_set_ids;
184
+ IdSetLexicon label_set_lexicon;
185
+ S2PolylineVectorLayer::Options layer_options;
186
+ layer_options.set_edge_type(EdgeType::UNDIRECTED);
187
+ layer_options.set_duplicate_edges(
188
+ S2PolylineVectorLayer::Options::DuplicateEdges::MERGE);
189
+ builder.StartLayer(make_unique<S2PolylineVectorLayer>(
190
+ &output, &label_set_ids, &label_set_lexicon, layer_options));
191
+ builder.set_label(1);
192
+ builder.AddPolyline(*MakePolylineOrDie("0:0, 0:1, 0:2"));
193
+ builder.set_label(2);
194
+ builder.AddPolyline(*MakePolylineOrDie("0:3, 0:2, 0:1"));
195
+ builder.clear_labels();
196
+ builder.AddPolyline(*MakePolylineOrDie("0:4, 0:5"));
197
+ S2Error error;
198
+ ASSERT_TRUE(builder.Build(&error));
199
+ vector<vector<vector<int32>>> expected = {{{1}, {1, 2}, {2}}, {{}}};
200
+ ASSERT_EQ(expected.size(), label_set_ids.size());
201
+ for (int i = 0; i < expected.size(); ++i) {
202
+ ASSERT_EQ(expected[i].size(), label_set_ids[i].size());
203
+ for (int j = 0; j < expected[i].size(); ++j) {
204
+ ASSERT_EQ(expected[i][j].size(),
205
+ label_set_lexicon.id_set(label_set_ids[i][j]).size());
206
+ int k = 0;
207
+ for (int32 label : label_set_lexicon.id_set(label_set_ids[i][j])) {
208
+ EXPECT_EQ(expected[i][j][k++], label);
209
+ }
210
+ }
211
+ }
212
+ }
213
+
214
+ TEST(IndexedS2PolylineVectorLayer, AddsShapes) {
215
+ S2Builder builder{S2Builder::Options()};
216
+ MutableS2ShapeIndex index;
217
+ builder.StartLayer(make_unique<IndexedS2PolylineVectorLayer>(&index));
218
+ string polyline0_str = "0:0, 1:1";
219
+ string polyline1_str = "2:2, 3:3";
220
+ builder.AddPolyline(*s2textformat::MakePolylineOrDie(polyline0_str));
221
+ builder.AddPolyline(*s2textformat::MakePolylineOrDie(polyline1_str));
222
+ S2Error error;
223
+ ASSERT_TRUE(builder.Build(&error));
224
+ EXPECT_EQ(2, index.num_shape_ids());
225
+ const S2Polyline* polyline0 = down_cast<const S2Polyline::Shape*>(
226
+ index.shape(0))->polyline();
227
+ const S2Polyline* polyline1 = down_cast<const S2Polyline::Shape*>(
228
+ index.shape(1))->polyline();
229
+ EXPECT_EQ(polyline0_str, s2textformat::ToString(*polyline0));
230
+ EXPECT_EQ(polyline1_str, s2textformat::ToString(*polyline1));
231
+ }
232
+
233
+ } // namespace
@@ -0,0 +1,354 @@
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_snap_functions.h"
19
+
20
+ #include <algorithm>
21
+ #include <cfloat>
22
+ #include <cmath>
23
+ #include <memory>
24
+ #include "s2/base/integral_types.h"
25
+ #include "s2/base/logging.h"
26
+ #include "s2/third_party/absl/memory/memory.h"
27
+ #include "s2/s2cell_id.h"
28
+ #include "s2/s2latlng.h"
29
+ #include "s2/s2metrics.h"
30
+
31
+ using absl::make_unique;
32
+ using std::max;
33
+ using std::min;
34
+ using std::unique_ptr;
35
+
36
+ namespace s2builderutil {
37
+
38
+ const int IntLatLngSnapFunction::kMinExponent;
39
+ const int IntLatLngSnapFunction::kMaxExponent;
40
+
41
+ IdentitySnapFunction::IdentitySnapFunction()
42
+ : snap_radius_(S1Angle::Zero()) {
43
+ }
44
+
45
+ IdentitySnapFunction::IdentitySnapFunction(S1Angle snap_radius) {
46
+ set_snap_radius(snap_radius);
47
+ }
48
+
49
+ void IdentitySnapFunction::set_snap_radius(S1Angle snap_radius) {
50
+ S2_DCHECK_LE(snap_radius, kMaxSnapRadius());
51
+ snap_radius_ = snap_radius;
52
+ }
53
+
54
+ S1Angle IdentitySnapFunction::snap_radius() const {
55
+ return snap_radius_;
56
+ }
57
+
58
+ S1Angle IdentitySnapFunction::min_vertex_separation() const {
59
+ // Since SnapFunction does not move the input point, output vertices are
60
+ // separated by the full snap_radius().
61
+ return snap_radius_;
62
+ }
63
+
64
+ S1Angle IdentitySnapFunction::min_edge_vertex_separation() const {
65
+ // In the worst case configuration, the edge separation is half of the
66
+ // vertex separation.
67
+ return 0.5 * snap_radius_;
68
+ }
69
+
70
+ S2Point IdentitySnapFunction::SnapPoint(const S2Point& point) const {
71
+ return point;
72
+ }
73
+
74
+ unique_ptr<S2Builder::SnapFunction> IdentitySnapFunction::Clone() const {
75
+ return make_unique<IdentitySnapFunction>(*this);
76
+ }
77
+
78
+
79
+ S2CellIdSnapFunction::S2CellIdSnapFunction() {
80
+ set_level(S2CellId::kMaxLevel);
81
+ }
82
+
83
+ S2CellIdSnapFunction::S2CellIdSnapFunction(int level) {
84
+ set_level(level);
85
+ }
86
+
87
+ void S2CellIdSnapFunction::set_level(int level) {
88
+ S2_DCHECK_GE(level, 0);
89
+ S2_DCHECK_LE(level, S2CellId::kMaxLevel);
90
+ level_ = level;
91
+ set_snap_radius(MinSnapRadiusForLevel(level));
92
+ }
93
+
94
+ int S2CellIdSnapFunction::level() const {
95
+ return level_;
96
+ }
97
+
98
+ void S2CellIdSnapFunction::set_snap_radius(S1Angle snap_radius) {
99
+ S2_DCHECK_GE(snap_radius, MinSnapRadiusForLevel(level()));
100
+ S2_DCHECK_LE(snap_radius, kMaxSnapRadius());
101
+ snap_radius_ = snap_radius;
102
+ }
103
+
104
+ S1Angle S2CellIdSnapFunction::snap_radius() const {
105
+ return snap_radius_;
106
+ }
107
+
108
+ S1Angle S2CellIdSnapFunction::MinSnapRadiusForLevel(int level) {
109
+ // snap_radius() needs to be an upper bound on the true distance that a
110
+ // point can move when snapped, taking into account numerical errors.
111
+ //
112
+ // The maximum error when converting from an S2Point to an S2CellId is
113
+ // S2::kMaxDiag.deriv() * DBL_EPSILON. The maximum error when converting an
114
+ // S2CellId center back to an S2Point is 1.5 * DBL_EPSILON. These add up to
115
+ // just slightly less than 4 * DBL_EPSILON.
116
+ return S1Angle::Radians(0.5 * S2::kMaxDiag.GetValue(level) + 4 * DBL_EPSILON);
117
+ }
118
+
119
+ int S2CellIdSnapFunction::LevelForMaxSnapRadius(S1Angle snap_radius) {
120
+ // When choosing a level, we need to acount for the error bound of
121
+ // 4 * DBL_EPSILON that is added by MinSnapRadiusForLevel().
122
+ return S2::kMaxDiag.GetLevelForMaxValue(
123
+ 2 * (snap_radius.radians() - 4 * DBL_EPSILON));
124
+ }
125
+
126
+ S1Angle S2CellIdSnapFunction::min_vertex_separation() const {
127
+ // We have three different bounds for the minimum vertex separation: one is
128
+ // a constant bound, one is proportional to snap_radius, and one is equal to
129
+ // snap_radius minus a constant. These bounds give the best results for
130
+ // small, medium, and large snap radii respectively. We return the maximum
131
+ // of the three bounds.
132
+ //
133
+ // 1. Constant bound: Vertices are always separated by at least
134
+ // kMinEdge(level), the minimum edge length for the chosen snap level.
135
+ //
136
+ // 2. Proportional bound: It can be shown that in the plane, the worst-case
137
+ // configuration has a vertex separation of 2 / sqrt(13) * snap_radius.
138
+ // This is verified in the unit test, except that on the sphere the ratio
139
+ // is slightly smaller at cell level 2 (0.54849 vs. 0.55470). We reduce
140
+ // that value a bit more below to be conservative.
141
+ //
142
+ // 3. Best asymptotic bound: This bound bound is derived by observing we
143
+ // only select a new site when it is at least snap_radius() away from all
144
+ // existing sites, and the site can move by at most 0.5 * kMaxDiag(level)
145
+ // when snapped.
146
+ S1Angle min_edge = S1Angle::Radians(S2::kMinEdge.GetValue(level_));
147
+ S1Angle max_diag = S1Angle::Radians(S2::kMaxDiag.GetValue(level_));
148
+ return max(min_edge,
149
+ max(0.548 * snap_radius_, // 2 / sqrt(13) in the plane
150
+ snap_radius_ - 0.5 * max_diag));
151
+ }
152
+
153
+ S1Angle S2CellIdSnapFunction::min_edge_vertex_separation() const {
154
+ // Similar to min_vertex_separation(), in this case we have four bounds: a
155
+ // constant bound that holds only at the minimum snap radius, a constant
156
+ // bound that holds for any snap radius, a bound that is proportional to
157
+ // snap_radius, and a bound that is equal to snap_radius minus a constant.
158
+ //
159
+ // 1. Constant bounds:
160
+ //
161
+ // (a) At the minimum snap radius for a given level, it can be shown that
162
+ // vertices are separated from edges by at least 0.5 * kMinDiag(level) in
163
+ // the plane. The unit test verifies this, except that on the sphere the
164
+ // worst case is slightly better: 0.5652980068 * kMinDiag(level).
165
+ //
166
+ // (b) Otherwise, for arbitrary snap radii the worst-case configuration
167
+ // in the plane has an edge-vertex separation of sqrt(3/19) *
168
+ // kMinDiag(level), where sqrt(3/19) is about 0.3973597071. The unit
169
+ // test verifies that the bound is slighty better on the sphere:
170
+ // 0.3973595687 * kMinDiag(level).
171
+ //
172
+ // 2. Proportional bound: In the plane, the worst-case configuration has an
173
+ // edge-vertex separation of 2 * sqrt(3/247) * snap_radius, which is
174
+ // about 0.2204155075. The unit test verifies this, except that on the
175
+ // sphere the bound is slightly worse for certain large S2Cells: the
176
+ // minimum ratio occurs at cell level 6, and is about 0.2196666953.
177
+ //
178
+ // 3. Best asymptotic bound: If snap_radius() is large compared to the
179
+ // minimum snap radius, then the best bound is achieved by 3 sites on a
180
+ // circular arc of radius "snap_radius", spaced "min_vertex_separation"
181
+ // apart. An input edge passing just to one side of the center of the
182
+ // circle intersects the Voronoi regions of the two end sites but not the
183
+ // Voronoi region of the center site, and gives an edge separation of
184
+ // (min_vertex_separation ** 2) / (2 * snap_radius). This bound
185
+ // approaches 0.5 * snap_radius for large snap radii, i.e. the minimum
186
+ // edge-vertex separation approaches half of the minimum vertex
187
+ // separation as the snap radius becomes large compared to the cell size.
188
+
189
+ S1Angle min_diag = S1Angle::Radians(S2::kMinDiag.GetValue(level_));
190
+ if (snap_radius() == MinSnapRadiusForLevel(level_)) {
191
+ // This bound only holds when the minimum snap radius is being used.
192
+ return 0.565 * min_diag; // 0.500 in the plane
193
+ }
194
+ // Otherwise, these bounds hold for any snap_radius().
195
+ S1Angle vertex_sep = min_vertex_separation();
196
+ return max(0.397 * min_diag, // sqrt(3 / 19) in the plane
197
+ max(0.219 * snap_radius_, // 2 * sqrt(3 / 247) in the plane
198
+ 0.5 * (vertex_sep / snap_radius_) * vertex_sep));
199
+ }
200
+
201
+ S2Point S2CellIdSnapFunction::SnapPoint(const S2Point& point) const {
202
+ return S2CellId(point).parent(level_).ToPoint();
203
+ }
204
+
205
+ unique_ptr<S2Builder::SnapFunction> S2CellIdSnapFunction::Clone() const {
206
+ return make_unique<S2CellIdSnapFunction>(*this);
207
+ }
208
+
209
+ IntLatLngSnapFunction::IntLatLngSnapFunction()
210
+ : exponent_(-1), snap_radius_(), from_degrees_(0), to_degrees_(0) {
211
+ }
212
+
213
+ IntLatLngSnapFunction::IntLatLngSnapFunction(int exponent) {
214
+ set_exponent(exponent);
215
+ }
216
+
217
+ void IntLatLngSnapFunction::set_exponent(int exponent) {
218
+ S2_DCHECK_GE(exponent, kMinExponent);
219
+ S2_DCHECK_LE(exponent, kMaxExponent);
220
+ exponent_ = exponent;
221
+ set_snap_radius(MinSnapRadiusForExponent(exponent));
222
+
223
+ // Precompute the scale factors needed for snapping. Note that these
224
+ // calculations need to exactly match the ones in s1angle.h to ensure
225
+ // that the same S2Points are generated.
226
+ double power = 1;
227
+ for (int i = 0; i < exponent; ++i) power *= 10;
228
+ from_degrees_ = power;
229
+ to_degrees_ = 1 / power;
230
+ }
231
+
232
+ int IntLatLngSnapFunction::exponent() const {
233
+ return exponent_;
234
+ }
235
+
236
+ void IntLatLngSnapFunction::set_snap_radius(S1Angle snap_radius) {
237
+ S2_DCHECK_GE(snap_radius, MinSnapRadiusForExponent(exponent()));
238
+ S2_DCHECK_LE(snap_radius, kMaxSnapRadius());
239
+ snap_radius_ = snap_radius;
240
+ }
241
+
242
+ S1Angle IntLatLngSnapFunction::snap_radius() const {
243
+ return snap_radius_;
244
+ }
245
+
246
+ S1Angle IntLatLngSnapFunction::MinSnapRadiusForExponent(int exponent) {
247
+ // snap_radius() needs to be an upper bound on the true distance that a
248
+ // point can move when snapped, taking into account numerical errors.
249
+ //
250
+ // The maximum errors in latitude and longitude can be bounded as
251
+ // follows (as absolute errors in terms of DBL_EPSILON):
252
+ //
253
+ // Latitude Longitude
254
+ // Convert to S2LatLng: 1.000 1.000
255
+ // Convert to degrees: 1.032 2.063
256
+ // Scale by 10**exp: 0.786 1.571
257
+ // Round to integer: 0.5 * S1Angle::Degrees(to_degrees_)
258
+ // Scale by 10**(-exp): 1.375 2.749
259
+ // Convert to radians: 1.252 1.503
260
+ // ------------------------------------------------------------
261
+ // Total (except for rounding) 5.445 8.886
262
+ //
263
+ // The maximum error when converting the S2LatLng back to an S2Point is
264
+ //
265
+ // sqrt(2) * (maximum error in latitude or longitude) + 1.5 * DBL_EPSILON
266
+ //
267
+ // which works out to (9 * sqrt(2) + 1.5) * DBL_EPSILON radians. Finally
268
+ // we need to consider the effect of rounding to integer coordinates
269
+ // (much larger than the errors above), which can change the position by
270
+ // up to (sqrt(2) * 0.5 * to_degrees_) radians.
271
+ double power = 1;
272
+ for (int i = 0; i < exponent; ++i) power *= 10;
273
+ return (S1Angle::Degrees(M_SQRT1_2 / power) +
274
+ S1Angle::Radians((9 * M_SQRT2 + 1.5) * DBL_EPSILON));
275
+ }
276
+
277
+ int IntLatLngSnapFunction::ExponentForMaxSnapRadius(S1Angle snap_radius) {
278
+ // When choosing an exponent, we need to acount for the error bound of
279
+ // (9 * sqrt(2) + 1.5) * DBL_EPSILON added by MinSnapRadiusForExponent().
280
+ snap_radius -= S1Angle::Radians((9 * M_SQRT2 + 1.5) * DBL_EPSILON);
281
+ snap_radius = max(snap_radius, S1Angle::Radians(1e-30));
282
+ double exponent = log10(M_SQRT1_2 / snap_radius.degrees());
283
+
284
+ // There can be small errors in the calculation above, so to ensure that
285
+ // this function is the inverse of MinSnapRadiusForExponent() we subtract a
286
+ // small error tolerance.
287
+ return max(kMinExponent,
288
+ min(kMaxExponent,
289
+ static_cast<int>(std::ceil(exponent - 2 * DBL_EPSILON))));
290
+ }
291
+
292
+ S1Angle IntLatLngSnapFunction::min_vertex_separation() const {
293
+ // We have two bounds for the minimum vertex separation: one is proportional
294
+ // to snap_radius, and one is equal to snap_radius minus a constant. These
295
+ // bounds give the best results for small and large snap radii respectively.
296
+ // We return the maximum of the two bounds.
297
+ //
298
+ // 1. Proportional bound: It can be shown that in the plane, the worst-case
299
+ // configuration has a vertex separation of (sqrt(2) / 3) * snap_radius.
300
+ // This is verified in the unit test, except that on the sphere the ratio
301
+ // is slightly smaller (0.471337 vs. 0.471404). We reduce that value a
302
+ // bit more below to be conservative.
303
+ //
304
+ // 2. Best asymptotic bound: This bound bound is derived by observing we
305
+ // only select a new site when it is at least snap_radius() away from all
306
+ // existing sites, and snapping a vertex can move it by up to
307
+ // ((1 / sqrt(2)) * to_degrees_) degrees.
308
+ return max(0.471 * snap_radius_, // sqrt(2) / 3 in the plane
309
+ snap_radius_ - S1Angle::Degrees(M_SQRT1_2 * to_degrees_));
310
+ }
311
+
312
+ S1Angle IntLatLngSnapFunction::min_edge_vertex_separation() const {
313
+ // Similar to min_vertex_separation(), in this case we have three bounds:
314
+ // one is a constant bound, one is proportional to snap_radius, and one is
315
+ // equal to snap_radius minus a constant.
316
+ //
317
+ // 1. Constant bound: In the plane, the worst-case configuration has an
318
+ // edge-vertex separation of ((1 / sqrt(13)) * to_degrees_) degrees.
319
+ // The unit test verifies this, except that on the sphere the ratio is
320
+ // slightly lower when small exponents such as E1 are used
321
+ // (0.2772589 vs 0.2773501).
322
+ //
323
+ // 2. Proportional bound: In the plane, the worst-case configuration has an
324
+ // edge-vertex separation of (2 / 9) * snap_radius (0.222222222222). The
325
+ // unit test verifies this, except that on the sphere the bound can be
326
+ // slightly worse with large exponents (e.g., E9) due to small numerical
327
+ // errors (0.222222126756717).
328
+ //
329
+ // 3. Best asymptotic bound: If snap_radius() is large compared to the
330
+ // minimum snap radius, then the best bound is achieved by 3 sites on a
331
+ // circular arc of radius "snap_radius", spaced "min_vertex_separation"
332
+ // apart (see S2CellIdSnapFunction::min_edge_vertex_separation). This
333
+ // bound approaches 0.5 * snap_radius as the snap radius becomes large
334
+ // relative to the grid spacing.
335
+
336
+ S1Angle vertex_sep = min_vertex_separation();
337
+ return max(0.277 * S1Angle::Degrees(to_degrees_), // 1/sqrt(13) in the plane
338
+ max(0.222 * snap_radius_, // 2/9 in the plane
339
+ 0.5 * (vertex_sep / snap_radius_) * vertex_sep));
340
+ }
341
+
342
+ S2Point IntLatLngSnapFunction::SnapPoint(const S2Point& point) const {
343
+ S2_DCHECK_GE(exponent_, 0); // Make sure the snap function was initialized.
344
+ S2LatLng input(point);
345
+ int64 lat = MathUtil::FastInt64Round(input.lat().degrees() * from_degrees_);
346
+ int64 lng = MathUtil::FastInt64Round(input.lng().degrees() * from_degrees_);
347
+ return S2LatLng::FromDegrees(lat * to_degrees_, lng * to_degrees_).ToPoint();
348
+ }
349
+
350
+ unique_ptr<S2Builder::SnapFunction> IntLatLngSnapFunction::Clone() const {
351
+ return make_unique<IntLatLngSnapFunction>(*this);
352
+ }
353
+
354
+ } // namespace s2builderutil