@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,509 @@
1
+ // Copyright 2005 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/s2region_coverer.h"
19
+
20
+ #include <algorithm>
21
+ #include <cmath>
22
+ #include <cstdio>
23
+ #include <limits>
24
+ #include <queue>
25
+ #include <string>
26
+ #include <unordered_map>
27
+ #include <vector>
28
+
29
+ #include <gtest/gtest.h>
30
+
31
+ #include "s2/base/commandlineflags.h"
32
+ #include "s2/base/integral_types.h"
33
+ #include "s2/base/logging.h"
34
+ #include "s2/base/stringprintf.h"
35
+ #include "s2/base/strtoint.h"
36
+ #include "s2/s1angle.h"
37
+ #include "s2/s2cap.h"
38
+ #include "s2/s2cell.h"
39
+ #include "s2/s2cell_id.h"
40
+ #include "s2/s2cell_union.h"
41
+ #include "s2/s2latlng.h"
42
+ #include "s2/s2polyline.h"
43
+ #include "s2/s2region.h"
44
+ #include "s2/s2testing.h"
45
+ #include "s2/third_party/absl/memory/memory.h"
46
+ #include "s2/third_party/absl/strings/str_cat.h"
47
+ #include "s2/third_party/absl/strings/str_split.h"
48
+
49
+ using absl::StrCat;
50
+ using std::max;
51
+ using std::min;
52
+ using std::priority_queue;
53
+ using std::unordered_map;
54
+ using std::vector;
55
+
56
+ S2_DEFINE_string(max_cells, "4,8",
57
+ "Comma-separated list of values to use for 'max_cells'");
58
+
59
+ S2_DEFINE_int32(iters, google::DEBUG_MODE ? 1000 : 100000,
60
+ "Number of random caps to try for each max_cells value");
61
+
62
+ TEST(S2RegionCoverer, RandomCells) {
63
+ S2RegionCoverer::Options options;
64
+ options.set_max_cells(1);
65
+ S2RegionCoverer coverer(options);
66
+
67
+ // Test random cell ids at all levels.
68
+ for (int i = 0; i < 10000; ++i) {
69
+ S2CellId id = S2Testing::GetRandomCellId();
70
+ SCOPED_TRACE(StrCat("Iteration ", i, ", cell ID token ", id.ToToken()));
71
+ vector<S2CellId> covering = coverer.GetCovering(S2Cell(id)).Release();
72
+ EXPECT_EQ(1, covering.size());
73
+ EXPECT_EQ(id, covering[0]);
74
+ }
75
+ }
76
+
77
+ static void CheckCovering(const S2RegionCoverer::Options& options,
78
+ const S2Region& region,
79
+ const vector<S2CellId>& covering,
80
+ bool interior) {
81
+ // Keep track of how many cells have the same options.min_level() ancestor.
82
+ unordered_map<S2CellId, int, S2CellIdHash> min_level_cells;
83
+ for (S2CellId cell_id : covering) {
84
+ int level = cell_id.level();
85
+ EXPECT_GE(level, options.min_level());
86
+ EXPECT_LE(level, options.max_level());
87
+ EXPECT_EQ((level - options.min_level()) % options.level_mod(), 0);
88
+ min_level_cells[cell_id.parent(options.min_level())] += 1;
89
+ }
90
+ if (covering.size() > options.max_cells()) {
91
+ // If the covering has more than the requested number of cells, then check
92
+ // that the cell count cannot be reduced by using the parent of some cell.
93
+ for (unordered_map<S2CellId, int, S2CellIdHash>::const_iterator i =
94
+ min_level_cells.begin();
95
+ i != min_level_cells.end(); ++i) {
96
+ EXPECT_EQ(i->second, 1);
97
+ }
98
+ }
99
+ if (interior) {
100
+ for (S2CellId cell_id : covering) {
101
+ EXPECT_TRUE(region.Contains(S2Cell(cell_id)));
102
+ }
103
+ } else {
104
+ S2CellUnion cell_union(covering);
105
+ S2Testing::CheckCovering(region, cell_union, true);
106
+ }
107
+ }
108
+
109
+ TEST(S2RegionCoverer, RandomCaps) {
110
+ static const int kMaxLevel = S2CellId::kMaxLevel;
111
+ S2RegionCoverer::Options options;
112
+ for (int i = 0; i < 1000; ++i) {
113
+ do {
114
+ options.set_min_level(S2Testing::rnd.Uniform(kMaxLevel + 1));
115
+ options.set_max_level(S2Testing::rnd.Uniform(kMaxLevel + 1));
116
+ } while (options.min_level() > options.max_level());
117
+ options.set_max_cells(S2Testing::rnd.Skewed(10));
118
+ options.set_level_mod(1 + S2Testing::rnd.Uniform(3));
119
+ double max_area = min(4 * M_PI, (3 * options.max_cells() + 1) *
120
+ S2Cell::AverageArea(options.min_level()));
121
+ S2Cap cap = S2Testing::GetRandomCap(0.1 * S2Cell::AverageArea(kMaxLevel),
122
+ max_area);
123
+ S2RegionCoverer coverer(options);
124
+ vector<S2CellId> covering, interior;
125
+ coverer.GetCovering(cap, &covering);
126
+ CheckCovering(options, cap, covering, false);
127
+ coverer.GetInteriorCovering(cap, &interior);
128
+ CheckCovering(options, cap, interior, true);
129
+
130
+ // Check that GetCovering is deterministic.
131
+ vector<S2CellId> covering2;
132
+ coverer.GetCovering(cap, &covering2);
133
+ EXPECT_EQ(covering, covering2);
134
+
135
+ // Also check S2CellUnion::Denormalize(). The denormalized covering
136
+ // may still be different and smaller than "covering" because
137
+ // S2RegionCoverer does not guarantee that it will not output all four
138
+ // children of the same parent.
139
+ S2CellUnion cells(covering);
140
+ vector<S2CellId> denormalized;
141
+ cells.Denormalize(options.min_level(), options.level_mod(), &denormalized);
142
+ CheckCovering(options, cap, denormalized, false);
143
+ }
144
+ }
145
+
146
+ TEST(S2RegionCoverer, SimpleCoverings) {
147
+ static const int kMaxLevel = S2CellId::kMaxLevel;
148
+ S2RegionCoverer::Options options;
149
+ options.set_max_cells(std::numeric_limits<int32>::max());
150
+ for (int i = 0; i < 1000; ++i) {
151
+ int level = S2Testing::rnd.Uniform(kMaxLevel + 1);
152
+ options.set_min_level(level);
153
+ options.set_max_level(level);
154
+ double max_area = min(4 * M_PI, 1000 * S2Cell::AverageArea(level));
155
+ S2Cap cap = S2Testing::GetRandomCap(0.1 * S2Cell::AverageArea(kMaxLevel),
156
+ max_area);
157
+ vector<S2CellId> covering;
158
+ S2RegionCoverer::GetSimpleCovering(cap, cap.center(), level, &covering);
159
+ CheckCovering(options, cap, covering, false);
160
+ }
161
+ }
162
+
163
+ // We keep a priority queue of the caps that had the worst approximation
164
+ // ratios so that we can print them at the end.
165
+ struct WorstCap {
166
+ double ratio;
167
+ S2Cap cap;
168
+ int num_cells;
169
+ bool operator<(const WorstCap& o) const { return ratio > o.ratio; }
170
+ WorstCap(double r, const S2Cap& c, int n) : ratio(r), cap(c), num_cells(n) {}
171
+ };
172
+
173
+ static void TestAccuracy(int max_cells) {
174
+ SCOPED_TRACE(StrCat(max_cells, " cells"));
175
+
176
+ static const int kNumMethods = 1;
177
+ // This code is designed to evaluate several approximation algorithms and
178
+ // figure out which one works better. The way to do this is to hack the
179
+ // S2RegionCoverer interface to add a global variable to control which
180
+ // algorithm (or variant of an algorithm) is selected, and then assign to
181
+ // this variable in the "method" loop below. The code below will then
182
+ // collect statistics on all methods, including how often each one wins in
183
+ // terms of cell count and approximation area.
184
+
185
+ S2RegionCoverer coverer;
186
+ coverer.mutable_options()->set_max_cells(max_cells);
187
+
188
+ double ratio_total[kNumMethods] = {0};
189
+ double min_ratio[kNumMethods]; // initialized in loop below
190
+ double max_ratio[kNumMethods] = {0};
191
+ vector<double> ratios[kNumMethods];
192
+ int cell_total[kNumMethods] = {0};
193
+ int area_winner_tally[kNumMethods] = {0};
194
+ int cell_winner_tally[kNumMethods] = {0};
195
+ static const int kMaxWorstCaps = 10;
196
+ priority_queue<WorstCap> worst_caps[kNumMethods];
197
+
198
+ for (int method = 0; method < kNumMethods; ++method) {
199
+ min_ratio[method] = 1e20;
200
+ }
201
+ for (int i = 0; i < FLAGS_iters; ++i) {
202
+ // Choose the log of the cap area to be uniformly distributed over
203
+ // the allowable range. Don't try to approximate regions that are so
204
+ // small they can't use the given maximum number of cells efficiently.
205
+ const double min_cap_area = S2Cell::AverageArea(S2CellId::kMaxLevel)
206
+ * max_cells * max_cells;
207
+ // Coverings for huge caps are not interesting, so limit the max area too.
208
+ S2Cap cap = S2Testing::GetRandomCap(min_cap_area, 0.1 * M_PI);
209
+ double cap_area = cap.GetArea();
210
+
211
+ double min_area = 1e30;
212
+ int min_cells = 1 << 30;
213
+ double area[kNumMethods];
214
+ int cells[kNumMethods];
215
+ for (int method = 0; method < kNumMethods; ++method) {
216
+ // If you want to play with different methods, do this:
217
+ // S2RegionCoverer::method_number = method;
218
+
219
+ vector<S2CellId> covering;
220
+ coverer.GetCovering(cap, &covering);
221
+
222
+ double union_area = 0;
223
+ for (S2CellId cell_id : covering) {
224
+ union_area += S2Cell(cell_id).ExactArea();
225
+ }
226
+ cells[method] = covering.size();
227
+ min_cells = min(cells[method], min_cells);
228
+ area[method] = union_area;
229
+ min_area = min(area[method], min_area);
230
+ cell_total[method] += cells[method];
231
+ double ratio = area[method] / cap_area;
232
+ ratio_total[method] += ratio;
233
+ min_ratio[method] = min(ratio, min_ratio[method]);
234
+ max_ratio[method] = max(ratio, max_ratio[method]);
235
+ ratios[method].push_back(ratio);
236
+ if (worst_caps[method].size() < kMaxWorstCaps) {
237
+ worst_caps[method].push(WorstCap(ratio, cap, cells[method]));
238
+ } else if (ratio > worst_caps[method].top().ratio) {
239
+ worst_caps[method].pop();
240
+ worst_caps[method].push(WorstCap(ratio, cap, cells[method]));
241
+ }
242
+ }
243
+ for (int method = 0; method < kNumMethods; ++method) {
244
+ if (area[method] == min_area) ++area_winner_tally[method];
245
+ if (cells[method] == min_cells) ++cell_winner_tally[method];
246
+ }
247
+ }
248
+ for (int method = 0; method < kNumMethods; ++method) {
249
+ printf("\nMax cells %d, method %d:\n", max_cells, method);
250
+ printf(" Average cells: %.4f\n", cell_total[method] /
251
+ static_cast<double>(FLAGS_iters));
252
+ printf(" Average area ratio: %.4f\n", ratio_total[method] / FLAGS_iters);
253
+ vector<double>& mratios = ratios[method];
254
+ std::sort(mratios.begin(), mratios.end());
255
+ printf(" Median ratio: %.4f\n", mratios[mratios.size() / 2]);
256
+ printf(" Max ratio: %.4f\n", max_ratio[method]);
257
+ printf(" Min ratio: %.4f\n", min_ratio[method]);
258
+ if (kNumMethods > 1) {
259
+ printf(" Cell winner probability: %.4f\n",
260
+ cell_winner_tally[method] / static_cast<double>(FLAGS_iters));
261
+ printf(" Area winner probability: %.4f\n",
262
+ area_winner_tally[method] / static_cast<double>(FLAGS_iters));
263
+ }
264
+ printf(" Caps with the worst approximation ratios:\n");
265
+ for (; !worst_caps[method].empty(); worst_caps[method].pop()) {
266
+ const WorstCap& w = worst_caps[method].top();
267
+ S2LatLng ll(w.cap.center());
268
+ printf(" Ratio %.4f, Cells %d, "
269
+ "Center (%.8f, %.8f), Km %.6f\n",
270
+ w.ratio, w.num_cells,
271
+ ll.lat().degrees(), ll.lng().degrees(),
272
+ w.cap.GetRadius().radians() * 6367.0);
273
+ }
274
+ }
275
+ }
276
+
277
+ TEST(S2RegionCoverer, Accuracy) {
278
+ for (auto max_cells :
279
+ absl::StrSplit(FLAGS_max_cells, ',', absl::SkipEmpty())) {
280
+ TestAccuracy(atoi32(string(max_cells).c_str()));
281
+ }
282
+ }
283
+
284
+ TEST(S2RegionCoverer, InteriorCovering) {
285
+ // We construct the region the following way. Start with S2 cell of level l.
286
+ // Remove from it one of its grandchildren (level l+2). If we then set
287
+ // min_level < l + 1
288
+ // max_level > l + 2
289
+ // max_cells = 3
290
+ // the best interior covering should contain 3 children of the initial cell,
291
+ // that were not effected by removal of a grandchild.
292
+ const int level = 12;
293
+ S2CellId small_cell =
294
+ S2CellId(S2Testing::RandomPoint()).parent(level + 2);
295
+ S2CellId large_cell = small_cell.parent(level);
296
+ S2CellUnion diff =
297
+ S2CellUnion({large_cell}).Difference(S2CellUnion({small_cell}));
298
+ S2RegionCoverer::Options options;
299
+ options.set_max_cells(3);
300
+ options.set_max_level(level + 3);
301
+ options.set_min_level(level);
302
+ S2RegionCoverer coverer(options);
303
+ vector<S2CellId> interior;
304
+ coverer.GetInteriorCovering(diff, &interior);
305
+ ASSERT_EQ(interior.size(), 3);
306
+ for (int i = 0; i < 3; ++i) {
307
+ EXPECT_EQ(interior[i].level(), level + 1);
308
+ }
309
+ }
310
+
311
+ TEST(GetFastCovering, HugeFixedLevelCovering) {
312
+ // Test a "fast covering" with a huge number of cells due to min_level().
313
+ S2RegionCoverer::Options options;
314
+ options.set_min_level(10);
315
+ S2RegionCoverer coverer(options);
316
+ vector<S2CellId> covering;
317
+ S2Cell region(S2CellId::FromDebugString("1/23"));
318
+ coverer.GetFastCovering(region, &covering);
319
+ EXPECT_GE(covering.size(), 1 << 16);
320
+ }
321
+
322
+ bool IsCanonical(const vector<string>& input_str,
323
+ const S2RegionCoverer::Options& options) {
324
+ vector<S2CellId> input;
325
+ for (const auto& str : input_str) {
326
+ input.push_back(S2CellId::FromDebugString(str));
327
+ }
328
+ S2RegionCoverer coverer(options);
329
+ return coverer.IsCanonical(input);
330
+ }
331
+
332
+ TEST(IsCanonical, InvalidS2CellId) {
333
+ EXPECT_TRUE(IsCanonical({"1/"}, S2RegionCoverer::Options()));
334
+ EXPECT_FALSE(IsCanonical({"invalid"}, S2RegionCoverer::Options()));
335
+ }
336
+
337
+ TEST(IsCanonical, Unsorted) {
338
+ EXPECT_TRUE(IsCanonical({"1/1", "1/3"}, S2RegionCoverer::Options()));
339
+ EXPECT_FALSE(IsCanonical({"1/3", "1/1"}, S2RegionCoverer::Options()));
340
+ }
341
+
342
+ TEST(IsCanonical, Overlapping) {
343
+ EXPECT_TRUE(IsCanonical({"1/2", "1/33"}, S2RegionCoverer::Options()));
344
+ EXPECT_FALSE(IsCanonical({"1/3", "1/33"}, S2RegionCoverer::Options()));
345
+ }
346
+
347
+ TEST(IsCanonical, MinLevel) {
348
+ S2RegionCoverer::Options options;
349
+ options.set_min_level(2);
350
+ EXPECT_TRUE(IsCanonical({"1/31"}, options));
351
+ EXPECT_FALSE(IsCanonical({"1/3"}, options));
352
+ }
353
+
354
+ TEST(IsCanonical, MaxLevel) {
355
+ S2RegionCoverer::Options options;
356
+ options.set_max_level(2);
357
+ EXPECT_TRUE(IsCanonical({"1/31"}, options));
358
+ EXPECT_FALSE(IsCanonical({"1/312"}, options));
359
+ }
360
+
361
+ TEST(IsCanonical, LevelMod) {
362
+ S2RegionCoverer::Options options;
363
+ options.set_level_mod(2);
364
+ EXPECT_TRUE(IsCanonical({"1/31"}, options));
365
+ EXPECT_FALSE(IsCanonical({"1/312"}, options));
366
+ }
367
+
368
+ TEST(IsCanonical, MaxCells) {
369
+ S2RegionCoverer::Options options;
370
+ options.set_max_cells(2);
371
+ EXPECT_TRUE(IsCanonical({"1/1", "1/3"}, options));
372
+ EXPECT_FALSE(IsCanonical({"1/1", "1/3", "2/"}, options));
373
+ EXPECT_TRUE(IsCanonical({"1/123", "2/1", "3/0122"}, options));
374
+ }
375
+
376
+ TEST(IsCanonical, Normalized) {
377
+ // Test that no sequence of cells could be replaced by an ancestor.
378
+ S2RegionCoverer::Options options;
379
+ EXPECT_TRUE(IsCanonical({"1/01", "1/02", "1/03", "1/10", "1/11"}, options));
380
+ EXPECT_FALSE(IsCanonical({"1/00", "1/01", "1/02", "1/03", "1/10"}, options));
381
+
382
+ EXPECT_TRUE(IsCanonical({"0/22", "1/01", "1/02", "1/03", "1/10"}, options));
383
+ EXPECT_FALSE(IsCanonical({"0/22", "1/00", "1/01", "1/02", "1/03"}, options));
384
+
385
+ options.set_max_cells(20);
386
+ options.set_level_mod(2);
387
+ EXPECT_TRUE(IsCanonical(
388
+ {"1/1101", "1/1102", "1/1103", "1/1110",
389
+ "1/1111", "1/1112", "1/1113", "1/1120",
390
+ "1/1121", "1/1122", "1/1123", "1/1130",
391
+ "1/1131", "1/1132", "1/1133", "1/1200"}, options));
392
+ EXPECT_FALSE(IsCanonical(
393
+ {"1/1100", "1/1101", "1/1102", "1/1103",
394
+ "1/1110", "1/1111", "1/1112", "1/1113",
395
+ "1/1120", "1/1121", "1/1122", "1/1123",
396
+ "1/1130", "1/1131", "1/1132", "1/1133"}, options));
397
+ }
398
+
399
+ void TestCanonicalizeCovering(
400
+ const vector<string>& input_str,
401
+ const vector<string>& expected_str,
402
+ const S2RegionCoverer::Options& options) {
403
+ vector<S2CellId> actual, expected;
404
+ for (const auto& str : input_str) {
405
+ actual.push_back(S2CellId::FromDebugString(str));
406
+ }
407
+ for (const auto& str : expected_str) {
408
+ expected.push_back(S2CellId::FromDebugString(str));
409
+ }
410
+ S2RegionCoverer coverer(options);
411
+ EXPECT_FALSE(coverer.IsCanonical(actual));
412
+ coverer.CanonicalizeCovering(&actual);
413
+ EXPECT_TRUE(coverer.IsCanonical(actual));
414
+ vector<string> actual_str;
415
+ EXPECT_EQ(expected, actual);
416
+ }
417
+
418
+ TEST(CanonicalizeCovering, UnsortedDuplicateCells) {
419
+ S2RegionCoverer::Options options;
420
+ TestCanonicalizeCovering({"1/200", "1/13122", "1/20", "1/131", "1/13100"},
421
+ {"1/131", "1/20"}, options);
422
+ }
423
+
424
+ TEST(CanonicalizeCovering, MaxLevelExceeded) {
425
+ S2RegionCoverer::Options options;
426
+ options.set_max_level(2);
427
+ TestCanonicalizeCovering({"0/3001", "0/3002", "4/012301230123"},
428
+ {"0/30", "4/01"}, options);
429
+ }
430
+
431
+ TEST(CanonicalizeCovering, WrongLevelMod) {
432
+ S2RegionCoverer::Options options;
433
+ options.set_min_level(1);
434
+ options.set_level_mod(3);
435
+ TestCanonicalizeCovering({"0/0", "1/11", "2/222", "3/3333"},
436
+ {"0/0", "1/1", "2/2", "3/3333"}, options);
437
+ }
438
+
439
+ TEST(CanonicalizeCovering, ReplacedByParent) {
440
+ // Test that 16 children are replaced by their parent when level_mod == 2.
441
+ S2RegionCoverer::Options options;
442
+ options.set_level_mod(2);
443
+ TestCanonicalizeCovering(
444
+ {"0/00", "0/01", "0/02", "0/03", "0/10", "0/11", "0/12", "0/13",
445
+ "0/20", "0/21", "0/22", "0/23", "0/30", "0/31", "0/32", "0/33"},
446
+ {"0/"}, options);
447
+ }
448
+
449
+ TEST(CanonicalizeCovering, DenormalizedCellUnion) {
450
+ // Test that all 4 children of a cell may be used when this is necessary to
451
+ // satisfy min_level() or level_mod();
452
+ S2RegionCoverer::Options options;
453
+ options.set_min_level(1);
454
+ options.set_level_mod(2);
455
+ TestCanonicalizeCovering(
456
+ {"0/", "1/130", "1/131", "1/132", "1/133"},
457
+ {"0/0", "0/1", "0/2", "0/3", "1/130", "1/131", "1/132", "1/133"},
458
+ options);
459
+ }
460
+
461
+ TEST(CanonicalizeCovering, MaxCellsMergesSmallest) {
462
+ // When there are too many cells, the smallest cells should be merged first.
463
+ S2RegionCoverer::Options options;
464
+ options.set_max_cells(3);
465
+ TestCanonicalizeCovering(
466
+ {"0/", "1/0", "1/1", "2/01300", "2/0131313"},
467
+ {"0/", "1/", "2/013"}, options);
468
+ }
469
+
470
+ TEST(CanonicalizeCovering, MaxCellsMergesRepeatedly) {
471
+ // Check that when merging creates a cell when all 4 children are present,
472
+ // those cells are merged into their parent (repeatedly if necessary).
473
+ S2RegionCoverer::Options options;
474
+ options.set_max_cells(8);
475
+ TestCanonicalizeCovering(
476
+ {"0/0121", "0/0123", "1/0", "1/1", "1/2", "1/30", "1/32", "1/33",
477
+ "1/311", "1/312", "1/313", "1/3100", "1/3101", "1/3103",
478
+ "1/31021", "1/31023"},
479
+ {"0/0121", "0/0123", "1/"}, options);
480
+ }
481
+
482
+ TEST(JavaCcConsistency, CheckCovering) {
483
+ std::vector<S2Point> points = {
484
+ S2LatLng::FromDegrees(-33.8663457, 151.1960891).ToPoint(),
485
+ S2LatLng::FromDegrees(-33.866094000000004, 151.19517439999998).ToPoint()};
486
+ std::unique_ptr<S2Polyline> polyline = absl::make_unique<S2Polyline>(points);
487
+ S2RegionCoverer coverer;
488
+ coverer.mutable_options()->set_min_level(0);
489
+ coverer.mutable_options()->set_max_level(22);
490
+ coverer.mutable_options()->set_max_cells(INT_MAX);
491
+ S2CellUnion ret = coverer.GetCovering(*polyline);
492
+ std::vector<std::string> expected(
493
+ {"6b12ae36313d", "6b12ae36313f", "6b12ae363141", "6b12ae363143",
494
+ "6b12ae363145", "6b12ae363159", "6b12ae36315b", "6b12ae363343",
495
+ "6b12ae363345", "6b12ae36334d", "6b12ae36334f", "6b12ae363369",
496
+ "6b12ae36336f", "6b12ae363371", "6b12ae363377", "6b12ae363391",
497
+ "6b12ae363393", "6b12ae36339b", "6b12ae36339d", "6b12ae3633e3",
498
+ "6b12ae3633e5", "6b12ae3633ed", "6b12ae3633ef", "6b12ae37cc11",
499
+ "6b12ae37cc13", "6b12ae37cc1b", "6b12ae37cc1d", "6b12ae37cc63",
500
+ "6b12ae37cc65", "6b12ae37cc6d", "6b12ae37cc6f", "6b12ae37cc89",
501
+ "6b12ae37cc8f", "6b12ae37cc91", "6b12ae37cc97", "6b12ae37ccb1",
502
+ "6b12ae37ccb3", "6b12ae37ccbb", "6b12ae37ccbd", "6b12ae37cea5",
503
+ "6b12ae37cea7", "6b12ae37cebb"});
504
+ std::vector<std::string> actual;
505
+ for (auto& cell_id : ret) {
506
+ actual.push_back(cell_id.ToToken());
507
+ }
508
+ EXPECT_EQ(expected, actual);
509
+ }
@@ -0,0 +1,84 @@
1
+ // Copyright 2006 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
+
17
+ #include "s2/s2region_intersection.h"
18
+
19
+ #include "s2/s2cap.h"
20
+ #include "s2/s2latlng_rect.h"
21
+
22
+ using std::vector;
23
+
24
+ S2RegionIntersection::S2RegionIntersection(
25
+ vector<std::unique_ptr<S2Region>> regions) {
26
+ Init(std::move(regions));
27
+ }
28
+
29
+ void S2RegionIntersection::Init(vector<std::unique_ptr<S2Region>> regions) {
30
+ S2_DCHECK(regions_.empty());
31
+ regions_ = std::move(regions);
32
+ }
33
+
34
+ S2RegionIntersection::S2RegionIntersection(const S2RegionIntersection& src)
35
+ : regions_(src.num_regions()) {
36
+ for (int i = 0; i < num_regions(); ++i) {
37
+ regions_[i].reset(src.region(i)->Clone());
38
+ }
39
+ }
40
+
41
+ vector<std::unique_ptr<S2Region>> S2RegionIntersection::Release() {
42
+ vector<std::unique_ptr<S2Region>> result;
43
+ result.swap(regions_);
44
+ return result;
45
+ }
46
+
47
+ S2RegionIntersection* S2RegionIntersection::Clone() const {
48
+ return new S2RegionIntersection(*this);
49
+ }
50
+
51
+ S2Cap S2RegionIntersection::GetCapBound() const {
52
+ // TODO(ericv): This could be optimized to return a tighter bound, but
53
+ // doesn't seem worth it unless profiling shows otherwise.
54
+ return GetRectBound().GetCapBound();
55
+ }
56
+
57
+ S2LatLngRect S2RegionIntersection::GetRectBound() const {
58
+ S2LatLngRect result = S2LatLngRect::Full();
59
+ for (int i = 0; i < num_regions(); ++i) {
60
+ result = result.Intersection(region(i)->GetRectBound());
61
+ }
62
+ return result;
63
+ }
64
+
65
+ bool S2RegionIntersection::Contains(const S2Cell& cell) const {
66
+ for (int i = 0; i < num_regions(); ++i) {
67
+ if (!region(i)->Contains(cell)) return false;
68
+ }
69
+ return true;
70
+ }
71
+
72
+ bool S2RegionIntersection::Contains(const S2Point& p) const {
73
+ for (int i = 0; i < num_regions(); ++i) {
74
+ if (!region(i)->Contains(p)) return false;
75
+ }
76
+ return true;
77
+ }
78
+
79
+ bool S2RegionIntersection::MayIntersect(const S2Cell& cell) const {
80
+ for (int i = 0; i < num_regions(); ++i) {
81
+ if (!region(i)->MayIntersect(cell)) return false;
82
+ }
83
+ return true;
84
+ }
@@ -0,0 +1,79 @@
1
+ // Copyright 2006 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
+
17
+ #ifndef S2_S2REGION_INTERSECTION_H_
18
+ #define S2_S2REGION_INTERSECTION_H_
19
+
20
+ #include <memory>
21
+ #include <vector>
22
+
23
+ #include "s2/base/logging.h"
24
+ #include "s2/_fp_contract_off.h"
25
+ #include "s2/s2region.h"
26
+ #include "s2/third_party/absl/base/macros.h"
27
+
28
+ class Decoder;
29
+ class Encoder;
30
+ class S2Cap;
31
+ class S2Cell;
32
+ class S2LatLngRect;
33
+
34
+ // An S2RegionIntersection represents the intersection of a set of regions.
35
+ // It is convenient for computing a covering of the intersection of a set of
36
+ // regions.
37
+ class S2RegionIntersection final : public S2Region {
38
+ public:
39
+ // Creates an empty intersection that should be initialized by calling Init().
40
+ // Note: an intersection of no regions covers the entire sphere.
41
+ S2RegionIntersection() = default;
42
+
43
+ // Create a region representing the intersection of the given regions.
44
+ explicit S2RegionIntersection(std::vector<std::unique_ptr<S2Region>> regions);
45
+
46
+ ~S2RegionIntersection() override = default;
47
+
48
+ // Initialize region by taking ownership of the given regions.
49
+ void Init(std::vector<std::unique_ptr<S2Region>> regions);
50
+
51
+ // Releases ownership of the regions of this intersection and returns them,
52
+ // leaving this region empty.
53
+ std::vector<std::unique_ptr<S2Region>> Release();
54
+
55
+ // Accessor methods.
56
+ int num_regions() const { return regions_.size(); }
57
+ const S2Region* region(int i) const { return regions_[i].get(); }
58
+
59
+ ////////////////////////////////////////////////////////////////////////
60
+ // S2Region interface (see s2region.h for details):
61
+
62
+ S2RegionIntersection* Clone() const override;
63
+ S2Cap GetCapBound() const override;
64
+ S2LatLngRect GetRectBound() const override;
65
+ bool Contains(const S2Point& p) const override;
66
+ bool Contains(const S2Cell& cell) const override;
67
+ bool MayIntersect(const S2Cell& cell) const override;
68
+
69
+ private:
70
+ // Internal copy constructor used only by Clone() that makes a deep copy of
71
+ // its argument.
72
+ S2RegionIntersection(const S2RegionIntersection& src);
73
+
74
+ std::vector<std::unique_ptr<S2Region>> regions_;
75
+
76
+ void operator=(const S2RegionIntersection&) = delete;
77
+ };
78
+
79
+ #endif // S2_S2REGION_INTERSECTION_H_