Add a flag to use an H3 index for the feature index

This commit is contained in:
Erica Fischer
2025-01-30 11:01:28 -08:00
parent 390c362452
commit b9b48f42c9
3 changed files with 18 additions and 0 deletions
+4
View File
@@ -99,6 +99,7 @@ int retain_points_multiplier = 1;
std::vector<std::string> unidecode_data; std::vector<std::string> unidecode_data;
size_t maximum_string_attribute_length = 0; size_t maximum_string_attribute_length = 0;
std::string accumulate_numeric; std::string accumulate_numeric;
std::string use_h3_index;
std::vector<order_field> order_by; std::vector<order_field> order_by;
bool order_reverse; bool order_reverse;
@@ -3128,6 +3129,7 @@ int main(int argc, char **argv) {
{"coalesce", no_argument, &additional[A_COALESCE], 1}, {"coalesce", no_argument, &additional[A_COALESCE], 1},
{"reverse", no_argument, &additional[A_REVERSE], 1}, {"reverse", no_argument, &additional[A_REVERSE], 1},
{"hilbert", no_argument, &additional[A_HILBERT], 1}, {"hilbert", no_argument, &additional[A_HILBERT], 1},
{"use-h3-index", required_argument, 0, '~'},
{"order-by", required_argument, 0, '~'}, {"order-by", required_argument, 0, '~'},
{"order-descending-by", required_argument, 0, '~'}, {"order-descending-by", required_argument, 0, '~'},
{"order-smallest-first", no_argument, 0, '~'}, {"order-smallest-first", no_argument, 0, '~'},
@@ -3269,6 +3271,8 @@ int main(int argc, char **argv) {
fprintf(stderr, "%s: --extra-detail can be at most 30\n", argv[0]); fprintf(stderr, "%s: --extra-detail can be at most 30\n", argv[0]);
exit(EXIT_ARGS); exit(EXIT_ARGS);
} }
} else if (strcmp(opt, "use-h3-index") == 0) {
use_h3_index = optarg;
} else if (strcmp(opt, "order-by") == 0) { } else if (strcmp(opt, "order-by") == 0) {
order_by.push_back(order_field(optarg, false)); order_by.push_back(order_field(optarg, false));
} else if (strcmp(opt, "order-descending-by") == 0) { } else if (strcmp(opt, "order-descending-by") == 0) {
+1
View File
@@ -53,6 +53,7 @@ extern long long extend_zooms_max;
extern int retain_points_multiplier; extern int retain_points_multiplier;
extern size_t maximum_string_attribute_length; extern size_t maximum_string_attribute_length;
extern std::string accumulate_numeric; extern std::string accumulate_numeric;
extern std::string use_h3_index;
extern unsigned long long preserve_multiplier_density_threshold; extern unsigned long long preserve_multiplier_density_threshold;
struct order_field { struct order_field {
+13
View File
@@ -714,6 +714,19 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf, std::
} }
bbox_index = encode_index(midx, midy); bbox_index = encode_index(midx, midy);
if (use_h3_index.size() > 0) {
for (size_t i = 0; i < sf.full_keys.size(); i++) {
if (*(sf.full_keys[i]) == use_h3_index) {
unsigned long long h3_index = atoll(sf.full_values[i].s.c_str());
// the top 52 bits of the feature index are the H3 index;
// the bottom 12 bits are retained from what otherwise would have been the index.
bbox_index = ((h3_index & ((1LL << 52) - 1)) << 12) | (bbox_index & ((1 << 12) - 1));
break;
}
}
}
if (additional[A_CALCULATE_INDEX]) { if (additional[A_CALCULATE_INDEX]) {
sf.full_keys.push_back(key_pool.pool("tippecanoe:index")); sf.full_keys.push_back(key_pool.pool("tippecanoe:index"));