h3 3.6.0 → 3.7.2

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 (175) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby_ci.yml +30 -0
  3. data/.rubocop.yml +1 -1
  4. data/.ruby-version +1 -0
  5. data/CHANGELOG.md +39 -0
  6. data/Gemfile.lock +6 -24
  7. data/LICENSE.md +1 -1
  8. data/README.md +2 -3
  9. data/ext/h3/src/.github/workflows/test-linux.yml +118 -0
  10. data/ext/h3/src/.github/workflows/test-macos.yml +42 -0
  11. data/ext/h3/src/.github/workflows/test-website.yml +32 -0
  12. data/ext/h3/src/.github/workflows/test-windows.yml +44 -0
  13. data/ext/h3/src/.gitignore +5 -0
  14. data/ext/h3/src/.travis.yml +20 -42
  15. data/ext/h3/src/CHANGELOG.md +57 -0
  16. data/ext/h3/src/CMakeLists.txt +135 -33
  17. data/ext/h3/src/CONTRIBUTING.md +1 -1
  18. data/ext/h3/src/README.md +61 -11
  19. data/ext/h3/src/RELEASE.md +3 -1
  20. data/ext/h3/src/VERSION +1 -1
  21. data/ext/h3/src/dev-docs/RFCs/rfc-template.md +21 -0
  22. data/ext/h3/src/dev-docs/RFCs/v4.0.0/error-handling-rfc.md +21 -0
  23. data/ext/h3/src/dev-docs/RFCs/v4.0.0/names_for_concepts_types_functions.md +276 -0
  24. data/ext/h3/src/dev-docs/RFCs/v4.0.0/overrideable-allocators-rfc.md +141 -0
  25. data/ext/h3/src/dev-docs/RFCs/v4.0.0/polyfill-modes-rfc.md +21 -0
  26. data/ext/h3/src/dev-docs/RFCs/v4.0.0/vertex-mode-rfc.md +50 -0
  27. data/ext/h3/src/dev-docs/build_windows.md +6 -1
  28. data/ext/h3/src/dev-docs/creating_bindings.md +3 -3
  29. data/ext/h3/src/dev-docs/custom_alloc.md +27 -0
  30. data/ext/h3/src/docs/{overview/mainpage.md → README.md} +2 -3
  31. data/ext/h3/src/docs/api/misc.md +76 -0
  32. data/ext/h3/src/docs/community/applications.md +1 -0
  33. data/ext/h3/src/docs/community/bindings.md +10 -0
  34. data/ext/h3/src/docs/community/tutorials.md +8 -3
  35. data/ext/h3/src/docs/core-library/coordsystems.md +5 -4
  36. data/ext/h3/src/docs/core-library/filters.md +8 -9
  37. data/ext/h3/src/docs/core-library/geoToH3desc.md +2 -3
  38. data/ext/h3/src/docs/core-library/h3ToGeoBoundaryDesc.md +4 -5
  39. data/ext/h3/src/docs/core-library/h3ToGeoDesc.md +3 -4
  40. data/ext/h3/src/docs/core-library/h3indexing.md +26 -17
  41. data/ext/h3/src/docs/core-library/overview.md +2 -3
  42. data/ext/h3/src/docs/core-library/restable.md +1 -2
  43. data/ext/h3/src/docs/core-library/usage.md +1 -2
  44. data/ext/h3/src/docs/table-of-contents.json +47 -0
  45. data/ext/h3/src/docs/{overview/usecases.md → usecases.md} +6 -11
  46. data/ext/h3/src/scripts/binding_functions.sh +1 -1
  47. data/ext/h3/src/scripts/coverage.sh.in +1 -1
  48. data/ext/h3/src/scripts/update_version.sh +2 -2
  49. data/ext/h3/src/src/apps/applib/include/args.h +1 -0
  50. data/ext/h3/src/src/apps/applib/include/test.h +1 -0
  51. data/ext/h3/src/src/apps/applib/include/utility.h +7 -1
  52. data/ext/h3/src/src/apps/applib/lib/args.c +2 -0
  53. data/ext/h3/src/src/apps/applib/lib/kml.c +2 -0
  54. data/ext/h3/src/src/apps/applib/lib/test.c +1 -0
  55. data/ext/h3/src/src/apps/applib/lib/utility.c +133 -2
  56. data/ext/h3/src/src/apps/benchmarks/benchmarkH3Api.c +1 -1
  57. data/ext/h3/src/{website/html.config.js → src/apps/benchmarks/benchmarkH3UniEdge.c} +15 -12
  58. data/ext/h3/src/src/apps/filters/h3ToComponents.c +1 -0
  59. data/ext/h3/src/src/apps/filters/h3ToGeo.c +1 -0
  60. data/ext/h3/src/src/apps/filters/h3ToGeoBoundary.c +1 -0
  61. data/ext/h3/src/src/apps/filters/h3ToLocalIj.c +1 -0
  62. data/ext/h3/src/src/apps/filters/hexRange.c +1 -0
  63. data/ext/h3/src/src/apps/filters/kRing.c +1 -0
  64. data/ext/h3/src/src/apps/filters/localIjToH3.c +1 -0
  65. data/ext/h3/src/src/apps/miscapps/generateFaceCenterPoint.c +1 -0
  66. data/ext/h3/src/src/apps/miscapps/generateNumHexagons.c +1 -0
  67. data/ext/h3/src/src/apps/miscapps/generatePentagonDirectionFaces.c +67 -0
  68. data/ext/h3/src/src/apps/miscapps/h3ToGeoBoundaryHier.c +1 -0
  69. data/ext/h3/src/src/apps/miscapps/h3ToGeoHier.c +1 -0
  70. data/ext/h3/src/src/apps/miscapps/h3ToHier.c +1 -0
  71. data/ext/h3/src/src/apps/testapps/mkRandGeo.c +1 -0
  72. data/ext/h3/src/src/apps/testapps/mkRandGeoBoundary.c +1 -0
  73. data/ext/h3/src/src/apps/testapps/testBBox.c +1 -0
  74. data/ext/h3/src/src/apps/testapps/testBaseCells.c +15 -1
  75. data/ext/h3/src/src/apps/testapps/testCompact.c +109 -2
  76. data/ext/h3/src/src/apps/testapps/testCoordIj.c +1 -0
  77. data/ext/h3/src/src/apps/testapps/testGeoCoord.c +47 -8
  78. data/ext/h3/src/src/apps/testapps/testGeoToH3.c +1 -0
  79. data/ext/h3/src/src/apps/testapps/testH3Api.c +1 -0
  80. data/ext/h3/src/src/apps/testapps/testH3CellArea.c +47 -0
  81. data/ext/h3/src/src/apps/testapps/testH3CellAreaExhaustive.c +180 -0
  82. data/ext/h3/src/src/apps/testapps/testH3Distance.c +1 -0
  83. data/ext/h3/src/src/apps/testapps/testH3DistanceExhaustive.c +1 -0
  84. data/ext/h3/src/src/apps/testapps/testH3GetFaces.c +1 -0
  85. data/ext/h3/src/src/apps/testapps/testH3Index.c +33 -3
  86. data/ext/h3/src/src/apps/testapps/testH3Line.c +1 -0
  87. data/ext/h3/src/src/apps/testapps/testH3LineExhaustive.c +1 -0
  88. data/ext/h3/src/src/apps/testapps/testH3Memory.c +175 -0
  89. data/ext/h3/src/src/apps/testapps/testH3NeighborRotations.c +1 -0
  90. data/ext/h3/src/src/apps/testapps/testH3SetToLinkedGeo.c +1 -0
  91. data/ext/h3/src/src/apps/testapps/testH3SetToVertexGraph.c +1 -0
  92. data/ext/h3/src/src/apps/testapps/testH3ToCenterChild.c +1 -0
  93. data/ext/h3/src/src/apps/testapps/testH3ToChildren.c +1 -0
  94. data/ext/h3/src/src/apps/testapps/testH3ToGeo.c +1 -0
  95. data/ext/h3/src/src/apps/testapps/testH3ToGeoBoundary.c +1 -0
  96. data/ext/h3/src/src/apps/testapps/testH3ToLocalIj.c +12 -6
  97. data/ext/h3/src/src/apps/testapps/testH3ToLocalIjExhaustive.c +1 -0
  98. data/ext/h3/src/src/apps/testapps/testH3ToParent.c +1 -0
  99. data/ext/h3/src/src/apps/testapps/testH3UniEdge.c +45 -16
  100. data/ext/h3/src/src/apps/testapps/testH3UniEdgeExhaustive.c +111 -0
  101. data/ext/h3/src/src/apps/testapps/testHexRanges.c +1 -0
  102. data/ext/h3/src/src/apps/testapps/testHexRing.c +1 -0
  103. data/ext/h3/src/src/apps/testapps/testKRing.c +19 -0
  104. data/ext/h3/src/src/apps/testapps/testLinkedGeo.c +1 -0
  105. data/ext/h3/src/src/apps/testapps/testMaxH3ToChildrenSize.c +1 -0
  106. data/ext/h3/src/src/apps/testapps/testPentagonIndexes.c +1 -0
  107. data/ext/h3/src/src/apps/testapps/testPolyfill.c +72 -9
  108. data/ext/h3/src/src/apps/testapps/testPolyfillReported.c +157 -0
  109. data/ext/h3/src/src/apps/testapps/testPolygon.c +27 -1
  110. data/ext/h3/src/src/apps/testapps/testVec2d.c +1 -0
  111. data/ext/h3/src/src/apps/testapps/testVec3d.c +1 -0
  112. data/ext/h3/src/src/apps/testapps/testVertex.c +66 -0
  113. data/ext/h3/src/src/apps/testapps/testVertexGraph.c +1 -0
  114. data/ext/h3/src/src/h3lib/include/algos.h +8 -0
  115. data/ext/h3/src/src/h3lib/include/alloc.h +40 -0
  116. data/ext/h3/src/src/h3lib/include/baseCells.h +4 -0
  117. data/ext/h3/src/src/h3lib/include/bbox.h +4 -1
  118. data/ext/h3/src/src/h3lib/include/faceijk.h +3 -2
  119. data/ext/h3/src/src/h3lib/include/geoCoord.h +2 -3
  120. data/ext/h3/src/src/h3lib/include/h3Index.h +37 -4
  121. data/ext/h3/src/src/h3lib/include/h3api.h.in +65 -17
  122. data/ext/h3/src/src/h3lib/include/linkedGeo.h +1 -0
  123. data/ext/h3/src/src/h3lib/include/polygon.h +1 -0
  124. data/ext/h3/src/src/h3lib/include/polygonAlgos.h +1 -0
  125. data/ext/h3/src/src/h3lib/include/vertex.h +44 -0
  126. data/ext/h3/src/src/h3lib/include/vertexGraph.h +1 -0
  127. data/ext/h3/src/src/h3lib/lib/algos.c +304 -76
  128. data/ext/h3/src/src/h3lib/lib/baseCells.c +26 -4
  129. data/ext/h3/src/src/h3lib/lib/bbox.c +56 -27
  130. data/ext/h3/src/src/h3lib/lib/coordijk.c +2 -0
  131. data/ext/h3/src/src/h3lib/lib/faceijk.c +32 -21
  132. data/ext/h3/src/src/h3lib/lib/geoCoord.c +162 -44
  133. data/ext/h3/src/src/h3lib/lib/h3Index.c +83 -42
  134. data/ext/h3/src/src/h3lib/lib/h3UniEdge.c +42 -57
  135. data/ext/h3/src/src/h3lib/lib/linkedGeo.c +20 -15
  136. data/ext/h3/src/src/h3lib/lib/localij.c +1 -1
  137. data/ext/h3/src/src/h3lib/lib/polygon.c +2 -0
  138. data/ext/h3/src/src/h3lib/lib/vec2d.c +1 -0
  139. data/ext/h3/src/src/h3lib/lib/vec3d.c +1 -0
  140. data/ext/h3/src/src/h3lib/lib/vertex.c +134 -0
  141. data/ext/h3/src/src/h3lib/lib/vertexGraph.c +8 -5
  142. data/ext/h3/src/website/.eslintignore +2 -0
  143. data/ext/h3/src/website/.gitignore +57 -0
  144. data/ext/h3/src/website/.nvmrc +1 -0
  145. data/ext/h3/src/website/README.md +8 -6
  146. data/ext/h3/src/website/gatsby-config.js +83 -0
  147. data/ext/h3/src/website/package.json +20 -12
  148. data/ext/h3/src/website/scripts/build-to-gh-pages.sh +7 -5
  149. data/ext/h3/src/website/src/.gitkeep +0 -0
  150. data/ext/h3/src/website/templates/documentation.jsx +129 -0
  151. data/ext/h3/src/website/yarn.lock +13723 -0
  152. data/h3.gemspec +2 -2
  153. data/lib/h3/bindings/base.rb +14 -4
  154. data/lib/h3/bindings/private.rb +12 -9
  155. data/lib/h3/hierarchy.rb +0 -18
  156. data/lib/h3/indexing.rb +0 -18
  157. data/lib/h3/inspection.rb +3 -59
  158. data/lib/h3/miscellaneous.rb +119 -14
  159. data/lib/h3/regions.rb +3 -0
  160. data/lib/h3/traversal.rb +0 -18
  161. data/lib/h3/unidirectional_edges.rb +5 -60
  162. data/lib/h3/version.rb +1 -1
  163. data/spec/geo_json_spec.rb +8 -0
  164. data/spec/miscellaneous_spec.rb +117 -0
  165. data/spec/{region_spec.rb → regions_spec.rb} +1 -1
  166. data/spec/spec_helper.rb +2 -2
  167. metadata +44 -36
  168. data/.travis.yml +0 -11
  169. data/ext/h3/src/.ycm_extra_conf.py +0 -92
  170. data/ext/h3/src/appveyor.yml +0 -50
  171. data/ext/h3/src/website/src/config.js +0 -46
  172. data/ext/h3/src/website/src/mdRoutes.js +0 -151
  173. data/ext/h3/src/website/src/styles/_variables.scss +0 -16
  174. data/ext/h3/src/website/src/styles/index.scss +0 -3
  175. data/ext/h3/src/website/static/index.html +0 -15
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2017-2018 Uber Technologies, Inc.
2
+ * Copyright 2017-2019 Uber Technologies, Inc.
3
3
  *
