h3 3.4.4 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/Gemfile.lock +1 -1
  4. data/README.md +2 -1
  5. data/ext/h3/Makefile +1 -1
  6. data/ext/h3/src/.gitignore +2 -1
  7. data/ext/h3/src/CHANGELOG.md +9 -0
  8. data/ext/h3/src/CMakeLists.txt +72 -45
  9. data/ext/h3/src/RELEASE.md +2 -1
  10. data/ext/h3/src/VERSION +1 -1
  11. data/ext/h3/src/docs/api/hierarchy.md +2 -0
  12. data/ext/h3/src/docs/api/indexing.md +3 -1
  13. data/ext/h3/src/docs/api/inspection.md +20 -0
  14. data/ext/h3/src/docs/api/misc.md +2 -0
  15. data/ext/h3/src/docs/api/regions.md +2 -0
  16. data/ext/h3/src/docs/api/traversal.md +2 -0
  17. data/ext/h3/src/docs/api/uniedge.md +2 -0
  18. data/ext/h3/src/docs/community/bindings.md +4 -0
  19. data/ext/h3/src/docs/community/tutorials.md +12 -0
  20. data/ext/h3/src/scripts/update_version.sh +50 -0
  21. data/ext/h3/src/src/apps/applib/include/args.h +122 -0
  22. data/ext/h3/src/src/apps/applib/include/utility.h +5 -62
  23. data/ext/h3/src/src/apps/applib/lib/args.c +216 -0
  24. data/ext/h3/src/src/apps/applib/lib/utility.c +40 -206
  25. data/ext/h3/src/src/apps/filters/geoToH3.c +7 -9
  26. data/ext/h3/src/src/apps/filters/h3ToComponents.c +50 -47
  27. data/ext/h3/src/src/apps/filters/h3ToGeo.c +7 -30
  28. data/ext/h3/src/src/apps/filters/h3ToGeoBoundary.c +7 -27
  29. data/ext/h3/src/src/apps/filters/h3ToLocalIj.c +42 -25
  30. data/ext/h3/src/src/apps/filters/hexRange.c +43 -24
  31. data/ext/h3/src/src/apps/filters/kRing.c +4 -4
  32. data/ext/h3/src/src/apps/filters/localIjToH3.c +63 -21
  33. data/ext/h3/src/src/apps/miscapps/h3ToGeoBoundaryHier.c +68 -44
  34. data/ext/h3/src/src/apps/miscapps/h3ToGeoHier.c +68 -43
  35. data/ext/h3/src/src/apps/miscapps/h3ToHier.c +48 -37
  36. data/ext/h3/src/src/apps/testapps/mkRandGeo.c +32 -27
  37. data/ext/h3/src/src/apps/testapps/mkRandGeoBoundary.c +33 -28
  38. data/ext/h3/src/src/apps/testapps/testH3GetFaces.c +136 -0
  39. data/ext/h3/src/src/h3lib/include/faceijk.h +19 -7
  40. data/ext/h3/src/src/h3lib/include/h3api.h.in +12 -1
  41. data/ext/h3/src/src/h3lib/lib/algos.c +7 -2
  42. data/ext/h3/src/src/h3lib/lib/faceijk.c +135 -103
  43. data/ext/h3/src/src/h3lib/lib/h3Index.c +86 -5
  44. data/lib/h3/bindings/private.rb +1 -0
  45. data/lib/h3/inspection.rb +34 -0
  46. data/lib/h3/version.rb +1 -1
  47. data/spec/inspection_spec.rb +33 -1
  48. metadata +6 -2
@@ -17,7 +17,7 @@
17
17
  * @brief stdin/stdout filter that converts from integer H3 indexes to
18
18
  * k-rings
19
19
  *
20
- * usage: `kRing -k <k> [--print-distances] [--origin origin]`
20
+ * See `kRing --help` for usage.
21
21
  *
22
22
  * The program reads H3 indexes from stdin until EOF and outputs
23
23
  * the H3 indexes within k-ring `k` to stdout.
@@ -30,6 +30,7 @@
30
30
  #include <stdbool.h>
31
31
  #include <stdio.h>
32
32
  #include <stdlib.h>
33
+ #include "args.h"
33
34
  #include "h3api.h"
34
35
  #include "utility.h"
