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