4
4
  * Licensed under the Apache License, Version 2.0 (the "License");
5
5
  * you may not use this file except in compliance with the License.
@@ -16,6 +16,7 @@
16
16
 
17
17
  #include <assert.h>
18
18
  #include <stdlib.h>
19
+
19
20
  #include "bbox.h"
20
21
  #include "constants.h"
21
22
  #include "geoCoord.h"
@@ -553,4 +554,29 @@ SUITE(polygon) {
553
554
 
554
555
  H3_EXPORT(destroyLinkedPolygon)(&polygon);
555
556
  }
557
+
558
+ TEST(normalizeMultiPolygon_unassignedHole) {
559
+ GeoCoord verts[] = {{0, 0}, {0, 1}, {1, 1}, {1, 0}};
560
+
561
+ LinkedGeoLoop* outer = malloc(sizeof(*outer));
562
+ assert(outer != NULL);
563
+ createLinkedLoop(outer, &verts[0], 4);
564
+
565
+ GeoCoord verts2[] = {{2, 2}, {3, 3}, {2, 3}};
566
+
567
+ LinkedGeoLoop* inner = malloc(sizeof(*inner));
568
+ assert(inner != NULL);
569
+ createLinkedLoop(inner, &verts2[0], 3);
570
+
571
+ LinkedGeoPolygon polygon = {0};
572
+ addLinkedLoop(&polygon, inner);
573
+ addLinkedLoop(&polygon, outer);
574
+
575
+ int result = normalizeMultiPolygon(&polygon);
576
+
577
+ t_assert(result == NORMALIZATION_ERR_UNASSIGNED_HOLES,
578
+ "Expected error code returned");
579
+
580
+ H3_EXPORT(destroyLinkedPolygon)(&polygon);
581
+ }
556
582
  }
