h3 3.6.0 → 3.7.2

Sign up to get free protection for your applications and to get access to all the features.
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