@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,270 @@
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
+ // Indexing Strategy
19
+ // -----------------
20
+ //
21
+ // Given a query region, we want to find all of the document regions that
22
+ // intersect it. The first step is to represent all the regions as S2Cell
23
+ // coverings (see S2RegionCoverer). We then split the problem into two parts,
24
+ // namely finding the document regions that are "smaller" than the query
25
+ // region and those that are "larger" than the query region.
26
+ //
27
+ // We do this by defining two terms for each S2CellId: a "covering term" and
28
+ // an "ancestor term". (In the implementation below, covering terms are
29
+ // distinguished by prefixing a '$' to them.) For each document region, we
30
+ // insert a covering term for every cell in the region's covering, and we
31
+ // insert an ancestor term for these cells *and* all of their ancestors.
32
+ //
33
+ // Then given a query region, we can look up all the document regions that
34
+ // intersect its covering by querying the union of the following terms:
35
+ //
36
+ // 1. An "ancestor term" for each cell in the query region. These terms
37
+ // ensure that we find all document regions that are "smaller" than the
38
+ // query region, i.e. where the query region contains a cell that is either
39
+ // a cell of a document region or one of its ancestors.
40
+ //
41
+ // 2. A "covering term" for every ancestor of the cells in the query region.
42
+ // These terms ensure that we find all the document regions that are
43
+ // "larger" than the query region, i.e. where document region contains a
44
+ // cell that is a (proper) ancestor of a cell in the query region.
45
+ //
46
+ // Together, these terms find all of the document regions that intersect the
47
+ // query region. Furthermore, the number of terms to be indexed and queried
48
+ // are both fairly small, and can be bounded in terms of max_cells() and the
49
+ // number of cell levels used.
50
+ //
51
+ // Optimizations
52
+ // -------------
53
+ //
54
+ // + Cells at the maximum level being indexed (max_level()) have the special
55
+ // property that they will never be an ancestor of a cell in the query
56
+ // region. Therefore we can safely skip generating "covering terms" for
57
+ // these cells (see query step 2 above).
58
+ //
59
+ // + If the index will contain only points (rather than general regions), then
60
+ // we can skip all the covering terms mentioned above because there will
61
+ // never be any document regions larger than the query region. This can
62
+ // significantly reduce the size of queries.
63
+ //
64
+ // + If it is more important to optimize index size rather than query speed,
65
+ // the number of index terms can be reduced by creating ancestor terms only
66
+ // for the *proper* ancestors of the cells in a document region, and
67
+ // compensating for this by including covering terms for all cells in the
68
+ // query region (in addition to their ancestors).
69
+ //
70
+ // Effectively, when the query region and a document region contain exactly
71
+ // the same cell, we have a choice about whether to treat this match as a
72
+ // "covering term" or an "ancestor term". One choice minimizes query size
73
+ // while the other minimizes index size.
74
+
75
+ #include "s2/s2region_term_indexer.h"
76
+
77
+ #include <cctype>
78
+
79
+ #include "s2/base/logging.h"
80
+ #include "s2/s1angle.h"
81
+ #include "s2/s2cap.h"
82
+ #include "s2/s2cell_id.h"
83
+ #include "s2/s2region.h"
84
+ #include "s2/third_party/absl/strings/str_cat.h"
85
+
86
+ using absl::string_view;
87
+ using std::vector;
88
+
89
+ S2RegionTermIndexer::Options::Options() {
90
+ // Override the S2RegionCoverer defaults.
91
+ set_max_cells(8);
92
+ set_min_level(4);
93
+ set_max_level(16);
94
+ set_level_mod(1);
95
+ }
96
+
97
+ void S2RegionTermIndexer::Options::set_marker_character(char ch) {
98
+ S2_DCHECK(!std::isalnum(ch));
99
+ marker_ = string(1, ch);
100
+ }
101
+
102
+ S2RegionTermIndexer::S2RegionTermIndexer(const Options& options)
103
+ : options_(options) {
104
+ }
105
+
106
+ // Defaulted in the implementation to prevent inline bloat.
107
+ S2RegionTermIndexer::S2RegionTermIndexer() = default;
108
+ S2RegionTermIndexer::~S2RegionTermIndexer() = default;
109
+ S2RegionTermIndexer::S2RegionTermIndexer(S2RegionTermIndexer&&) = default;
110
+ S2RegionTermIndexer& S2RegionTermIndexer::operator=(S2RegionTermIndexer&&) =
111
+ default;
112
+
113
+ string S2RegionTermIndexer::GetTerm(TermType term_type, const S2CellId& id,
114
+ string_view prefix) const {
115
+ // There are generally more ancestor terms than covering terms, so we add
116
+ // the extra "marker" character to the covering terms to distinguish them.
117
+ if (term_type == TermType::ANCESTOR) {
118
+ return absl::StrCat(prefix, id.ToToken());
119
+ } else {
120
+ return absl::StrCat(prefix, options_.marker(), id.ToToken());
121
+ }
122
+ }
123
+
124
+ vector<string> S2RegionTermIndexer::GetIndexTerms(const S2Point& point,
125
+ string_view prefix) {
126
+ // See the top of this file for an overview of the indexing strategy.
127
+ //
128
+ // The last cell generated by this loop is effectively the covering for
129
+ // the given point. You might expect that this cell would be indexed as a
130
+ // covering term, but as an optimization we always index these cells as
131
+ // ancestor terms only. This is possible because query regions will never
132
+ // contain a descendant of such cells. Note that this is true even when
133
+ // max_level() != true_max_level() (see S2RegionCoverer::Options).
134
+
135
+ const S2CellId id(point);
136
+ vector<string> terms;
137
+ for (int level = options_.min_level(); level <= options_.max_level();
138
+ level += options_.level_mod()) {
139
+ terms.push_back(GetTerm(TermType::ANCESTOR, id.parent(level), prefix));
140
+ }
141
+ return terms;
142
+ }
143
+
144
+ vector<string> S2RegionTermIndexer::GetIndexTerms(const S2Region& region,
145
+ string_view prefix) {
146
+ // Note that options may have changed since the last call.
147
+ *coverer_.mutable_options() = options_;
148
+ S2CellUnion covering = coverer_.GetCovering(region);
149
+ return GetIndexTermsForCanonicalCovering(covering, prefix);
150
+ }
151
+
152
+ vector<string> S2RegionTermIndexer::GetIndexTermsForCanonicalCovering(
153
+ const S2CellUnion& covering, string_view prefix) {
154
+ // See the top of this file for an overview of the indexing strategy.
155
+ //
156
+ // Cells in the covering are normally indexed as covering terms. If we are
157
+ // optimizing for query time rather than index space, they are also indexed
158
+ // as ancestor terms (since this lets us reduce the number of terms in the
159
+ // query). Finally, as an optimization we always index true_max_level()
160
+ // cells as ancestor cells only, since these cells have the special property
161
+ // that query regions will never contain a descendant of these cells.
162
+
163
+ S2_CHECK(!options_.index_contains_points_only());
164
+ if (google::DEBUG_MODE) {
165
+ *coverer_.mutable_options() = options_;
166
+ S2_CHECK(coverer_.IsCanonical(covering));
167
+ }
168
+ vector<string> terms;
169
+ S2CellId prev_id = S2CellId::None();
170
+ int true_max_level = options_.true_max_level();
171
+ for (S2CellId id : covering) {
172
+ // IsCanonical() already checks the following conditions, but we repeat
173
+ // them here for documentation purposes.
174
+ int level = id.level();
175
+ S2_DCHECK_GE(level, options_.min_level());
176
+ S2_DCHECK_LE(level, options_.max_level());
177
+ S2_DCHECK_EQ(0, (level - options_.min_level()) % options_.level_mod());
178
+
179
+ if (level < true_max_level) {
180
+ // Add a covering term for this cell.
181
+ terms.push_back(GetTerm(TermType::COVERING, id, prefix));
182
+ }
183
+ if (level == true_max_level || !options_.optimize_for_space()) {
184
+ // Add an ancestor term for this cell at the constrained level.
185
+ terms.push_back(GetTerm(TermType::ANCESTOR, id.parent(level), prefix));
186
+ }
187
+ // Finally, add ancestor terms for all the ancestors of this cell.
188
+ while ((level -= options_.level_mod()) >= options_.min_level()) {
189
+ S2CellId ancestor_id = id.parent(level);
190
+ if (prev_id != S2CellId::None() && prev_id.level() > level &&
191
+ prev_id.parent(level) == ancestor_id) {
192
+ break; // We have already processed this cell and its ancestors.
193
+ }
194
+ terms.push_back(GetTerm(TermType::ANCESTOR, ancestor_id, prefix));
195
+ }
196
+ prev_id = id;
197
+ }
198
+ return terms;
199
+ }
200
+
201
+ vector<string> S2RegionTermIndexer::GetQueryTerms(const S2Point& point,
202
+ string_view prefix) {
203
+ // See the top of this file for an overview of the indexing strategy.
204
+
205
+ const S2CellId id(point);
206
+ vector<string> terms;
207
+ // Recall that all true_max_level() cells are indexed only as ancestor terms.
208
+ int level = options_.true_max_level();
209
+ terms.push_back(GetTerm(TermType::ANCESTOR, id.parent(level), prefix));
210
+ if (options_.index_contains_points_only()) return terms;
211
+
212
+ // Add covering terms for all the ancestor cells.
213
+ for (; level >= options_.min_level(); level -= options_.level_mod()) {
214
+ terms.push_back(GetTerm(TermType::COVERING, id.parent(level), prefix));
215
+ }
216
+ return terms;
217
+ }
218
+
219
+ vector<string> S2RegionTermIndexer::GetQueryTerms(const S2Region& region,
220
+ string_view prefix) {
221
+ // Note that options may have changed since the last call.
222
+ *coverer_.mutable_options() = options_;
223
+ S2CellUnion covering = coverer_.GetCovering(region);
224
+ return GetQueryTermsForCanonicalCovering(covering, prefix);
225
+ }
226
+
227
+ vector<string> S2RegionTermIndexer::GetQueryTermsForCanonicalCovering(
228
+ const S2CellUnion& covering, string_view prefix) {
229
+ // See the top of this file for an overview of the indexing strategy.
230
+
231
+ if (google::DEBUG_MODE) {
232
+ *coverer_.mutable_options() = options_;
233
+ S2_CHECK(coverer_.IsCanonical(covering));
234
+ }
235
+ vector<string> terms;
236
+ S2CellId prev_id = S2CellId::None();
237
+ int true_max_level = options_.true_max_level();
238
+ for (S2CellId id : covering) {
239
+ // IsCanonical() already checks the following conditions, but we repeat
240
+ // them here for documentation purposes.
241
+ int level = id.level();
242
+ S2_DCHECK_GE(level, options_.min_level());
243
+ S2_DCHECK_LE(level, options_.max_level());
244
+ S2_DCHECK_EQ(0, (level - options_.min_level()) % options_.level_mod());
245
+
246
+ // Cells in the covering are always queried as ancestor terms.
247
+ terms.push_back(GetTerm(TermType::ANCESTOR, id, prefix));
248
+
249
+ // If the index only contains points, there are no covering terms.
250
+ if (options_.index_contains_points_only()) continue;
251
+
252
+ // If we are optimizing for index space rather than query time, cells are
253
+ // also queried as covering terms (except for true_max_level() cells,
254
+ // which are indexed and queried as ancestor cells only).
255
+ if (options_.optimize_for_space() && level < true_max_level) {
256
+ terms.push_back(GetTerm(TermType::COVERING, id, prefix));
257
+ }
258
+ // Finally, add covering terms for all the ancestors of this cell.
259
+ while ((level -= options_.level_mod()) >= options_.min_level()) {
260
+ S2CellId ancestor_id = id.parent(level);
261
+ if (prev_id != S2CellId::None() && prev_id.level() > level &&
262
+ prev_id.parent(level) == ancestor_id) {
263
+ break; // We have already processed this cell and its ancestors.
264
+ }
265
+ terms.push_back(GetTerm(TermType::COVERING, ancestor_id, prefix));
266
+ }
267
+ prev_id = id;
268
+ }
269
+ return terms;
270
+ }
@@ -0,0 +1,299 @@
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
+ // S2RegionTermIndexer is a helper class for adding spatial data to an
19
+ // information retrieval system. Such systems work by converting documents
20
+ // into a collection of "index terms" (e.g., representing words or phrases),
21
+ // and then building an "inverted index" that maps each term to a list of
22
+ // documents (and document positions) where that term occurs.
23
+ //
24
+ // This class deals with the problem of converting spatial data into index
25
+ // terms, which can then be indexed along with the other document information.
26
+ //
27
+ // Spatial data is represented using the S2Region type. Useful S2Region
28
+ // subtypes include:
29
+ //
30
+ // S2Cap
31
+ // - a disc-shaped region
32
+ //
33
+ // S2LatLngRect
34
+ // - a rectangle in latitude-longitude coordinates
35
+ //
36
+ // S2Polyline
37
+ // - a polyline
38
+ //
39
+ // S2Polygon
40
+ // - a polygon, possibly with multiple holes and/or shells
41
+ //
42
+ // S2CellUnion
43
+ // - a region approximated as a collection of S2CellIds
44
+ //
45
+ // S2ShapeIndexRegion
46
+ // - an arbitrary collection of points, polylines, and polygons
47
+ //
48
+ // S2ShapeIndexBufferedRegion
49
+ // - like the above, but expanded by a given radius
50
+ //
51
+ // S2RegionUnion, S2RegionIntersection
52
+ // - the union or intersection of arbitrary other regions
53
+ //
54
+ // So for example, if you want to query documents that are within 500 meters
55
+ // of a polyline, you could use an S2ShapeIndexBufferedRegion containing the
56
+ // polyline with a radius of 500 meters.
57
+ //
58
+ // Example usage:
59
+ //
60
+ // // This class is intended to be used with an external key-value store,
61
+ // // but for this example will we use an unordered_map. The key is an
62
+ // // index term, and the value is a set of document ids.
63
+ // std::unordered_map<string, std::vector<int>> index;
64
+ //
65
+ // // Create an indexer that uses up to 10 cells to approximate each region.
66
+ // S2RegionTermIndexer::Options options;
67
+ // options.set_max_cells(10);
68
+ // S2RegionTermIndexer indexer(options);
69
+ //
70
+ // // For this example, we index a disc-shaped region with a 10km radius.
71
+ // S2LatLng center = S2LatLng::FromDegrees(44.1, -56.235);
72
+ // S1Angle radius = S2Earth::ToAngle(util::units::Kilometers(10.0));
73
+ // S2Cap cap(center.ToPoint(), radius);
74
+ //
75
+ // // Add the terms for this disc-shaped region to the index.
76
+ // for (const auto& term : indexer.GetIndexTerms(cap)) {
77
+ // index[term].push_back(kSomeDocumentId);
78
+ // }
79
+ //
80
+ // // And now at query time: build a latitude-longitude rectangle.
81
+ // S2LatLngRect rect(S2LatLng::FromDegrees(-12.1, 10.2),
82
+ // S2LatLng::FromDegrees(-9.2, 120.5));
83
+ //
84
+ // // Convert the query region to a set of terms, and compute the union
85
+ // // of the document ids associated with those terms.
86
+ // std::set<int> doc_ids;
87
+ // for (const auto& term : indexer.GetQueryTerms(rect)) {
88
+ // doc_ids.insert(index[term].begin(), index[term].end());
89
+ // }
90
+ //
91
+ // // "doc_ids" now contains all documents that intersect the query region,
92
+ // // along with some documents that nearly intersect it. The results can
93
+ // // be further pruned if desired by retrieving the original regions that
94
+ // // were indexed (i.e., the document contents) and checking for exact
95
+ // // intersection with the query region.
96
+
97
+ #ifndef S2_S2REGION_TERM_INDEXER_H_
98
+ #define S2_S2REGION_TERM_INDEXER_H_
99
+
100
+ #include <string>
101
+ #include <vector>
102
+
103
+ #include "s2/s2cell_union.h"
104
+ #include "s2/s2region.h"
105
+ #include "s2/s2region_coverer.h"
106
+ #include "s2/third_party/absl/strings/string_view.h"
107
+
108
+ class S2RegionTermIndexer {
109
+ public:
110
+ // The following parameters control the tradeoffs between index size, query
111
+ // size, and accuracy (see s2region_coverer.h for details).
112
+ //
113
+ // IMPORTANT: You must use the same values for min_level(), max_level(), and
114
+ // level_mod() for both indexing and queries, otherwise queries will return
115
+ // incorrect results. However, max_cells() can be changed as often as
116
+ // desired -- you can even change this parameter for every region.
117
+
118
+ class Options : public S2RegionCoverer::Options {
119
+ public:
120
+ Options();
121
+
122
+ ///////////////// Options Inherited From S2RegionCoverer ////////////////
123
+
124
+ // max_cells() controls the maximum number of cells when approximating
125
+ // each region. This parameter value may be changed as often as desired
126
+ // (using mutable_options(), see below), e.g. to approximate some regions
127
+ // more accurately than others.
128
+ //
129
+ // Increasing this value during indexing will make indexes more accurate
130
+ // but larger. Increasing this value for queries will make queries more
131
+ // accurate but slower. (See s2region_coverer.h for details on how this
132
+ // parameter affects accuracy.) For example, if you don't mind large
133
+ // indexes but want fast serving, it might be reasonable to set
134
+ // max_cells() == 100 during indexing and max_cells() == 8 for queries.
135
+ //
136
+ // DEFAULT: 8 (coarse approximations)
137
+ using S2RegionCoverer::Options::max_cells;
138
+ using S2RegionCoverer::Options::set_max_cells;
139
+
140
+ // min_level() and max_level() control the minimum and maximum size of the
141
+ // S2Cells used to approximate regions. Setting these parameters
142
+ // appropriately can reduce the size of the index and speed up queries by
143
+ // reducing the number of terms needed. For example, if you know that
144
+ // your query regions will rarely be less than 100 meters in width, then
145
+ // you could set max_level() as follows:
146
+ //
147
+ // options.set_max_level(S2::kAvgEdge.GetClosestLevel(
148
+ // S2Earth::MetersToRadians(100)));
149
+ //
150
+ // This restricts the index to S2Cells that are approximately 100 meters
151
+ // across or larger. Similar, if you know that query regions will rarely
152
+ // be larger than 1000km across, then you could set min_level() similarly.
153
+ //
154
+ // If min_level() is set too high, then large regions may generate too
155
+ // many query terms. If max_level() is set too low, then small query
156
+ // regions will not be able to discriminate which regions they intersect
157
+ // very precisely and may return many more candidates than necessary.
158
+ //
159
+ // If you have no idea about the scale of the regions being queried,
160
+ // it is perfectly fine to set min_level() == 0 and max_level() == 30
161
+ // (== S2::kMaxLevel). The only drawback is that may result in a larger
162
+ // index and slower queries.
163
+ //
164
+ // The default parameter values are suitable for query regions ranging
165
+ // from about 100 meters to 3000 km across.
166
+ //
167
+ // DEFAULT: 4 (average cell width == 600km)
168
+ using S2RegionCoverer::Options::min_level;
169
+ using S2RegionCoverer::Options::set_min_level;
170
+
171
+ // DEFAULT: 16 (average cell width == 150m)
172
+ using S2RegionCoverer::Options::max_level;
173
+ using S2RegionCoverer::Options::set_max_level;
174
+
175
+ // Setting level_mod() to a value greater than 1 increases the effective
176
+ // branching factor of the S2Cell hierarchy by skipping some levels. For
177
+ // example, if level_mod() == 2 then every second level is skipped (which
178
+ // increases the effective branching factor to 16). You might want to
179
+ // consider doing this if your query regions are typically very small
180
+ // (e.g., single points) and you don't mind increasing the index size
181
+ // (since skipping levels will reduce the accuracy of cell coverings for a
182
+ // given max_cells() limit).
183
+ //
184
+ // DEFAULT: 1 (don't skip any cell levels)
185
+ using S2RegionCoverer::Options::level_mod;
186
+ using S2RegionCoverer::Options::set_level_mod;
187
+
188
+ // If your index will only contain points (rather than regions), be sure
189
+ // to set this flag. This will generate smaller and faster queries that
190
+ // are specialized for the points-only case.
191
+ //
192
+ // With the default quality settings, this flag reduces the number of
193
+ // query terms by about a factor of two. (The improvement gets smaller
194
+ // as max_cells() is increased, but there is really no reason not to use
195
+ // this flag if your index consists entirely of points.)
196
+ //
197
+ // DEFAULT: false
198
+ bool index_contains_points_only() const { return points_only_; }
199
+ void set_index_contains_points_only(bool value) { points_only_ = value; }
200
+
201
+ // If true, the index will be optimized for space rather than for query
202
+ // time. With the default quality settings, this flag reduces the number
203
+ // of index terms and increases the number of query terms by the same
204
+ // factor (approximately 1.3). The factor increases up to a limiting
205
+ // ratio of 2.0 as max_cells() is increased.
206
+ //
207
+ // CAVEAT: This option has no effect if the index contains only points.
208
+ //
209
+ // DEFAULT: false
210
+ bool optimize_for_space() const { return optimize_for_space_; }
211
+ void set_optimize_for_space(bool value) { optimize_for_space_ = value; }
212
+
213
+ // A non-alphanumeric character that is used internally to distinguish
214
+ // between two different types of terms (by adding this character).
215
+ //
216
+ // REQUIRES: "ch" is non-alphanumeric.
217
+ // DEFAULT: '$'
218
+ const string& marker() const { return marker_; }
219
+ char marker_character() const { return marker_[0]; }
220
+ void set_marker_character(char ch);
221
+
222
+ private:
223
+ bool points_only_ = false;
224
+ bool optimize_for_space_ = false;
225
+ string marker_ = string(1, '$');
226
+ };
227
+
228
+ // Default constructor. Options can be set using mutable_options().
229
+ S2RegionTermIndexer();
230
+ ~S2RegionTermIndexer();
231
+
232
+ // Constructs an S2RegionTermIndexer with the given options.
233
+ explicit S2RegionTermIndexer(const Options& options);
234
+
235
+ // S2RegionTermIndexer is movable but not copyable.
236
+ S2RegionTermIndexer(const S2RegionTermIndexer&) = delete;
237
+ S2RegionTermIndexer& operator=(const S2RegionTermIndexer&) = delete;
238
+ S2RegionTermIndexer(S2RegionTermIndexer&&);
239
+ S2RegionTermIndexer& operator=(S2RegionTermIndexer&&);
240
+
241
+ // Returns the current options. Options can be modifed between calls.
242
+ const Options& options() const { return options_; }
243
+ Options* mutable_options() { return &options_; }
244
+
245
+ // Converts the given region into a set of terms for indexing. Terms
246
+ // consist of lowercase letters, numbers, '$', and an optional prefix.
247
+ //
248
+ // "prefix" is a unique prefix used to distinguish S2 terms from other terms
249
+ // in the repository. The prefix may also be used to index documents with
250
+ // multiple types of location information (e.g. store footprint, entrances,
251
+ // parking lots, etc). The prefix should be kept short since it is
252
+ // prepended to every term.
253
+ std::vector<string> GetIndexTerms(const S2Region& region,
254
+ absl::string_view prefix);
255
+
256
+ // Converts a given query region into a set of terms. If you compute the
257
+ // union of all the documents associated with these terms, the result will
258
+ // include all documents whose index region intersects the query region.
259
+ //
260
+ // "prefix" should match the corresponding value used when indexing.
261
+ std::vector<string> GetQueryTerms(const S2Region& region,
262
+ absl::string_view prefix);
263
+
264
+ // Convenience methods that accept an S2Point rather than S2Region. (These
265
+ // methods are also faster.)
266
+ //
267
+ // Note that you can index an S2LatLng by converting it to an S2Point first:
268
+ // auto terms = GetIndexTerms(S2Point(latlng), ...);
269
+ std::vector<string> GetIndexTerms(const S2Point& point,
270
+ absl::string_view prefix);
271
+ std::vector<string> GetQueryTerms(const S2Point& point,
272
+ absl::string_view prefix);
273
+
274
+ // Low-level methods that accept an S2CellUnion covering of the region to be
275
+ // indexed or queried.
276
+ //
277
+ // REQUIRES: "covering" satisfies the S2RegionCoverer::Options for this
278
+ // class (i.e., max_cells, min_level, max_level, and level_mod).
279
+ //
280
+ // If you have a covering that was computed using different options, then
281
+ // you can either call the regular S2Region methods (since S2CellUnion is a
282
+ // type of S2Region), or "canonicalize" the covering first by calling
283
+ // S2RegionCoverer::CanonicalizeCovering() with the same options.
284
+ std::vector<string> GetIndexTermsForCanonicalCovering(
285
+ const S2CellUnion& covering, absl::string_view prefix);
286
+ std::vector<string> GetQueryTermsForCanonicalCovering(
287
+ const S2CellUnion& covering, absl::string_view prefix);
288
+
289
+ private:
290
+ enum TermType { ANCESTOR, COVERING };
291
+
292
+ string GetTerm(TermType term_type, const S2CellId& id,
293
+ absl::string_view prefix) const;
294
+
295
+ Options options_;
296
+ S2RegionCoverer coverer_;
297
+ };
298
+
299
+ #endif // S2_S2REGION_TERM_INDEXER_H_