@@ -17,6 +17,7 @@
17
17
  #include <float.h>
18
18
  #include <math.h>
19
19
  #include <stdlib.h>
20
+
20
21
  #include "test.h"
21
22
  #include "vec2d.h"
22
23
 
@@ -17,6 +17,7 @@
17
17
  #include <float.h>
18
18
  #include <math.h>
19
19
  #include <stdlib.h>
20
+
20
21
  #include "test.h"
21
22
  #include "vec3d.h"
22
23
 
@@ -0,0 +1,66 @@
1
+ /*
2
+ * Copyright 2020 Uber Technologies, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ /** @file
17
+ * @brief tests H3 vertex functions.
18
+ *
19
+ * usage: `testVertex`
20
+ */
21
+
22
+ #include "test.h"
23
+ #include "utility.h"
24
+ #include "vertex.h"
25
+
26
+ SUITE(Vertex) {
27
+ TEST(vertexNumForDirection_hex) {
28
+ H3Index origin = 0x823d6ffffffffff;
29
+ int vertexNums[NUM_HEX_VERTS] = {0};
30
+ for (Direction dir = K_AXES_DIGIT; dir < NUM_DIGITS; dir++) {
31
+ int vertexNum = vertexNumForDirection(origin, dir);
32
+ t_assert(vertexNum >= 0 && vertexNum < NUM_HEX_VERTS,
33
+ "vertex number appears valid");
34
+ t_assert(!vertexNums[vertexNum], "vertex number appears only once");
35
+ vertexNums[vertexNum] = 1;
36
+ }
37
+ }
38
+
39
+ TEST(vertexNumForDirection_pent) {
40
+ H3Index pentagon = 0x823007fffffffff;
41
+ int vertexNums[NUM_PENT_VERTS] = {0};
42
+ for (Direction dir = J_AXES_DIGIT; dir < NUM_DIGITS; dir++) {
43
+ int vertexNum = vertexNumForDirection(pentagon, dir);
44
+ t_assert(vertexNum >= 0 && vertexNum < NUM_PENT_VERTS,
45
+ "vertex number appears valid");
46
+ t_assert(!vertexNums[vertexNum], "vertex number appears only once");
47
+ vertexNums[vertexNum] = 1;
48
+ }
49
+ }
50
+
51
+ TEST(vertexNumForDirection_badDirections) {
52
+ H3Index origin = 0x823007fffffffff;
53
+
54
+ t_assert(
55
+ vertexNumForDirection(origin, CENTER_DIGIT) == INVALID_VERTEX_NUM,
56
+ "center digit should return invalid vertex");
57
+ t_assert(
58
+ vertexNumForDirection(origin, INVALID_DIGIT) == INVALID_VERTEX_NUM,
59
+ "invalid digit should return invalid vertex");
60
+
61
+ H3Index pentagon = 0x823007fffffffff;
62
+ t_assert(
63
+ vertexNumForDirection(pentagon, K_AXES_DIGIT) == INVALID_VERTEX_NUM,
64
+ "K direction on pentagon should return invalid vertex");
65
+ }
66
+ }
@@ -16,6 +16,7 @@
16
16
 
