diff --git a/main.cpp b/main.cpp index aa6c49f2..531bdd86 100644 --- a/main.cpp +++ b/main.cpp @@ -99,6 +99,7 @@ int retain_points_multiplier = 1; std::vector unidecode_data; size_t maximum_string_attribute_length = 0; std::string accumulate_numeric; +std::string use_h3_index; std::vector order_by; bool order_reverse; @@ -3128,6 +3129,7 @@ int main(int argc, char **argv) { {"coalesce", no_argument, &additional[A_COALESCE], 1}, {"reverse", no_argument, &additional[A_REVERSE], 1}, {"hilbert", no_argument, &additional[A_HILBERT], 1}, + {"use-h3-index", required_argument, 0, '~'}, {"order-by", required_argument, 0, '~'}, {"order-descending-by", required_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]); exit(EXIT_ARGS); } + } else if (strcmp(opt, "use-h3-index") == 0) { + use_h3_index = optarg; } else if (strcmp(opt, "order-by") == 0) { order_by.push_back(order_field(optarg, false)); } else if (strcmp(opt, "order-descending-by") == 0) { diff --git a/main.hpp b/main.hpp index 714af5c3..6dd782cd 100644 --- a/main.hpp +++ b/main.hpp @@ -53,6 +53,7 @@ extern long long extend_zooms_max; extern int retain_points_multiplier; extern size_t maximum_string_attribute_length; extern std::string accumulate_numeric; +extern std::string use_h3_index; extern unsigned long long preserve_multiplier_density_threshold; struct order_field { diff --git a/serial.cpp b/serial.cpp index 5afc2ed2..cd779024 100644 --- a/serial.cpp +++ b/serial.cpp @@ -714,6 +714,19 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf, std:: } 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]) { sf.full_keys.push_back(key_pool.pool("tippecanoe:index"));