35
36
 
@@ -58,8 +59,7 @@ int main(int argc, char* argv[]) {
58
59
  int k = 0;
59
60
  H3Index origin = 0;
60
61
 
61
- Arg helpArg = {.names = {"-h", "--help"},
62
- .helpText = "Show this help message."};
62
+ Arg helpArg = ARG_HELP;
63
63
  Arg kArg = {.names = {"-k", NULL},
64
64
  .required = true,
65
65
  .scanFormat = "%d",
@@ -75,7 +75,7 @@ int main(int argc, char* argv[]) {
75
75
  .valueName = "origin",
76
76
  .value = &origin,
77
77
  .helpText =
78
- "Origin, or not specified to read origins from standard in."};
78
+ "Origin, or not specified to read origins from standard input."};
79
79
 
80
80
  Arg* args[] = {&helpArg, &kArg, &printDistancesArg, &originArg};
81
81
 
@@ -17,7 +17,7 @@
17
17
  * @brief stdin/stdout filter that converts from local IJ coordinates to
18
18
  * H3 indexes. This is experimental.
19
19
  *
20
- * usage: `localIjToH3 [origin]`
20
+ * See `localIjToH3 --help` for usage.
21
21
  *
22
22
  * The program reads IJ coordinates (in the format `i j` separated by newlines)
23
23
  * from stdin and outputs the corresponding H3 indexes to stdout, until EOF is
@@ -33,6 +33,7 @@
33
33
  #include <inttypes.h>
34
34
  #include <stdio.h>
35
35
  #include <stdlib.h>
36
+ #include "args.h"
36
37
  #include "h3api.h"
37
38
  #include "utility.h"
38
39
 
@@ -46,30 +47,71 @@ void doCell(const CoordIJ *ij, H3Index origin) {
46
47
  }
47
48
 
48
49
  int main(int argc, char *argv[]) {
49
- // check command line args
50
- if (argc != 2) {
51
- fprintf(stderr, "usage: %s [origin]\n", argv[0]);
52
- exit(1);
53
- }
50
+ H3Index origin = 0;
51
+ CoordIJ ij = {0};
54
52
 
55
- H3Index origin = H3_EXPORT(stringToH3(argv[1]));
56
- if (!H3_EXPORT(h3IsValid)(origin)) error("origin is invalid");
53
+ Arg helpArg = ARG_HELP;
54
+ Arg originArg = {
55
+ .names = {"-o", "--origin"},
56
+ .scanFormat = "%" PRIx64,
57
+ .valueName = "origin",
58
+ .value = &origin,
59
+ .required = true,
60
+ .helpText =
61
+ "Origin (anchoring index) for the local coordinate system."};
62
+ Arg iArg = {.names = {"-i", NULL},
63
+ .scanFormat = "%d",
64
+ .valueName = "i",
65
+ .value = &ij.i,
66
+ .helpText =
67
+ "I coordinate. If not specified \"i j\" pairs will be read "
68
+ "from standard input."};
69
+ Arg jArg = {.names = {"-j", NULL},
70
+ .scanFormat = "%d",
71
+ .valueName = "j",
72
+ .value = &ij.j,
73
+ .helpText = "J coordinate."};
57
74
 
58
- // process the coordinates on stdin
59
- char buff[BUFF_SIZE];
60
- while (1) {
61
- // get coordinates from stdin
62
- if (!fgets(buff, BUFF_SIZE, stdin)) {
63
- if (feof(stdin))
64
- break;
65
- else
66
- error("reading IJ coordinates from stdin");
67
- }
75
+ Arg *args[] = {&helpArg, &originArg, &iArg, &jArg};
76
+ const int numArgs = 4;
77
+ const char *helpText = "Converts local IJ coordinates to H3 indexes";
78
+
79
+ if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) {
80
+ return helpArg.found ? 0 : 1;
81
+ }
68
82
 
69
- CoordIJ ij;
70
- if (!sscanf(buff, "%d %d", &ij.i, &ij.j))
71
- error("Parsing IJ coordinates. Expected `i j`.");
83
+ if (!H3_EXPORT(h3IsValid)(origin)) {
84
+ printHelp(stderr, argv[0], helpText, numArgs, args,
85
+ "Origin is invalid.", NULL);
86
+ return 1;
87
+ }
72
88
 
89
+ if (iArg.found != jArg.found) {
90
+ // One is found but the other is not.
91
+ printHelp(stderr, argv[0], helpText, numArgs, args,
92
+ "I and J must both be specified.", NULL);
93
+ return 1;
94
+ }
95
+
96
+ if (iArg.found) {
73
97
  doCell(&ij, origin);
98
+ } else {
99
+ // process the coordinates on stdin
100
+ char buff[BUFF_SIZE];
101
+ while (1) {
102
+ // get coordinates from stdin
103
+ if (!fgets(buff, BUFF_SIZE, stdin)) {
104
+ if (feof(stdin))
105
+ break;
106
+ else
107
+ error("reading IJ coordinates from stdin");
108
+ }
109
+
110
+ if (!sscanf(buff, "%d %d", &ij.i, &ij.j))
111
+ error(
112
+ "Parsing IJ coordinates. Expected `<integer> <integer>`.");
113
+
114
+ doCell(&ij, origin);
115
+ }
74
116
  }
75
117
  }
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2016-2017 Uber Technologies, Inc.
2
+ * Copyright 2016-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.
@@ -17,7 +17,7 @@
17
17
  * @brief takes an H3 index and generates cell boundaries for all descendants
18
18
  * at a specified resolution.
19
19
  *
20
- * usage: `h3ToGeoBoundaryHier H3Index [resolution outputMode]`
20
+ * See `h3ToGeoBoundaryHier` for usage.
21
21
  *
22
22
  * The program generates the cell boundaries in lat/lon coordinates for all
23
23
  * hierarchical children of H3Index at the specified resolution. If the
@@ -27,21 +27,23 @@
27
27
  * `resolution` should be a positive integer. The default is 0 (i.e., only the
28
28
  * specified cell H3Index would be processed).
29
29
  *
30
- * `outputMode` indicates the type of output; currently the choices are 0 for
31
- * plain text output (the default) and 1 for KML output.
30
+ * `--kml` indicates KML output format; if not specified plain text output is
31
+ * the default.
32
32
  *
33
33
  * Examples:
34
34
  * ---------
35
35
  *
36
- * `h3ToGeoBoundaryHier 836e9bfffffffff`
36
+ * `h3ToGeoBoundaryHier --parent 836e9bfffffffff`
37
37
  * - outputs the cell boundary in lat/lon for cell `836e9bfffffffff` as
38
38
  * plain text
39
39
  *
40
- * `h3ToGeoBoundaryHier 820ceffffffffff 4 1 > cells.kml`
40
+ * `h3ToGeoBoundaryHier --parent 820ceffffffffff --resolution 4 --kml >
41
+ * cells.kml`
41
42
  * - outputs the cell boundaries of all of the resolution 4 descendants
42
43
  * of cell `820ceffffffffff` as a KML file (redirected to `cells.kml`).
43
44
  *
44
- * `h3ToGeoBoundaryHier 86283082fffffff 9 1 > uber9cells.kml`
45
+ * `h3ToGeoBoundaryHier --parent 86283082fffffff --resolution 9 --kml >
46
+ * uber9cells.kml`
45
47
  * - creates a KML file containing the cell boundaries of all of the
46
48
  * resolution 9 hexagons covering Uber HQ and the surrounding region of
47
49
  * San Francisco
@@ -51,14 +53,12 @@
51
53
  #include <stdio.h>
52
54
  #include <stdlib.h>
53
55
  #include <string.h>
56
+ #include "args.h"
54
57
  #include "baseCells.h"
55
- #include "coordijk.h"
56
- #include "geoCoord.h"
57
58
  #include "h3Index.h"
58
59
  #include "h3api.h"
59
60
  #include "kml.h"
60
61
  #include "utility.h"
61
- #include "vec2d.h"
62
62
 
63
63
  void doCell(H3Index h, int isKmlOut) {
64
64
  GeoBoundary b;
@@ -94,55 +94,79 @@ void recursiveH3IndexToGeo(H3Index h, int res, int isKmlOut) {
94
94
  }
95
95
  }
96
96
 
97
- int main(int argc, char* argv[]) {
98
- // check command line args
99
- if (argc < 2 || argc > 5) {
100
- fprintf(stderr, "usage: %s H3Index [resolution outputMode]\n", argv[0]);
101
- exit(1);
97
+ int main(int argc, char *argv[]) {
98
+ int res;
99
+ H3Index parentIndex = 0;
100
+
101
+ Arg helpArg = ARG_HELP;
102
+ Arg resArg = {.names = {"-r", "--resolution"},
103
+ .scanFormat = "%d",
104
+ .valueName = "res",
105
+ .value = &res,
106
+ .helpText =
107
+ "Resolution, if less than the resolution of the parent "
108
+ "only the parent is printed. Default the resolution of "
109
+ "the parent."};
110
+ Arg parentArg = {
111
+ .names = {"-p", "--parent"},
112
+ .scanFormat = "%" PRIx64,
113
+ .valueName = "parent",
114
+ .value = &parentIndex,
115
+ .required = true,
116
+ .helpText = "Print cell boundaries descendent from this index."};
117
+ Arg kmlArg = ARG_KML;
118
+ DEFINE_KML_NAME_ARG(userKmlName, kmlNameArg);
119
+ DEFINE_KML_DESC_ARG(userKmlDesc, kmlDescArg);
120
+
121
+ Arg *args[] = {&helpArg, &resArg, &parentArg,
122
+ &kmlArg, &kmlNameArg, &kmlDescArg};
123
+ const int numArgs = 6;
124
+ const char *helpText = "Print cell boundaries for descendants of an index";
125
+
126
+ if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) {
127
+ return helpArg.found ? 0 : 1;
102
128
  }
103
129
 
104
- H3Index rootCell = H3_EXPORT(stringToH3)(argv[1]);
105
- int baseCell = H3_GET_BASE_CELL(rootCell);
106
- int rootRes = H3_GET_RESOLUTION(rootCell);
107
- if (baseCell < 0 || baseCell >= NUM_BASE_CELLS) {
108
- error("invalid base cell number");
130
+ if (res > MAX_H3_RES) {
131
+ printHelp(stderr, argv[0], helpText, numArgs, args,
132
+ "Resolution exceeds maximum resolution.", NULL);
133
+ return 1;
109
134
  }
110
135
 
111
- int res = 0;
112
- int isKmlOut = 0;
113
- if (argc > 2) {
114
- if (!sscanf(argv[2], "%d", &res))
115
- error("resolution must be an integer");
136
+ if (!H3_EXPORT(h3IsValid)(parentIndex)) {
137
+ printHelp(stderr, argv[0], helpText, numArgs, args,
138
+ "Parent index is invalid.", NULL);
139
+ return 1;
140
+ }
116
141
 
117
- if (res > MAX_H3_RES)
118
- error("specified resolution exceeds max resolution");
142
+ int rootRes = H3_GET_RESOLUTION(parentIndex);
119
143
 
120
- if (argc > 3) {
121
- if (!sscanf(argv[3], "%d", &isKmlOut))
122
- error("outputMode must be an integer");
144
+ if (kmlArg.found) {
145
+ char *kmlName;
146
+ if (kmlNameArg.found) {
147
+ kmlName = strdup(userKmlName);
148
+ } else {
149
+ kmlName = calloc(BUFF_SIZE, sizeof(char));
123
150
 
124
- if (isKmlOut != 0 && isKmlOut != 1)
125
- error("outputMode must be 0 or 1");
151
+ sprintf(kmlName, "Cell %" PRIx64 " Res %d", parentIndex,
152
+ ((res <= rootRes) ? rootRes : res));
153
+ }
126
154
 
127
- if (isKmlOut) {
128
- char name[BUFF_SIZE];
155
+ char *kmlDesc = "Generated by h3ToGeoBoundaryHier";
156
+ if (kmlDescArg.found) kmlDesc = userKmlDesc;
129
157
 
130
- sprintf(name, "Cell %" PRIx64 " Res %d", rootCell,
131
- ((res <= rootRes) ? rootRes : res));
158
+ kmlBoundaryHeader(kmlName, kmlDesc);
132
159
 
133
- kmlBoundaryHeader(name, "cell boundary");
134
- }
135
- }
160
+ free(kmlName);
136
161
  }
137
162
 
138
163
  // generate the points
139
-
140
164
  if (res <= rootRes) {
141
- doCell(rootCell, isKmlOut);
165
+ doCell(parentIndex, kmlArg.found);
142
166
  } else {
143
- H3_SET_RESOLUTION(rootCell, res);
144
- recursiveH3IndexToGeo(rootCell, rootRes + 1, isKmlOut);
167
+ H3_SET_RESOLUTION(parentIndex, res);
168
+ recursiveH3IndexToGeo(parentIndex, rootRes + 1, kmlArg.found);
145
169
  }
146
170
 
147
- if (isKmlOut) kmlBoundaryFooter();
171
+ if (kmlArg.found) kmlBoundaryFooter();
148
172
  }
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright 2016-2017 Uber Technologies, Inc.
2
+ * Copyright 2016-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.
@@ -17,7 +17,7 @@
17
17
  * @brief takes an H3 index and generates cell center points for descendants a
18
18
  * specified resolution.
19
19
  *
20
- * usage: `h3ToGeoHier H3Index [resolution outputMode]`
20
+ * See `h3ToGeoHier --help` for usage.
21
21
  *
22
22
  * The program generates the cell center points in lat/lon coordinates for all
23
23
  * hierarchical children of H3Index at the specified resolution. If the
@@ -27,22 +27,23 @@
27
27
  * `resolution` should be a positive integer. The default is 0 (i.e., only the
28
28
  * specified cell H3Index would be processed).
29
29
  *
30
- * `outputMode` indicates the type of output; currently the choices are 0 for
31
- * plain text output (the default) and 1 for KML output.
30
+ * `--kml` indicates KML output format; if not specified plain text output is
31
+ * the default.
32
32
  *
33
33
  * Examples:
34
34
  * ---------
35
35
  *
36
- * `h3ToGeoHier 836e9bfffffffff`
36
+ * `h3ToGeoHier --parent 836e9bfffffffff`
37
37
  * - outputs the cell center point in lat/lon for cell
38
38
  * `836e9bfffffffff` as plain text
39
39
  *
40
- * `h3ToGeoHier 820ceffffffffff 4 1 > pts.kml`
40
+ * `h3ToGeoHier --parent 820ceffffffffff --resolution 4 --kml > pts.kml`
41
41
  * - outputs the cell center points of all of the resolution 4
42
42
  * descendants of cell `820ceffffffffff` as a KML file (redirected to
43
43
  * `pts.kml`).
44
44
  *
45
- * `h3ToGeoHier 86283082fffffff 9 1 > uber9pts.kml`
45
+ * `h3ToGeoHier --parent 86283082fffffff --resolution 9 --kml >
46
+ * uber9pts.kml`
46
47
  * - creates a KML file containing the cell center points of all of the
47
48
  * resolution 9 hexagons covering Uber HQ and the surrounding region of
48
49
  * San Francisco.
@@ -52,14 +53,12 @@
52
53
  #include <stdio.h>
53
54
  #include <stdlib.h>
54
55
  #include <string.h>
56
+ #include "args.h"
55
57
  #include "baseCells.h"
56
- #include "coordijk.h"
57
- #include "geoCoord.h"
58
58
  #include "h3Index.h"
59
59
  #include "h3api.h"
60
60
  #include "kml.h"
61
61
  #include "utility.h"
62
- #include "vec2d.h"
63
62
 
64
63
  void doCell(H3Index h, int isKmlOut) {
65
64
  GeoCoord g;
@@ -95,55 +94,81 @@ void recursiveH3IndexToGeo(H3Index h, int res, int isKmlOut) {
95
94
  }
96
95
  }
97
96
 
98
- int main(int argc, char* argv[]) {
99
- // check command line args
100
- if (argc < 2 || argc > 5) {
101
- fprintf(stderr, "usage: %s H3Index [resolution outputMode]\n", argv[0]);
102
- exit(1);
97
+ int main(int argc, char *argv[]) {
98
+ int res = 0;
99
+ H3Index parentIndex = 0;
100
+
101
+ Arg helpArg = ARG_HELP;
102
+ Arg resArg = {.names = {"-r", "--resolution"},
103
+ .scanFormat = "%d",
104
+ .valueName = "res",
105
+ .value = &res,
106
+ .helpText =
107
+ "Resolution, if less than the resolution of the parent "
108
+ "only the parent is printed. Default the resolution of "
109
+ "the parent."};
110
+ Arg parentArg = {
111
+ .names = {"-p", "--parent"},
112
+ .scanFormat = "%" PRIx64,
113
+ .valueName = "parent",
114
+ .value = &parentIndex,
115
+ .required = true,
116
+ .helpText = "Print cell centers descendent from this index."};
117
+ Arg kmlArg = ARG_KML;
118
+ DEFINE_KML_NAME_ARG(userKmlName, kmlNameArg);
119
+ DEFINE_KML_DESC_ARG(userKmlDesc, kmlDescArg);
120
+
121
+ Arg *args[] = {&helpArg, &resArg, &parentArg,
122
+ &kmlArg, &kmlNameArg, &kmlDescArg};
123
+ const int numArgs = 6;
124
+ const char *helpText =
125
+ "Print cell center points for descendants of an index";
126
+
127
+ if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) {
128
+ return helpArg.found ? 0 : 1;
103
129
  }
104
130
 
105
- H3Index rootCell = H3_EXPORT(stringToH3)(argv[1]);
106
- int baseCell = H3_GET_BASE_CELL(rootCell);
107
- int rootRes = H3_GET_RESOLUTION(rootCell);
108
- if (baseCell < 0 || baseCell >= NUM_BASE_CELLS) {
109
- error("invalid base cell number");
131
+ if (res > MAX_H3_RES) {
132
+ printHelp(stderr, argv[0], helpText, numArgs, args,
133
+ "Resolution exceeds maximum resolution.", NULL);
134
+ return 1;
110
135
  }
111
136
 
112
- int res = 0;
113
- int isKmlOut = 0;
114
- if (argc > 2) {
115
- if (!sscanf(argv[2], "%d", &res))
116
- error("resolution must be an integer");
137
+ if (!H3_EXPORT(h3IsValid)(parentIndex)) {
138
+ printHelp(stderr, argv[0], helpText, numArgs, args,
139
+ "Parent index is invalid.", NULL);
140
+ return 1;
141
+ }
117
142
 
118
- if (res > MAX_H3_RES)
119
- error("specified resolution exceeds max resolution");
143
+ int rootRes = H3_GET_RESOLUTION(parentIndex);
120
144
 
121
- if (argc > 3) {
122
- if (!sscanf(argv[3], "%d", &isKmlOut))
123
- error("outputMode must be an integer");
145
+ if (kmlArg.found) {
146
+ char *kmlName;
147
+ if (kmlNameArg.found) {
148
+ kmlName = strdup(userKmlName);
149
+ } else {
150
+ kmlName = calloc(BUFF_SIZE, sizeof(char));
124
151
 
125
- if (isKmlOut != 0 && isKmlOut != 1)
126
- error("outputMode must be 0 or 1");
152
+ sprintf(kmlName, "Cell %" PRIx64 " Res %d", parentIndex,
153
+ ((res <= rootRes) ? rootRes : res));
154
+ }
127
155
 
128
- if (isKmlOut) {
129
- char name[BUFF_SIZE];
156
+ char *kmlDesc = "Generated by h3ToGeoHier";
157
+ if (kmlDescArg.found) kmlDesc = userKmlDesc;
130
158
 
131
- sprintf(name, "Cell %" PRIx64 " Res %d", rootCell,
132
- ((res <= rootRes) ? rootRes : res));
159
+ kmlBoundaryHeader(kmlName, kmlDesc);
133
160
 
134
- kmlBoundaryHeader(name, "cell center");
135
- }
136
- }
161
+ free(kmlName);
137
162
  }
138
163
 
139
164
  // generate the points
140
165
 
141
166
  if (res <= rootRes) {
142
- doCell(rootCell, isKmlOut);
167
+ doCell(parentIndex, kmlArg.found);
143
168
  } else {
144
- H3_SET_RESOLUTION(rootCell, res);
145
- recursiveH3IndexToGeo(rootCell, rootRes + 1, isKmlOut);
169
+ H3_SET_RESOLUTION(parentIndex, res);
170
+ recursiveH3IndexToGeo(parentIndex, rootRes + 1, kmlArg.found);
146
171
  }
147
172
 
148
- if (isKmlOut) kmlBoundaryFooter();
173
+ if (kmlArg.found) kmlBoundaryFooter();
149
174
  }