17
17
  #include <assert.h>
18
18
  #include <stdio.h>
19
+
19
20
  #include "geoCoord.h"
20
21
  #include "h3api.h"
21
22
  #include "test.h"
@@ -40,4 +40,12 @@ void h3SetToVertexGraph(const H3Index* h3Set, const int numHexes,
40
40
  // Create a LinkedGeoPolygon from a vertex graph
41
41
  void _vertexGraphToLinkedGeo(VertexGraph* graph, LinkedGeoPolygon* out);
42
42
 
43
+ // Internal function for polyfill that traces a geofence with hexagons of a
44
+ // specific size
45
+ int _getEdgeHexagons(const Geofence* geofence, int numHexagons, int res,
46
+ int* numSearchHexes, H3Index* search, H3Index* found);
47
+
48
+ // The polyfill algorithm. Separated out because it can theoretically fail
49
+ int _polyfillInternal(const GeoPolygon* geoPolygon, int res, H3Index* out);
50
+
43
51
  #endif
@@ -0,0 +1,40 @@
1
+ /*
2
+ * Copyright 2020 Uber Technologies, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ /** @file alloc.h
17
+ * @brief Memory management functions
18
+ *
19
+ * This file contains macros and the necessary declarations to be able
20
+ * to point H3 at different memory management functions than the standard
21
+ * malloc/free/etc functions.
22
+ */
23
+
24
+ #ifndef ALLOC_H
25
+ #define ALLOC_H
26
+
27
+ #include "h3api.h" // for TJOIN
28
+
29
+ #ifdef H3_ALLOC_PREFIX
30
+ #define H3_MEMORY(name) TJOIN(H3_ALLOC_PREFIX, name)
31
+
32
+ void* H3_MEMORY(malloc)(size_t size);
33
+ void* H3_MEMORY(calloc)(size_t num, size_t size);
34
+ void* H3_MEMORY(realloc)(void* ptr, size_t size);
35
+ void H3_MEMORY(free)(void* ptr);
36
+ #else
37
+ #define H3_MEMORY(name) name
38
+ #endif
39
+
40
+ #endif
@@ -45,11 +45,15 @@ extern const BaseCellData baseCellData[NUM_BASE_CELLS];
45
45
  /** Maximum input for any component to face-to-base-cell lookup functions */
46
46
  #define MAX_FACE_COORD 2
47
47
 
48
+ /** Invalid number of rotations */
49
+ #define INVALID_ROTATIONS -1
50
+
48
51
  // Internal functions
49
52
  int _isBaseCellPentagon(int baseCell);
50
53
  bool _isBaseCellPolarPentagon(int baseCell);
51
54
  int _faceIjkToBaseCell(const FaceIJK* h);
52
55
  int _faceIjkToBaseCellCCWrot60(const FaceIJK* h);
56
+ int _baseCellToCCWrot60(int baseCell, int face);
53
57
  void _baseCellToFaceIjk(int baseCell, FaceIJK* h);
54
58
  bool _baseCellIsCwOffset(int baseCell, int testFace);
55
59
  int _getBaseCellNeighbor(int baseCell, Direction dir);
@@ -21,6 +21,7 @@
21
21
  #define BBOX_H
22
22
 
23
23
  #include <stdbool.h>
24
+
24
25
  #include "geoCoord.h"
25
26
 
26
27
  /** @struct BBox
@@ -37,6 +38,8 @@ bool bboxIsTransmeridian(const BBox* bbox);
37
38
  void bboxCenter(const BBox* bbox, GeoCoord* center);
38
39
  bool bboxContains(const BBox* bbox, const GeoCoord* point);
39
40
  bool bboxEquals(const BBox* b1, const BBox* b2);
40
- int bboxHexRadius(const BBox* bbox, int res);
41
+ int bboxHexEstimate(const BBox* bbox, int res);
42
+ int lineHexEstimate(const GeoCoord* origin, const GeoCoord* destination,
43
+ int res);
41
44
 
42
45
  #endif
@@ -75,9 +75,10 @@ typedef enum {
75
75
  void _geoToFaceIjk(const GeoCoord* g, int res, FaceIJK* h);
76
76
  void _geoToHex2d(const GeoCoord* g, int res, int* face, Vec2d* v);
77
77
  void _faceIjkToGeo(const FaceIJK* h, int res, GeoCoord* g);
78
- void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int isPentagon,
78
+ void _faceIjkToGeoBoundary(const FaceIJK* h, int res, int start, int length,
79
79
  GeoBoundary* g);
80
- void _faceIjkPentToGeoBoundary(const FaceIJK* h, int res, GeoBoundary* g);
80
+ void _faceIjkPentToGeoBoundary(const FaceIJK* h, int res, int start, int length,
81
+ GeoBoundary* g);
81
82
  void _faceIjkToVerts(FaceIJK* fijk, int* res, FaceIJK* fijkVerts);
82
83
  void _faceIjkPentToVerts(FaceIJK* fijk, int* res, FaceIJK* fijkVerts);
83
84
  void _hex2dToGeo(const Vec2d* v, int face, int res, int substrate, GeoCoord* g);
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2016-2017 Uber Technologies, Inc.
2
+ * Copyright 2016-2020 Uber Technologies, Inc.
3
3
  *
4
4
  * Licensed under the Apache License, Version 2.0 (the "License");
5
5
  * you may not use this file except in compliance with the License.
@@ -23,6 +23,7 @@
23
23
  #include <stdbool.h>
24
24
  #include <stdint.h>
25
25
  #include <stdio.h>
26
+
26
27
  #include "constants.h"
27
28
  #include "h3api.h"
28
29
 
@@ -43,8 +44,6 @@ bool geoAlmostEqualThreshold(const GeoCoord* p1, const GeoCoord* p2,
43
44
 
44
45
  double _posAngleRads(double rads);
45
46
  void _setGeoRads(GeoCoord* p, double latRads, double lonRads);
46
- double _geoDistRads(const GeoCoord* p1, const GeoCoord* p2);
47
- double _geoDistKm(const GeoCoord* p1, const GeoCoord* p2);
48
47
  double _geoAzimuthRads(const GeoCoord* p1, const GeoCoord* p2);
49
48
  void _geoAzDistanceRads(const GeoCoord* p1, double az, double distance,
50
49
  GeoCoord* p2);
@@ -46,6 +46,12 @@
46
46
  /** The number of bits in a single H3 resolution digit. */
47
47
  #define H3_PER_DIGIT_OFFSET 3
48
48
 
49
+ /** 1 in the highest bit, 0's everywhere else. */
50
+ #define H3_HIGH_BIT_MASK ((uint64_t)(1) << H3_MAX_OFFSET)
51
+
52
+ /** 0 in the highest bit, 1's everywhere else. */
53
+ #define H3_HIGH_BIT_MASK_NEGATIVE (~H3_HIGH_BIT_MASK)
54
+
49
55
  /** 1's in the 4 mode bits, 0's everywhere else. */
50
56
  #define H3_MODE_MASK ((uint64_t)(15) << H3_MODE_OFFSET)
51
57
 
@@ -74,11 +80,27 @@
74
80
  #define H3_DIGIT_MASK ((uint64_t)(7))
75
81
 
76
82
  /** 0's in the 7 base cell bits, 1's everywhere else. */
77
- #define H3_DIGIT_MASK_NEGATIVE (~H3_DIGIT_MASK_NEGATIVE)
83
+ #define H3_DIGIT_MASK_NEGATIVE (~H3_DIGIT_MASK)
78
84
 
79
- /** H3 index with mode 0, res 0, base cell 0, and 7 for all index digits. */
85
+ /**
86
+ * H3 index with mode 0, res 0, base cell 0, and 7 for all index digits.
87
+ * Typically used to initialize the creation of an H3 cell index, which
88
+ * expects all direction digits to be 7 beyond the cell's resolution.
89
+ */
80
90
  #define H3_INIT (UINT64_C(35184372088831))
81
91
 
92
+ /**
93
+ * Gets the highest bit of the H3 index.
94
+ */
95
+ #define H3_GET_HIGH_BIT(h3) ((int)((((h3)&H3_HIGH_BIT_MASK) >> H3_MAX_OFFSET)))
96
+
97
+ /**
98
+ * Sets the highest bit of the h3 to v.
99
+ */
100
+ #define H3_SET_HIGH_BIT(h3, v) \
101
+ (h3) = (((h3)&H3_HIGH_BIT_MASK_NEGATIVE) | \
102
+ (((uint64_t)(v)) << H3_MAX_OFFSET))
103
+
82
104
  /**
83
105
  * Gets the integer mode of h3.
84
106
  */
@@ -143,9 +165,19 @@
143
165
  << ((MAX_H3_RES - (res)) * H3_PER_DIGIT_OFFSET)))
