diff --git a/geometry.cpp b/geometry.cpp index db4431c6..d61eaac8 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -687,15 +687,15 @@ drawvec reduce_tiny_poly(drawvec &geom, int z, int detail, bool *reduced, double // keep its attributes instead of this one that just happened to be // the one that hit the threshold of survival. - if (tiny_feature->extent > this_feature->extent) { + if (tiny_feature->area > this_feature->area) { *this_feature = *tiny_feature; - tiny_feature->extent = 0; + tiny_feature->area = 0; } } else { // this is a feature that we are throwing away, so hang on to it // attributes if it is bigger than the biggest one we threw away so far - if (this_feature->extent > tiny_feature->extent) { + if (this_feature->area > tiny_feature->area) { *tiny_feature = *this_feature; } } diff --git a/plugin.cpp b/plugin.cpp index ebb24889..c6a87617 100644 --- a/plugin.cpp +++ b/plugin.cpp @@ -400,7 +400,7 @@ serial_feature parse_feature(json_pull *jp, int z, unsigned x, unsigned y, std:: sf.index = 0; sf.bbox[0] = sf.bbox[1] = LLONG_MAX; sf.bbox[2] = sf.bbox[3] = LLONG_MIN; - sf.extent = 0; + sf.area = 0; sf.metapos = 0; sf.has_id = false; @@ -422,9 +422,9 @@ serial_feature parse_feature(json_pull *jp, int z, unsigned x, unsigned y, std:: sf.seq = sequence->value.number.number; } - json_object *extent = json_hash_get(tippecanoe, "extent"); - if (extent != NULL && extent->type == JSON_NUMBER) { - sf.extent = extent->value.number.number; + json_object *area = json_hash_get(tippecanoe, "extent"); + if (area != NULL && area->type == JSON_NUMBER) { + sf.area = area->value.number.number; } json_object *dropped = json_hash_get(tippecanoe, "dropped"); diff --git a/serial.cpp b/serial.cpp index 9aed16ef..cc059fd1 100644 --- a/serial.cpp +++ b/serial.cpp @@ -197,7 +197,7 @@ void serialize_feature(FILE *geomfile, serial_feature *sf, std::atomiclabel_point != 0) << FLAG_LABEL_POINT; layer |= (sf->seq != 0) << FLAG_SEQ; layer |= (sf->index != 0) << FLAG_INDEX; - layer |= (sf->extent != 0) << FLAG_EXTENT; + layer |= (sf->area != 0) << FLAG_AREA; layer |= sf->has_id << FLAG_ID; layer |= sf->has_tippecanoe_minzoom << FLAG_MINZOOM; layer |= sf->has_tippecanoe_maxzoom << FLAG_MAXZOOM; @@ -236,8 +236,8 @@ void serialize_feature(FILE *geomfile, serial_feature *sf, std::atomiclabel_point != 0) { serialize_ulong_long(geomfile, sf->label_point, geompos, fname); } - if (sf->extent != 0) { - serialize_long_long(geomfile, sf->extent, geompos, fname); + if (sf->area != 0) { + serialize_long_long(geomfile, sf->area, geompos, fname); } serialize_long_long(geomfile, sf->metapos, geompos, fname); @@ -290,7 +290,7 @@ serial_feature deserialize_feature(FILE *geoms, std::atomic *geompos_ sf.index = 0; sf.label_point = 0; - sf.extent = 0; + sf.area = 0; sf.geometry = decode_geometry(geoms, geompos_in, z, tx, ty, sf.bbox, initial_x[sf.segment], initial_y[sf.segment]); if (sf.layer & (1 << FLAG_INDEX)) { @@ -299,8 +299,8 @@ serial_feature deserialize_feature(FILE *geoms, std::atomic *geompos_ if (sf.layer & (1 << FLAG_LABEL_POINT)) { deserialize_ulong_long_io(geoms, &sf.label_point, geompos_in); } - if (sf.layer & (1 << FLAG_EXTENT)) { - deserialize_long_long_io(geoms, &sf.extent, geompos_in); + if (sf.layer & (1 << FLAG_AREA)) { + deserialize_long_long_io(geoms, &sf.area, geompos_in); } sf.layer >>= FLAG_LAYER; @@ -525,12 +525,12 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) { if (prevent[P_CLIPPING]) { static std::atomic warned(0); - long long extent = ((sf.bbox[2] - sf.bbox[0]) / ((1LL << (32 - sst->maxzoom)) + 1)) * ((sf.bbox[3] - sf.bbox[1]) / ((1LL << (32 - sst->maxzoom)) + 1)); - if (extent > warned) { - fprintf(stderr, "Warning: %s:%d: Large unclipped (-pc) feature may be duplicated across %lld tiles\n", sst->fname, sst->line, extent); - warned = extent; + long long area = ((sf.bbox[2] - sf.bbox[0]) / ((1LL << (32 - sst->maxzoom)) + 1)) * ((sf.bbox[3] - sf.bbox[1]) / ((1LL << (32 - sst->maxzoom)) + 1)); + if (area > warned) { + fprintf(stderr, "Warning: %s:%d: Large unclipped (-pc) feature may be duplicated across %lld tiles\n", sst->fname, sst->line, area); + warned = area; - if (extent > 10000) { + if (area > 10000) { fprintf(stderr, "Exiting because this can't be right.\n"); exit(EXIT_IMPOSSIBLE); } @@ -538,7 +538,7 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) { } } - double extent = 0; + double area = 0; if (additional[A_DROP_SMALLEST_AS_NEEDED] || additional[A_COALESCE_SMALLEST_AS_NEEDED] || order_by_size) { if (sf.t == VT_POLYGON) { for (size_t i = 0; i < scaled_geometry.size(); i++) { @@ -550,7 +550,7 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) { } } - extent += SHIFT_LEFT(SHIFT_LEFT(1LL)) * get_area(scaled_geometry, i, j); + area += SHIFT_LEFT(SHIFT_LEFT(1LL)) * get_area(scaled_geometry, i, j); i = j - 1; } } @@ -564,16 +564,16 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf) { } } // treat lines as having the area of a circle with the line as diameter - extent = M_PI * (dist / 2) * (dist / 2); + area = M_PI * (dist / 2) * (dist / 2); } - // VT_POINT extent will be calculated in write_tile from the distance between adjacent features. + // VT_POINT area will be calculated in write_tile from the distance between adjacent features. } - if (extent <= LLONG_MAX) { - sf.extent = (long long) extent; + if (area <= LLONG_MAX) { + sf.area = (long long) area; } else { - sf.extent = LLONG_MAX; + sf.area = LLONG_MAX; } if (!prevent[P_INPUT_ORDER]) { diff --git a/serial.hpp b/serial.hpp index 7c2312bd..eb4eb4eb 100644 --- a/serial.hpp +++ b/serial.hpp @@ -57,7 +57,7 @@ struct serial_feature { drawvec geometry = drawvec(); unsigned long long index = 0; unsigned long long label_point = 0; - long long extent = 0; + long long area = 0; std::vector keys{}; std::vector values{}; diff --git a/tile.cpp b/tile.cpp index dbdd144f..2234395a 100644 --- a/tile.cpp +++ b/tile.cpp @@ -96,7 +96,7 @@ struct coalesce { double spacing = 0; bool has_id = false; unsigned long long id = 0; - long long extent = 0; + long long area = 0; bool operator<(const coalesce &o) const { int cmp = coalindexcmp(this, &o); @@ -254,7 +254,7 @@ static mvt_value find_attribute_value(const struct coalesce *c1, std::string key if (key == ORDER_BY_SIZE) { mvt_value v; v.type = mvt_double; - v.numeric_value.double_value = c1->extent; + v.numeric_value.double_value = c1->area; return v; } @@ -324,7 +324,7 @@ struct ordercmp { } } ordercmp; -void rewrite(drawvec &geom, int z, int nextzoom, int maxzoom, long long *bbox, unsigned tx, unsigned ty, int buffer, int *within, std::atomic *geompos, FILE **geomfile, const char *fname, signed char t, int layer, long long metastart, signed char feature_minzoom, int child_shards, int max_zoom_increment, long long seq, int tippecanoe_minzoom, int tippecanoe_maxzoom, int segment, unsigned *initial_x, unsigned *initial_y, std::vector &metakeys, std::vector &metavals, bool has_id, unsigned long long id, unsigned long long index, unsigned long long label_point, long long extent) { +void rewrite(drawvec &geom, int z, int nextzoom, int maxzoom, long long *bbox, unsigned tx, unsigned ty, int buffer, int *within, std::atomic *geompos, FILE **geomfile, const char *fname, signed char t, int layer, long long metastart, signed char feature_minzoom, int child_shards, int max_zoom_increment, long long seq, int tippecanoe_minzoom, int tippecanoe_maxzoom, int segment, unsigned *initial_x, unsigned *initial_y, std::vector &metakeys, std::vector &metavals, bool has_id, unsigned long long id, unsigned long long index, unsigned long long label_point, long long area) { if (geom.size() > 0 && (nextzoom <= maxzoom || additional[A_EXTEND_ZOOMS])) { int xo, yo; int span = 1 << (nextzoom - z); @@ -415,7 +415,7 @@ void rewrite(drawvec &geom, int z, int nextzoom, int maxzoom, long long *bbox, u sf.geometry = geom2; sf.index = index; sf.label_point = label_point; - sf.extent = extent; + sf.area = area; sf.feature_minzoom = feature_minzoom; if (metastart < 0) { @@ -459,7 +459,7 @@ struct partial { unsigned long long id = 0; bool has_id = 0; ssize_t renamed = 0; - long long extent = 0; + long long area = 0; long long clustered = 0; std::set need_tilestats; std::map attribute_accum_state; @@ -1248,9 +1248,9 @@ unsigned long long choose_mingap(std::vector const &indices, return top; } -long long choose_minextent(std::vector &extents, double f) { - std::sort(extents.begin(), extents.end()); - return extents[(extents.size() - 1) * (1 - f)]; +long long choose_minarea(std::vector &areas, double f) { + std::sort(areas.begin(), areas.end()); + return areas[(areas.size() - 1) * (1 - f)]; } struct write_tile_args { @@ -1290,8 +1290,8 @@ struct write_tile_args { size_t passes = 0; unsigned long long mingap = 0; unsigned long long mingap_out = 0; - long long minextent = 0; - long long minextent_out = 0; + long long minarea = 0; + long long minarea_out = 0; double fraction = 0; double fraction_out = 0; size_t tile_size_out = 0; @@ -1431,7 +1431,7 @@ serial_feature next_feature(FILE *geoms, std::atomic *geompos_in, cha if (*first_time && pass == 1) { /* only write out the next zoom once, even if we retry */ if (sf.tippecanoe_maxzoom == -1 || sf.tippecanoe_maxzoom >= nextzoom) { - rewrite(sf.geometry, z, nextzoom, maxzoom, sf.bbox, tx, ty, buffer, within, geompos, geomfile, fname, sf.t, sf.layer, sf.metapos, sf.feature_minzoom, child_shards, max_zoom_increment, sf.seq, sf.tippecanoe_minzoom, sf.tippecanoe_maxzoom, sf.segment, initial_x, initial_y, sf.keys, sf.values, sf.has_id, sf.id, sf.index, sf.label_point, sf.extent); + rewrite(sf.geometry, z, nextzoom, maxzoom, sf.bbox, tx, ty, buffer, within, geompos, geomfile, fname, sf.t, sf.layer, sf.metapos, sf.feature_minzoom, child_shards, max_zoom_increment, sf.seq, sf.tippecanoe_minzoom, sf.tippecanoe_maxzoom, sf.segment, initial_x, initial_y, sf.keys, sf.values, sf.has_id, sf.id, sf.index, sf.label_point, sf.area); } } @@ -1606,7 +1606,7 @@ void *run_prefilter(void *v) { decode_meta(sf.keys, sf.values, rpa->stringpool + rpa->pool_off[sf.segment], tmp_layer, tmp_feature); tmp_layer.features.push_back(tmp_feature); - layer_to_geojson(tmp_layer, 0, 0, 0, false, true, false, true, sf.index, sf.seq, sf.extent, true, state, 0); + layer_to_geojson(tmp_layer, 0, 0, 0, false, true, false, true, sf.index, sf.seq, sf.area, true, state, 0); } if (fclose(rpa->prefilter_fp) != 0) { @@ -1801,10 +1801,10 @@ static bool line_is_too_small(drawvec const &geometry, int z, int detail) { return true; } -long long write_tile(FILE *geoms, std::atomic *geompos_in, char *metabase, char *stringpool, int z, const unsigned tx, const unsigned ty, const int detail, int min_detail, sqlite3 *outdb, const char *outdir, int buffer, const char *fname, FILE **geomfile, int minzoom, int maxzoom, double todo, std::atomic *along, long long alongminus, double gamma, int child_shards, long long *meta_off, long long *pool_off, unsigned *initial_x, unsigned *initial_y, std::atomic *running, double simplification, std::vector> *layermaps, std::vector> *layer_unmaps, size_t tiling_seg, size_t pass, size_t passes, unsigned long long mingap, long long minextent, double fraction, const char *prefilter, const char *postfilter, struct json_object *filter, write_tile_args *arg, atomic_strategy *strategy) { +long long write_tile(FILE *geoms, std::atomic *geompos_in, char *metabase, char *stringpool, int z, const unsigned tx, const unsigned ty, const int detail, int min_detail, sqlite3 *outdb, const char *outdir, int buffer, const char *fname, FILE **geomfile, int minzoom, int maxzoom, double todo, std::atomic *along, long long alongminus, double gamma, int child_shards, long long *meta_off, long long *pool_off, unsigned *initial_x, unsigned *initial_y, std::atomic *running, double simplification, std::vector> *layermaps, std::vector> *layer_unmaps, size_t tiling_seg, size_t pass, size_t passes, unsigned long long mingap, long long minarea, double fraction, const char *prefilter, const char *postfilter, struct json_object *filter, write_tile_args *arg, atomic_strategy *strategy) { double merge_fraction = 1; double mingap_fraction = 1; - double minextent_fraction = 1; + double minarea_fraction = 1; static std::atomic oprogress(0); long long og = *geompos_in; @@ -1842,7 +1842,7 @@ long long write_tile(FILE *geoms, std::atomic *geompos_in, char *meta double fraction_accum = 0; unsigned long long previndex = 0, density_previndex = 0, merge_previndex = 0; - unsigned long long extent_previndex = 0; + unsigned long long area_previndex = 0; double scale = (double) (1LL << (64 - 2 * (z + 8))); double gap = 0, density_gap = 0; double spacing = 0; @@ -1853,7 +1853,7 @@ long long write_tile(FILE *geoms, std::atomic *geompos_in, char *meta std::vector partials; std::map> layers; std::vector indices; - std::vector extents; + std::vector areas; double coalesced_area = 0; drawvec shared_nodes; @@ -1961,17 +1961,17 @@ long long write_tile(FILE *geoms, std::atomic *geompos_in, char *meta } if (sf.t == VT_POINT) { - if (extent_previndex >= sf.index) { - sf.extent = 1; + if (area_previndex >= sf.index) { + sf.area = 1; } else { - double radius = sqrt(sf.index - extent_previndex) / 4.0; - sf.extent = M_PI * radius * radius; - if (sf.extent < 1) { - sf.extent = 1; + double radius = sqrt(sf.index - area_previndex) / 4.0; + sf.area = M_PI * radius * radius; + if (sf.area < 1) { + sf.area = 1; } } - extent_previndex = sf.index; + area_previndex = sf.index; } if (sf.dropped) { @@ -2022,23 +2022,23 @@ long long write_tile(FILE *geoms, std::atomic *geompos_in, char *meta indices.push_back(sf.index); if (sf.index - merge_previndex < mingap && find_partial(partials, sf, which_partial, layer_unmaps)) { partials[which_partial].geoms.push_back(sf.geometry); - coalesced_area += sf.extent; + coalesced_area += sf.area; preserve_attributes(arg->attribute_accum, sf, stringpool, pool_off, partials[which_partial]); strategy->coalesced_as_needed++; continue; } } else if (additional[A_DROP_SMALLEST_AS_NEEDED]) { - extents.push_back(sf.extent); - if (sf.extent + coalesced_area <= minextent && find_partial(partials, sf, which_partial, layer_unmaps)) { + areas.push_back(sf.area); + if (sf.area + coalesced_area <= minarea && find_partial(partials, sf, which_partial, layer_unmaps)) { preserve_attributes(arg->attribute_accum, sf, stringpool, pool_off, partials[which_partial]); strategy->dropped_as_needed++; continue; } } else if (additional[A_COALESCE_SMALLEST_AS_NEEDED]) { - extents.push_back(sf.extent); - if (sf.extent + coalesced_area <= minextent && find_partial(partials, sf, which_partial, layer_unmaps)) { + areas.push_back(sf.area); + if (sf.area + coalesced_area <= minarea && find_partial(partials, sf, which_partial, layer_unmaps)) { partials[which_partial].geoms.push_back(sf.geometry); - coalesced_area += sf.extent; + coalesced_area += sf.area; preserve_attributes(arg->attribute_accum, sf, stringpool, pool_off, partials[which_partial]); strategy->coalesced_as_needed++; continue; @@ -2061,7 +2061,7 @@ long long write_tile(FILE *geoms, std::atomic *geompos_in, char *meta if (fraction_accum < 1 && find_partial(partials, sf, which_partial, layer_unmaps)) { if (additional[A_COALESCE_FRACTION_AS_NEEDED]) { partials[which_partial].geoms.push_back(sf.geometry); - coalesced_area += sf.extent; + coalesced_area += sf.area; strategy->coalesced_as_needed++; } else { strategy->dropped_as_needed++; @@ -2127,7 +2127,7 @@ long long write_tile(FILE *geoms, std::atomic *geompos_in, char *meta p.has_id = sf.has_id; p.index = sf.index; p.renamed = -1; - p.extent = sf.extent; + p.area = sf.area; p.clustered = 0; if (line_detail == detail && extra_detail >= 0 && z == maxzoom) { @@ -2296,7 +2296,7 @@ long long write_tile(FILE *geoms, std::atomic *geompos_in, char *meta c.spacing = partials[i].spacing; c.id = partials[i].id; c.has_id = partials[i].has_id; - c.extent = partials[i].extent; + c.area = partials[i].area; // printf("segment %d layer %lld is %s\n", partials[i].segment, partials[i].layer, (*layer_unmaps)[partials[i].segment][partials[i].layer].c_str()); @@ -2532,16 +2532,16 @@ long long write_tile(FILE *geoms, std::atomic *geompos_in, char *meta line_detail++; continue; } else if (additional[A_DROP_SMALLEST_AS_NEEDED] || additional[A_COALESCE_SMALLEST_AS_NEEDED]) { - minextent_fraction = minextent_fraction * max_tile_features / totalsize * 0.75; - long long m = choose_minextent(extents, minextent_fraction); - if (m != minextent) { - minextent = m; - if (minextent > arg->minextent_out) { - arg->minextent_out = minextent; + minarea_fraction = minarea_fraction * max_tile_features / totalsize * 0.75; + long long m = choose_minarea(areas, minarea_fraction); + if (m != minarea) { + minarea = m; + if (minarea > arg->minarea_out) { + arg->minarea_out = minarea; arg->still_dropping = true; } if (!quiet) { - fprintf(stderr, "Going to try keeping the biggest %0.2f%% of the features to make it fit\n", minextent_fraction * 100.0); + fprintf(stderr, "Going to try keeping the biggest %0.2f%% of the features to make it fit\n", minarea_fraction * 100.0); } line_detail++; continue; @@ -2644,16 +2644,16 @@ long long write_tile(FILE *geoms, std::atomic *geompos_in, char *meta } line_detail++; } else if (additional[A_DROP_SMALLEST_AS_NEEDED] || additional[A_COALESCE_SMALLEST_AS_NEEDED]) { - minextent_fraction = minextent_fraction * max_tile_size / (kept_adjust * compressed.size()) * 0.75; - long long m = choose_minextent(extents, minextent_fraction); - if (m != minextent) { - minextent = m; - if (minextent > arg->minextent_out) { - arg->minextent_out = minextent; + minarea_fraction = minarea_fraction * max_tile_size / (kept_adjust * compressed.size()) * 0.75; + long long m = choose_minarea(areas, minarea_fraction); + if (m != minarea) { + minarea = m; + if (minarea > arg->minarea_out) { + arg->minarea_out = minarea; arg->still_dropping = true; } if (!quiet) { - fprintf(stderr, "Going to try keeping the biggest %0.2f%% of the features to make it fit\n", minextent_fraction * 100.0); + fprintf(stderr, "Going to try keeping the biggest %0.2f%% of the features to make it fit\n", minarea_fraction * 100.0); } line_detail++; continue; @@ -2751,7 +2751,7 @@ void *run_thread(void *vargs) { // fprintf(stderr, "%d/%u/%u\n", z, x, y); - long long len = write_tile(geom, &geompos, arg->metabase, arg->stringpool, z, x, y, z == arg->maxzoom ? arg->full_detail : arg->low_detail, arg->min_detail, arg->outdb, arg->outdir, arg->buffer, arg->fname, arg->geomfile, arg->minzoom, arg->maxzoom, arg->todo, arg->along, geompos, arg->gamma, arg->child_shards, arg->meta_off, arg->pool_off, arg->initial_x, arg->initial_y, arg->running, arg->simplification, arg->layermaps, arg->layer_unmaps, arg->tiling_seg, arg->pass, arg->passes, arg->mingap, arg->minextent, arg->fraction, arg->prefilter, arg->postfilter, arg->filter, arg, arg->strategy); + long long len = write_tile(geom, &geompos, arg->metabase, arg->stringpool, z, x, y, z == arg->maxzoom ? arg->full_detail : arg->low_detail, arg->min_detail, arg->outdb, arg->outdir, arg->buffer, arg->fname, arg->geomfile, arg->minzoom, arg->maxzoom, arg->todo, arg->along, geompos, arg->gamma, arg->child_shards, arg->meta_off, arg->pool_off, arg->initial_x, arg->initial_y, arg->running, arg->simplification, arg->layermaps, arg->layer_unmaps, arg->tiling_seg, arg->pass, arg->passes, arg->mingap, arg->minarea, arg->fraction, arg->prefilter, arg->postfilter, arg->filter, arg, arg->strategy); if (len < 0) { int *err = &arg->err; @@ -2954,7 +2954,7 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *metabase, char *stringpo double zoom_gamma = gamma; unsigned long long zoom_mingap = ((1LL << (32 - i)) / 256 * cluster_distance) * ((1LL << (32 - i)) / 256 * cluster_distance); - long long zoom_minextent = 0; + long long zoom_minarea = 0; double zoom_fraction = 1; size_t zoom_tile_size = 0; @@ -2981,8 +2981,8 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *metabase, char *stringpo args[thread].gamma_out = zoom_gamma; args[thread].mingap = zoom_mingap; args[thread].mingap_out = zoom_mingap; - args[thread].minextent = zoom_minextent; - args[thread].minextent_out = zoom_minextent; + args[thread].minarea = zoom_minarea; + args[thread].minarea_out = zoom_minarea; args[thread].fraction = zoom_fraction; args[thread].fraction_out = zoom_fraction; args[thread].tile_size_out = 0; @@ -3046,8 +3046,8 @@ int traverse_zooms(int *geomfd, off_t *geom_size, char *metabase, char *stringpo if (args[thread].mingap_out > zoom_mingap) { zoom_mingap = args[thread].mingap_out; } - if (args[thread].minextent_out > zoom_minextent) { - zoom_minextent = args[thread].minextent_out; + if (args[thread].minarea_out > zoom_minarea) { + zoom_minarea = args[thread].minarea_out; } if (args[thread].fraction_out < zoom_fraction) { zoom_fraction = args[thread].fraction_out;