h3 3.4.4 → 3.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/Gemfile.lock +1 -1
- data/README.md +2 -1
- data/ext/h3/Makefile +1 -1
- data/ext/h3/src/.gitignore +2 -1
- data/ext/h3/src/CHANGELOG.md +9 -0
- data/ext/h3/src/CMakeLists.txt +72 -45
- data/ext/h3/src/RELEASE.md +2 -1
- data/ext/h3/src/VERSION +1 -1
- data/ext/h3/src/docs/api/hierarchy.md +2 -0
- data/ext/h3/src/docs/api/indexing.md +3 -1
- data/ext/h3/src/docs/api/inspection.md +20 -0
- data/ext/h3/src/docs/api/misc.md +2 -0
- data/ext/h3/src/docs/api/regions.md +2 -0
- data/ext/h3/src/docs/api/traversal.md +2 -0
- data/ext/h3/src/docs/api/uniedge.md +2 -0
- data/ext/h3/src/docs/community/bindings.md +4 -0
- data/ext/h3/src/docs/community/tutorials.md +12 -0
- data/ext/h3/src/scripts/update_version.sh +50 -0
- data/ext/h3/src/src/apps/applib/include/args.h +122 -0
- data/ext/h3/src/src/apps/applib/include/utility.h +5 -62
- data/ext/h3/src/src/apps/applib/lib/args.c +216 -0
- data/ext/h3/src/src/apps/applib/lib/utility.c +40 -206
- data/ext/h3/src/src/apps/filters/geoToH3.c +7 -9
- data/ext/h3/src/src/apps/filters/h3ToComponents.c +50 -47
- data/ext/h3/src/src/apps/filters/h3ToGeo.c +7 -30
- data/ext/h3/src/src/apps/filters/h3ToGeoBoundary.c +7 -27
- data/ext/h3/src/src/apps/filters/h3ToLocalIj.c +42 -25
- data/ext/h3/src/src/apps/filters/hexRange.c +43 -24
- data/ext/h3/src/src/apps/filters/kRing.c +4 -4
- data/ext/h3/src/src/apps/filters/localIjToH3.c +63 -21
- data/ext/h3/src/src/apps/miscapps/h3ToGeoBoundaryHier.c +68 -44
- data/ext/h3/src/src/apps/miscapps/h3ToGeoHier.c +68 -43
- data/ext/h3/src/src/apps/miscapps/h3ToHier.c +48 -37
- data/ext/h3/src/src/apps/testapps/mkRandGeo.c +32 -27
- data/ext/h3/src/src/apps/testapps/mkRandGeoBoundary.c +33 -28
- data/ext/h3/src/src/apps/testapps/testH3GetFaces.c +136 -0
- data/ext/h3/src/src/h3lib/include/faceijk.h +19 -7
- data/ext/h3/src/src/h3lib/include/h3api.h.in +12 -1
- data/ext/h3/src/src/h3lib/lib/algos.c +7 -2
- data/ext/h3/src/src/h3lib/lib/faceijk.c +135 -103
- data/ext/h3/src/src/h3lib/lib/h3Index.c +86 -5
- data/lib/h3/bindings/private.rb +1 -0
- data/lib/h3/inspection.rb +34 -0
- data/lib/h3/version.rb +1 -1
- data/spec/inspection_spec.rb +33 -1
- metadata +6 -2
@@ -17,7 +17,7 @@
|
|
17
17
|
* @brief stdin/stdout filter that converts from lat/lon coordinates to integer
|
18
18
|
* H3 indexes
|
19
19
|
*
|
20
|
-
*
|
20
|
+
* See `geoToH3 --help` for usage.
|
21
21
|
*
|
22
22
|
* The program reads lat/lon pairs from stdin until EOF is encountered. For
|
23
23
|
* each lat/lon the program outputs to stdout the integer H3 index of the
|
@@ -32,8 +32,7 @@
|
|
32
32
|
* latN lonN
|
33
33
|
*/
|
34
34
|
|
35
|
-
#include
|
36
|
-
#include <stdlib.h>
|
35
|
+
#include "args.h"
|
37
36
|
#include "h3Index.h"
|
38
37
|
#include "utility.h"
|
39
38
|
|
@@ -58,8 +57,7 @@ int main(int argc, char* argv[]) {
|
|
58
57
|
double lat = 0;
|
59
58
|
double lon = 0;
|
60
59
|
|
61
|
-
Arg helpArg =
|
62
|
-
.helpText = "Show this help message."};
|
60
|
+
Arg helpArg = ARG_HELP;
|
63
61
|
Arg resArg = {.names = {"-r", "--resolution"},
|
64
62
|
.required = true,
|
65
63
|
.scanFormat = "%d",
|
@@ -72,7 +70,7 @@ int main(int argc, char* argv[]) {
|
|
72
70
|
.value = &lat,
|
73
71
|
.helpText =
|
74
72
|
"Latitude in degrees. If not specified, \"latitude "
|
75
|
-
"longitude\" pairs will be read from
|
73
|
+
"longitude\" pairs will be read from standard input."};
|
76
74
|
Arg lonArg = {.names = {"--lon", "--longitude"},
|
77
75
|
.scanFormat = "%lf",
|
78
76
|
.valueName = "lon",
|
@@ -80,17 +78,17 @@ int main(int argc, char* argv[]) {
|
|
80
78
|
.helpText = "Longitude in degrees."};
|
81
79
|
|
82
80
|
Arg* args[] = {&helpArg, &resArg, &latArg, &lonArg};
|
83
|
-
|
81
|
+
const int numArgs = 4;
|
84
82
|
const char* helpText =
|
85
83
|
"Convert degrees latitude/longitude coordinates to H3 indexes.";
|
86
84
|
|
87
|
-
if (parseArgs(argc, argv,
|
85
|
+
if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) {
|
88
86
|
return helpArg.found ? 0 : 1;
|
89
87
|
}
|
90
88
|
|
91
89
|
if (latArg.found != lonArg.found) {
|
92
90
|
// One is found but the other is not.
|
93
|
-
printHelp(stderr, argv[0], helpText,
|
91
|
+
printHelp(stderr, argv[0], helpText, numArgs, args,
|
94
92
|
"Latitude and longitude must both be specified.", NULL);
|
95
93
|
return 1;
|
96
94
|
}
|
@@ -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,16 +17,14 @@
|
|
17
17
|
* @brief stdin/stdout filter that converts from integer H3 indexes to
|
18
18
|
* components.
|
19
19
|
*
|
20
|
-
*
|
20
|
+
* See `h3ToComponents --help` for usage.
|
21
21
|
*
|
22
22
|
* The program reads H3 indexes from stdin until EOF and outputs the
|
23
23
|
* corresponding component strings to stdout.
|
24
24
|
*/
|
25
25
|
|
26
|
-
#include <
|
27
|
-
#include
|
28
|
-
#include <string.h>
|
29
|
-
#include "baseCells.h"
|
26
|
+
#include <inttypes.h>
|
27
|
+
#include "args.h"
|
30
28
|
#include "h3Index.h"
|
31
29
|
#include "utility.h"
|
32
30
|
|
@@ -44,29 +42,12 @@ char resDigitToChar(int d) {
|
|
44
42
|
return '0' + d;
|
45
43
|
}
|
46
44
|
|
47
|
-
void doCell(H3Index h,
|
45
|
+
void doCell(H3Index h, bool verboseMode) {
|
48
46
|
int h3Mode = H3_GET_MODE(h);
|
49
47
|
int h3Res = H3_GET_RESOLUTION(h);
|
50
48
|
int h3BaseCell = H3_GET_BASE_CELL(h);
|
51
|
-
if (verboseMode
|
52
|
-
|
53
|
-
printf("%d:%d:%d:", h3Mode, h3Res, h3BaseCell);
|
54
|
-
for (int i = 1; i <= h3Res; i++) {
|
55
|
-
printf("%c", resDigitToChar(H3_GET_INDEX_DIGIT(h, i)));
|
56
|
-
}
|
57
|
-
printf("\n");
|
58
|
-
} else if (h3Mode == H3_UNIEDGE_MODE) {
|
59
|
-
printf("%d:%d:%d:%d:", h3Mode, H3_GET_RESERVED_BITS(h), h3Res,
|
60
|
-
h3BaseCell);
|
61
|
-
for (int i = 1; i <= h3Res; i++) {
|
62
|
-
printf("%c", resDigitToChar(H3_GET_INDEX_DIGIT(h, i)));
|
63
|
-
}
|
64
|
-
printf("\n");
|
65
|
-
} else {
|
66
|
-
printf("INVALID INDEX\n");
|
67
|
-
}
|
68
|
-
} else {
|
69
|
-
char* modes[] = {
|
49
|
+
if (verboseMode) {
|
50
|
+
const char* modes[] = {
|
70
51
|
"RESERVED", // 0
|
71
52
|
"Hexagon", // 1
|
72
53
|
"Unidirectional Edge", // 2
|
@@ -100,33 +81,55 @@ void doCell(H3Index h, int verboseMode) {
|
|
100
81
|
resDigitToChar(H3_GET_INDEX_DIGIT(h, i)));
|
101
82
|
}
|
102
83
|
printf("╚════════════╝\n\n");
|
84
|
+
} else {
|
85
|
+
if (h3Mode == H3_HEXAGON_MODE) {
|
86
|
+
printf("%d:%d:%d:", h3Mode, h3Res, h3BaseCell);
|
87
|
+
for (int i = 1; i <= h3Res; i++) {
|
88
|
+
printf("%c", resDigitToChar(H3_GET_INDEX_DIGIT(h, i)));
|
89
|
+
}
|
90
|
+
printf("\n");
|
91
|
+
} else if (h3Mode == H3_UNIEDGE_MODE) {
|
92
|
+
printf("%d:%d:%d:%d:", h3Mode, H3_GET_RESERVED_BITS(h), h3Res,
|
93
|
+
h3BaseCell);
|
94
|
+
for (int i = 1; i <= h3Res; i++) {
|
95
|
+
printf("%c", resDigitToChar(H3_GET_INDEX_DIGIT(h, i)));
|
96
|
+
}
|
97
|
+
printf("\n");
|
98
|
+
} else {
|
99
|
+
printf("INVALID INDEX\n");
|
100
|
+
}
|
103
101
|
}
|
104
102
|
}
|
105
103
|
|
106
104
|
int main(int argc, char* argv[]) {
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
105
|
+
Arg helpArg = ARG_HELP;
|
106
|
+
Arg verboseArg = {.names = {"-v", "--verbose"},
|
107
|
+
.helpText = "Verbose output mode."};
|
108
|
+
DEFINE_INDEX_ARG(index, indexArg);
|
109
|
+
const int numArgs = 3;
|
110
|
+
Arg* args[] = {&helpArg, &verboseArg, &indexArg};
|
111
|
+
|
112
|
+
if (parseArgs(argc, argv, numArgs, args, &helpArg,
|
113
|
+
"Converts H3 indexes to component parts")) {
|
114
|
+
return helpArg.found ? 0 : 1;
|
116
115
|
}
|
117
116
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
//
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
117
|
+
if (indexArg.found) {
|
118
|
+
doCell(index, verboseArg.found);
|
119
|
+
} else {
|
120
|
+
// process the indexes on stdin
|
121
|
+
char buff[BUFF_SIZE];
|
122
|
+
while (1) {
|
123
|
+
// get an index from stdin
|
124
|
+
if (!fgets(buff, BUFF_SIZE, stdin)) {
|
125
|
+
if (feof(stdin))
|
126
|
+
break;
|
127
|
+
else
|
128
|
+
error("reading H3 index from stdin");
|
129
|
+
}
|
128
130
|
|
129
|
-
|
130
|
-
|
131
|
+
H3Index h3 = H3_EXPORT(stringToH3)(buff);
|
132
|
+
doCell(h3, verboseArg.found);
|
133
|
+
}
|
131
134
|
}
|
132
135
|
}
|
@@ -17,8 +17,7 @@
|
|
17
17
|
* @brief stdin/stdout filter that converts from integer H3 indexes to lat/lon
|
18
18
|
* cell center point
|
19
19
|
*
|
20
|
-
*
|
21
|
-
* desc]]`
|
20
|
+
* See `h3ToGeo --help` for usage.
|
22
21
|
*
|
23
22
|
* The program reads H3 indexes from stdin and outputs the corresponding
|
24
23
|
* cell center points to stdout, until EOF is encountered. The H3 indexes
|
@@ -42,9 +41,7 @@
|
|
42
41
|
*/
|
43
42
|
|
44
43
|
#include <inttypes.h>
|
45
|
-
#include
|
46
|
-
#include <stdlib.h>
|
47
|
-
#include <string.h>
|
44
|
+
#include "args.h"
|
48
45
|
#include "h3api.h"
|
49
46
|
#include "kml.h"
|
50
47
|
#include "utility.h"
|
@@ -66,31 +63,11 @@ void doCell(H3Index h, int isKmlOut) {
|
|
66
63
|
}
|
67
64
|
|
68
65
|
int main(int argc, char *argv[]) {
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
.helpText = "Show this help message."};
|
75
|
-
Arg indexArg = {
|
76
|
-
.names = {"-i", "--index"},
|
77
|
-
.scanFormat = "%" PRIx64,
|
78
|
-
.valueName = "index",
|
79
|
-
.value = &index,
|
80
|
-
.helpText =
|
81
|
-
"Index, or not specified to read indexes from standard in."};
|
82
|
-
Arg kmlArg = {.names = {"-k", "--kml"},
|
83
|
-
.helpText = "Print output in KML format."};
|
84
|
-
Arg kmlNameArg = {.names = {"--kn", "--kml-name"},
|
85
|
-
.scanFormat = "%255c", // BUFF_SIZE - 1
|
86
|
-
.valueName = "name",
|
87
|
-
.value = &userKmlName,
|
88
|
-
.helpText = "Text for the KML name tag."};
|
89
|
-
Arg kmlDescArg = {.names = {"--kd", "--kml-description"},
|
90
|
-
.scanFormat = "%255c", // BUFF_SIZE - 1
|
91
|
-
.valueName = "description",
|
92
|
-
.value = &userKmlDesc,
|
93
|
-
.helpText = "Text for the KML description tag."};
|
66
|
+
Arg helpArg = ARG_HELP;
|
67
|
+
DEFINE_INDEX_ARG(index, indexArg);
|
68
|
+
Arg kmlArg = ARG_KML;
|
69
|
+
DEFINE_KML_NAME_ARG(userKmlName, kmlNameArg);
|
70
|
+
DEFINE_KML_DESC_ARG(userKmlDesc, kmlDescArg);
|
94
71
|
|
95
72
|
Arg *args[] = {&helpArg, &indexArg, &kmlArg, &kmlNameArg, &kmlDescArg};
|
96
73
|
|
@@ -17,8 +17,7 @@
|
|
17
17
|
* @brief stdin/stdout filter that converts from integer H3 indexes to lat/lon
|
18
18
|
* cell boundaries
|
19
19
|
*
|
20
|
-
*
|
21
|
-
* [--kml-description desc]]`
|
20
|
+
* See `h3ToGeoBoundary --help` for usage.
|
22
21
|
*
|
23
22
|
* The program reads H3 indexes from stdin and outputs the corresponding
|
24
23
|
* cell boundaries to stdout, until EOF is encountered.
|
@@ -44,6 +43,7 @@
|
|
44
43
|
#include <stdio.h>
|
45
44
|
#include <stdlib.h>
|
46
45
|
#include <string.h>
|
46
|
+
#include "args.h"
|
47
47
|
#include "h3api.h"
|
48
48
|
#include "kml.h"
|
49
49
|
#include "utility.h"
|
@@ -64,31 +64,11 @@ void doCell(H3Index h, int isKmlOut) {
|
|
64
64
|
}
|
65
65
|
|
66
66
|
int main(int argc, char *argv[]) {
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
.helpText = "Show this help message."};
|
73
|
-
Arg indexArg = {
|
74
|
-
.names = {"-i", "--index"},
|
75
|
-
.scanFormat = "%" PRIx64,
|
76
|
-
.valueName = "index",
|
77
|
-
.value = &index,
|
78
|
-
.helpText =
|
79
|
-
"Index, or not specified to read indexes from standard in."};
|
80
|
-
Arg kmlArg = {.names = {"-k", "--kml"},
|
81
|
-
.helpText = "Print output in KML format."};
|
82
|
-
Arg kmlNameArg = {.names = {"--kn", "--kml-name"},
|
83
|
-
.scanFormat = "%255c", // BUFF_SIZE - 1
|
84
|
-
.valueName = "name",
|
85
|
-
.value = &userKmlName,
|
86
|
-
.helpText = "Text for the KML name tag."};
|
87
|
-
Arg kmlDescArg = {.names = {"--kd", "--kml-description"},
|
88
|
-
.scanFormat = "%255c", // BUFF_SIZE - 1
|
89
|
-
.valueName = "description",
|
90
|
-
.value = &userKmlDesc,
|
91
|
-
.helpText = "Text for the KML description tag."};
|
67
|
+
Arg helpArg = ARG_HELP;
|
68
|
+
DEFINE_INDEX_ARG(index, indexArg);
|
69
|
+
Arg kmlArg = ARG_KML;
|
70
|
+
DEFINE_KML_NAME_ARG(userKmlName, kmlNameArg);
|
71
|
+
DEFINE_KML_DESC_ARG(userKmlDesc, kmlDescArg);
|
92
72
|
|
93
73
|
Arg *args[] = {&helpArg, &indexArg, &kmlArg, &kmlNameArg, &kmlDescArg};
|
94
74
|
|
@@ -17,7 +17,7 @@
|
|
17
17
|
* @brief stdin/stdout filter that converts from H3 indexes to local IJ
|
18
18
|
* coordinates. This is experimental.
|
19
19
|
*
|
20
|
-
*
|
20
|
+
* See `h3ToLocalIj --help` for usage.
|
21
21
|
*
|
22
22
|
* The program reads H3 indexes from stdin and outputs the corresponding
|
23
23
|
* IJ coordinates to stdout, until EOF is encountered. `NA` is printed if the
|
@@ -33,8 +33,7 @@
|
|
33
33
|
#include <inttypes.h>
|
34
34
|
#include <stdio.h>
|
35
35
|
#include <stdlib.h>
|
36
|
-
#include "
|
37
|
-
#include "h3Index.h"
|
36
|
+
#include "args.h"
|
38
37
|
#include "h3api.h"
|
39
38
|
#include "utility.h"
|
40
39
|
|
@@ -47,32 +46,50 @@ void doCell(H3Index h, H3Index origin) {
|
|
47
46
|
}
|
48
47
|
}
|
49
48
|
|
50
|
-
int main(int argc, char
|
51
|
-
|
52
|
-
if (argc != 2) {
|
53
|
-
fprintf(stderr, "usage: %s [origin]\n", argv[0]);
|
54
|
-
exit(1);
|
55
|
-
}
|
49
|
+
int main(int argc, char* argv[]) {
|
50
|
+
H3Index origin = 0;
|
56
51
|
|
57
|
-
|
52
|
+
Arg helpArg = ARG_HELP;
|
53
|
+
Arg originArg = {
|
54
|
+
.names = {"-o", "--origin"},
|
55
|
+
.scanFormat = "%" PRIx64,
|
56
|
+
.valueName = "origin",
|
57
|
+
.value = &origin,
|
58
|
+
.required = true,
|
59
|
+
.helpText =
|
60
|
+
"Origin (anchoring index) for the local coordinate system."};
|
61
|
+
DEFINE_INDEX_ARG(index, indexArg);
|
58
62
|
|
59
|
-
|
60
|
-
|
63
|
+
Arg* args[] = {&helpArg, &originArg, &indexArg};
|
64
|
+
const int numArgs = 3;
|
65
|
+
const char* helpText = "Converts H3 indexes to local IJ coordinates";
|
61
66
|
|
62
|
-
if (
|
67
|
+
if (parseArgs(argc, argv, numArgs, args, &helpArg, helpText)) {
|
68
|
+
return helpArg.found ? 0 : 1;
|
69
|
+
}
|
63
70
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
if (feof(stdin))
|
70
|
-
break;
|
71
|
-
else
|
72
|
-
error("reading H3 index from stdin");
|
73
|
-
}
|
71
|
+
if (!H3_EXPORT(h3IsValid)(origin)) {
|
72
|
+
printHelp(stderr, argv[0], helpText, numArgs, args,
|
73
|
+
"Origin is invalid.", NULL);
|
74
|
+
return 1;
|
75
|
+
}
|
74
76
|
|
75
|
-
|
76
|
-
doCell(
|
77
|
+
if (indexArg.found) {
|
78
|
+
doCell(index, origin);
|
79
|
+
} else {
|
80
|
+
// process the indexes on stdin
|
81
|
+
char buff[BUFF_SIZE];
|
82
|
+
while (1) {
|
83
|
+
// get an index from stdin
|
84
|
+
if (!fgets(buff, BUFF_SIZE, stdin)) {
|
85
|
+
if (feof(stdin))
|
86
|
+
break;
|
87
|
+
else
|
88
|
+
error("reading H3 index from stdin");
|
89
|
+
}
|
90
|
+
|
91
|
+
H3Index h3 = H3_EXPORT(stringToH3)(buff);
|
92
|
+
doCell(h3, origin);
|
93
|
+
}
|
77
94
|
}
|
78
95
|
}
|
@@ -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 stdin/stdout filter that converts from integer H3 indexes to
|
18
18
|
* k-rings
|
19
19
|
*
|
20
|
-
*
|
20
|
+
* See `hexRange --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. Requires all indexes
|
@@ -28,10 +28,11 @@
|
|
28
28
|
* as the only output.
|
29
29
|
*/
|
30
30
|
|
31
|
+
#include <inttypes.h>
|
31
32
|
#include <stdio.h>
|
32
33
|
#include <stdlib.h>
|
33
|
-
#include "
|
34
|
-
#include "
|
34
|
+
#include "args.h"
|
35
|
+
#include "h3api.h"
|
35
36
|
#include "utility.h"
|
36
37
|
|
37
38
|
void doCell(H3Index h, int k) {
|
@@ -50,29 +51,47 @@ void doCell(H3Index h, int k) {
|
|
50
51
|
}
|
51
52
|
|
52
53
|
int main(int argc, char* argv[]) {
|
53
|
-
// check command line args
|
54
|
-
if (argc != 2) {
|
55
|
-
fprintf(stderr, "usage: %s [k]\n", argv[0]);
|
56
|
-
exit(1);
|
57
|
-
}
|
58
|
-
|
59
54
|
int k = 0;
|
60
|
-
|
61
|
-
|
55
|
+
H3Index origin = 0;
|
56
|
+
|
57
|
+
Arg helpArg = ARG_HELP;
|
58
|
+
Arg kArg = {.names = {"-k", NULL},
|
59
|
+
.required = true,
|
60
|
+
.scanFormat = "%d",
|
61
|
+
.valueName = "k",
|
62
|
+
.value = &k,
|
63
|
+
.helpText = "Radius in hexagons."};
|
64
|
+
Arg originArg = {
|
65
|
+
.names = {"-o", "--origin"},
|
66
|
+
.scanFormat = "%" PRIx64,
|
67
|
+
.valueName = "origin",
|
68
|
+
.value = &origin,
|
69
|
+
.helpText =
|
70
|
+
"Origin, or not specified to read origins from standard input."};
|
71
|
+
const int numArgs = 3;
|
72
|
+
Arg* args[] = {&helpArg, &kArg, &originArg};
|
73
|
+
|
74
|
+
if (parseArgs(argc, argv, numArgs, args, &helpArg,
|
75
|
+
"Print indexes k distance away from the origin")) {
|
76
|
+
return helpArg.found ? 0 : 1;
|
62
77
|
}
|
63
78
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
//
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
79
|
+
if (originArg.found) {
|
80
|
+
doCell(origin, k);
|
81
|
+
} else {
|
82
|
+
// process the indexes on stdin
|
83
|
+
char buff[BUFF_SIZE];
|
84
|
+
while (1) {
|
85
|
+
// get an index from stdin
|
86
|
+
if (!fgets(buff, BUFF_SIZE, stdin)) {
|
87
|
+
if (feof(stdin))
|
88
|
+
break;
|
89
|
+
else
|
90
|
+
error("reading H3 index from stdin");
|
91
|
+
}
|
74
92
|
|
75
|
-
|
76
|
-
|
93
|
+
H3Index h3 = H3_EXPORT(stringToH3)(buff);
|
94
|
+
doCell(h3, k);
|
95
|
+
}
|
77
96
|
}
|
78
97
|
}
|