144
166
 
145
167
  /**
146
- * Invalid index used to indicate an error from geoToH3 and related functions.
168
+ * Invalid index used to indicate an error from geoToH3 and related functions
169
+ * or missing data in arrays of h3 indices. Analogous to NaN in floating point.
147
170
  */
148
- #define H3_INVALID_INDEX 0
171
+ #define H3_NULL 0
172
+
173
+ /*
174
+ * Return codes for compact
175
+ */
176
+
177
+ #define COMPACT_SUCCESS 0
178
+ #define COMPACT_LOOP_EXCEEDED -1
179
+ #define COMPACT_DUPLICATE -2
180
+ #define COMPACT_ALLOC_FAILED -3
149
181
 
150
182
  void setH3Index(H3Index* h, int res, int baseCell, Direction initDigit);
151
183
  int isResClassIII(int res);
@@ -153,6 +185,7 @@ int isResClassIII(int res);
153
185
  // Internal functions
154
186
 
155
187
  int _h3ToFaceIjkWithInitializedFijk(H3Index h, FaceIJK* fijk);
188
+ void _h3ToFaceIjk(H3Index h, FaceIJK* fijk);
156
189
  H3Index _faceIjkToH3(const FaceIJK* fijk, int res);
157
190
  Direction _h3LeadingNonZeroDigit(H3Index h);
158
191
  H3Index _h3RotatePent60ccw(H3Index h);
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2016-2019 Uber Technologies, Inc.
2
+ * Copyright 2016-2020 Uber Technologies, Inc.
3
3
  *
4
4
  * Licensed under the Apache License, Version 2.0 (the "License");
5
5
  * you may not use this file except in compliance with the License.
@@ -150,7 +150,7 @@ typedef struct {
150
150
  * Functions for geoToH3
151
151
  * @{
152
152
  */
153
- /** @brief find the H3 index of the resolution res cell containing the lat/lon g
153
+ /** @brief find the H3 index of the resolution res cell containing the lat/lng
154
154
  */
155
155
  H3Index H3_EXPORT(geoToH3)(const GeoCoord *g, int res);
156
156
  /** @} */
@@ -183,8 +183,7 @@ int H3_EXPORT(hexRange)(H3Index origin, int k, H3Index *out);
183
183
  /** @} */
184
184
 
185
185
  /** @brief hexagons neighbors in all directions, assuming no pentagons,
186
- * reporting
187
- * distance from origin */
186
+ * reporting distance from origin */
188
187
  int H3_EXPORT(hexRangeDistances)(H3Index origin, int k, H3Index *out,
189
188
  int *distances);
190
189
 
@@ -252,33 +251,77 @@ double H3_EXPORT(degsToRads)(double degrees);
252
251
  double H3_EXPORT(radsToDegs)(double radians);
253
252
  /** @} */
254
253
 
254
+ /** @defgroup pointDist pointDist
255
+ * Functions for pointDist
256
+ * @{
257
+ */
258
+ /** @brief "great circle distance" between pairs of GeoCoord points in radians*/
259
+ double H3_EXPORT(pointDistRads)(const GeoCoord *a, const GeoCoord *b);
260
+
261
+ /** @brief "great circle distance" between pairs of GeoCoord points in
262
+ * kilometers*/
263
+ double H3_EXPORT(pointDistKm)(const GeoCoord *a, const GeoCoord *b);
264
+
265
+ /** @brief "great circle distance" between pairs of GeoCoord points in meters*/
266
+ double H3_EXPORT(pointDistM)(const GeoCoord *a, const GeoCoord *b);
267
+ /** @} */
268
+
255
269
  /** @defgroup hexArea hexArea
256
270
  * Functions for hexArea
257
271
  * @{
258
272
  */
259
- /** @brief hexagon area in square kilometers */
273
+ /** @brief average hexagon area in square kilometers (excludes pentagons) */
260
274
  double H3_EXPORT(hexAreaKm2)(int res);
261
275
 
262
- /** @brief hexagon area in square meters */
276
+ /** @brief average hexagon area in square meters (excludes pentagons) */
263
277
  double H3_EXPORT(hexAreaM2)(int res);
264
278
  /** @} */
265
279
 
280
+ /** @defgroup cellArea cellArea
281
+ * Functions for cellArea
282
+ * @{
283
+ */
284
+ /** @brief exact area for a specific cell (hexagon or pentagon) in radians^2 */
285
+ double H3_EXPORT(cellAreaRads2)(H3Index h);
286
+
287
+ /** @brief exact area for a specific cell (hexagon or pentagon) in kilometers^2
288
+ */
289
+ double H3_EXPORT(cellAreaKm2)(H3Index h);
290
+
291
+ /** @brief exact area for a specific cell (hexagon or pentagon) in meters^2 */
292
+ double H3_EXPORT(cellAreaM2)(H3Index h);
293
+ /** @} */
294
+
266
295
  /** @defgroup edgeLength edgeLength
267
296
  * Functions for edgeLength
268
297
  * @{
269
298
  */
270
- /** @brief hexagon edge length in kilometers */
299
+ /** @brief average hexagon edge length in kilometers (excludes pentagons) */
271
300
  double H3_EXPORT(edgeLengthKm)(int res);
272
301
 
273
- /** @brief hexagon edge length in meters */
302
+ /** @brief average hexagon edge length in meters (excludes pentagons) */
274
303
  double H3_EXPORT(edgeLengthM)(int res);
275
304
  /** @} */
276
305
 
306
+ /** @defgroup exactEdgeLength exactEdgeLength
307
+ * Functions for exactEdgeLength
308
+ * @{
309
+ */
310
+ /** @brief exact length for a specific unidirectional edge in radians*/
311
+ double H3_EXPORT(exactEdgeLengthRads)(H3Index edge);
312
+
313
+ /** @brief exact length for a specific unidirectional edge in kilometers*/
314
+ double H3_EXPORT(exactEdgeLengthKm)(H3Index edge);
315
+
316
+ /** @brief exact length for a specific unidirectional edge in meters*/
317
+ double H3_EXPORT(exactEdgeLengthM)(H3Index edge);
318
+ /** @} */
319
+
277
320
  /** @defgroup numHexagons numHexagons
278
321
  * Functions for numHexagons
279
322
  * @{
280
323
  */
281
- /** @brief number of hexagons for a given resolution */
324
+ /** @brief number of cells (hexagons and pentagons) for a given resolution */
282
325
  int64_t H3_EXPORT(numHexagons)(int res);
283
326
  /** @} */
284
327
 
@@ -286,10 +329,10 @@ int64_t H3_EXPORT(numHexagons)(int res);
286
329
  * Functions for getRes0Indexes
287
330
  * @{
288
331
  */
289
- /** @brief returns the number of resolution 0 indexes */
332
+ /** @brief returns the number of resolution 0 cells (hexagons and pentagons) */
290
333
  int H3_EXPORT(res0IndexCount)();
291
334
 
292
- /** @brief provides all base cells */
335
+ /** @brief provides all base cells in H3Index format*/
293
336
  void H3_EXPORT(getRes0Indexes)(H3Index *out);
294
337
  /** @} */
295
338
 
@@ -308,7 +351,8 @@ void H3_EXPORT(getPentagonIndexes)(int res, H3Index *out);
308
351
  * Functions for h3GetResolution
309
352
  * @{
310
353
  */
311
- /** @brief returns the resolution of the provided hexagon */
354
+ /** @brief returns the resolution of the provided H3 index
355
+ * Works on both cells and unidirectional edges. */
312
356
  int H3_EXPORT(h3GetResolution)(H3Index h);
313
357
  /** @} */
314
358
 
@@ -316,7 +360,10 @@ int H3_EXPORT(h3GetResolution)(H3Index h);
316
360
  * Functions for h3GetBaseCell
317
361
  * @{
318
362
  */
319
- /** @brief returns the base cell of the provided hexagon */
363
+ /** @brief returns the base cell "number" (0 to 121) of the provided H3 cell
364
+ *
365
+ * Note: Technically works on H3 edges, but will return base cell of the
366
+ * origin cell. */
320
367
  int H3_EXPORT(h3GetBaseCell)(H3Index h);
321
368
  /** @} */
322
369
 
@@ -340,7 +387,9 @@ void H3_EXPORT(h3ToString)(H3Index h, char *str, size_t sz);
340
387
  * Functions for h3IsValid
341
388
  * @{
342
389
  */
343
- /** @brief confirms if an H3Index is valid */
390
+ /** @brief confirms if an H3Index is a valid cell (hexagon or pentagon)
391
+ * In particular, returns 0 (False) for H3 unidirectional edges or invalid data
392
+ */
344
393
  int H3_EXPORT(h3IsValid)(H3Index h);
345
394
  /** @} */
346
395
 
@@ -358,8 +407,7 @@ H3Index H3_EXPORT(h3ToParent)(H3Index h, int parentRes);
358
407
  * @{
359
408
  */
360
409
  /** @brief determines the maximum number of children (or grandchildren, etc)
361
- * that
362
- * could be returned for the given hexagon */
410
+ * that could be returned for the given hexagon */
363
411
  int H3_EXPORT(maxH3ToChildrenSize)(H3Index h, int childRes);
364
412
 
365
413
  /** @brief provides the children (or grandchildren, etc) of the given hexagon */
@@ -410,7 +458,7 @@ int H3_EXPORT(h3IsResClassIII)(H3Index h);
410
458
  * Functions for h3IsPentagon
411
459
  * @{
412
460
  */
413
- /** @brief determines if a hexagon is actually a pentagon */
461
+ /** @brief determines if an H3 cell is a pentagon */
414
462
  int H3_EXPORT(h3IsPentagon)(H3Index h);
415
463
  /** @} */
416
464