mirror of
https://github.com/felt/tippecanoe.git
synced 2026-10-05 18:05:42 +02:00
Do less work when assigning bins by ID
This commit is contained in:
@@ -1810,13 +1810,78 @@ mvt_tile assign_to_bins(mvt_tile &features,
|
|||||||
std::set<std::string> exclude,
|
std::set<std::string> exclude,
|
||||||
std::vector<std::string> exclude_prefix,
|
std::vector<std::string> exclude_prefix,
|
||||||
int buffer, std::vector<clipbbox> const &clipbboxes) {
|
int buffer, std::vector<clipbbox> const &clipbboxes) {
|
||||||
std::vector<index_event> events;
|
|
||||||
key_pool key_pool;
|
|
||||||
|
|
||||||
if (bins.size() == 0) {
|
if (bins.size() == 0) {
|
||||||
return mvt_tile();
|
return mvt_tile();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mvt_layer outlayer;
|
||||||
|
outlayer.extent = bins[0].extent;
|
||||||
|
outlayer.version = 2;
|
||||||
|
outlayer.name = features.layers[0].name;
|
||||||
|
|
||||||
|
std::vector<std::vector<tile_feature>> outfeatures;
|
||||||
|
|
||||||
|
if (bin_by_id_list.size() > 0) {
|
||||||
|
std::map<unsigned long long, std::pair<size_t, size_t>> fid_to_feature;
|
||||||
|
for (size_t i = 0; i < features.layers.size(); i++) {
|
||||||
|
for (size_t j = 0; j < features.layers[i].features.size(); j++) {
|
||||||
|
if (features.layers[i].features[j].geometry.size() > 0) {
|
||||||
|
if (features.layers[i].features[j].has_id) {
|
||||||
|
fid_to_feature.emplace(features.layers[i].features[j].id, std::make_pair(i, j));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto &binlayer : bins) {
|
||||||
|
size_t seq = 0;
|
||||||
|
for (auto &bin : binlayer.features) {
|
||||||
|
{
|
||||||
|
tile_feature outfeature;
|
||||||
|
for (auto const &g : bin.geometry) {
|
||||||
|
outfeature.geom.emplace_back(g.op, g.x, g.y);
|
||||||
|
}
|
||||||
|
outfeature.t = bin.type;
|
||||||
|
outfeature.has_id = bin.has_id;
|
||||||
|
outfeature.id = bin.id;
|
||||||
|
outfeature.tags = bin.tags;
|
||||||
|
outfeature.layer = &binlayer;
|
||||||
|
outfeature.seq = seq++;
|
||||||
|
|
||||||
|
outfeatures.push_back({std::move(outfeature)});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t k = 0; k < bin.tags.size(); k += 2) {
|
||||||
|
if (binlayer.keys[bin.tags[k]] == bin_by_id_list) {
|
||||||
|
std::vector<size_t> ids = parse_ids_string(binlayer.values[bin.tags[k + 1]]);
|
||||||
|
for (auto &id : ids) {
|
||||||
|
auto f = fid_to_feature.find(id);
|
||||||
|
if (f != fid_to_feature.end()) {
|
||||||
|
mvt_feature &feature = features.layers[f->second.first].features[f->second.second];
|
||||||
|
if (feature.geometry.size() > 0) {
|
||||||
|
tile_feature outfeature;
|
||||||
|
for (auto const &g : feature.geometry) {
|
||||||
|
outfeature.geom.emplace_back(g.op, g.x, g.y);
|
||||||
|
}
|
||||||
|
feature.geometry.clear();
|
||||||
|
outfeature.t = feature.type;
|
||||||
|
outfeature.has_id = feature.has_id;
|
||||||
|
outfeature.id = feature.id;
|
||||||
|
outfeature.tags = feature.tags;
|
||||||
|
outfeature.layer = &features.layers[f->second.first];
|
||||||
|
outfeature.seq = f->second.second;
|
||||||
|
outfeatures.back().push_back(std::move(outfeature));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
std::vector<index_event> events;
|
||||||
|
|
||||||
// Index bins
|
// Index bins
|
||||||
for (size_t i = 0; i < bins.size(); i++) {
|
for (size_t i = 0; i < bins.size(); i++) {
|
||||||
for (size_t j = 0; j < bins[i].features.size(); j++) {
|
for (size_t j = 0; j < bins[i].features.size(); j++) {
|
||||||
@@ -1830,8 +1895,6 @@ mvt_tile assign_to_bins(mvt_tile &features,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::map<unsigned long long, std::pair<size_t, size_t>> fid_to_feature;
|
|
||||||
|
|
||||||
// Index points
|
// Index points
|
||||||
for (size_t i = 0; i < features.layers.size(); i++) {
|
for (size_t i = 0; i < features.layers.size(); i++) {
|
||||||
for (size_t j = 0; j < features.layers[i].features.size(); j++) {
|
for (size_t j = 0; j < features.layers[i].features.size(); j++) {
|
||||||
@@ -1839,10 +1902,6 @@ mvt_tile assign_to_bins(mvt_tile &features,
|
|||||||
unsigned long long start, end;
|
unsigned long long start, end;
|
||||||
|
|
||||||
if (features.layers[i].features[j].geometry.size() > 0) {
|
if (features.layers[i].features[j].geometry.size() > 0) {
|
||||||
if (features.layers[i].features[j].has_id) {
|
|
||||||
fid_to_feature.emplace(features.layers[i].features[j].id, std::make_pair(i, j));
|
|
||||||
}
|
|
||||||
|
|
||||||
get_bbox(features.layers[i].features[j].geometry, &xmin, &ymin, &xmax, &ymax, z, x, y, features.layers[i].detail());
|
get_bbox(features.layers[i].features[j].geometry, &xmin, &ymin, &xmax, &ymax, z, x, y, features.layers[i].detail());
|
||||||
get_quadkey_bounds(xmin, ymin, xmax, ymax, &start, &end);
|
get_quadkey_bounds(xmin, ymin, xmax, ymax, &start, &end);
|
||||||
events.emplace_back(start, index_event::CHECK, i, j, xmin, ymin, xmax, ymax);
|
events.emplace_back(start, index_event::CHECK, i, j, xmin, ymin, xmax, ymax);
|
||||||
@@ -1853,13 +1912,6 @@ mvt_tile assign_to_bins(mvt_tile &features,
|
|||||||
std::sort(events.begin(), events.end());
|
std::sort(events.begin(), events.end());
|
||||||
std::set<active_bin> active;
|
std::set<active_bin> active;
|
||||||
|
|
||||||
mvt_layer outlayer;
|
|
||||||
outlayer.extent = bins[0].extent;
|
|
||||||
outlayer.version = 2;
|
|
||||||
outlayer.name = features.layers[0].name;
|
|
||||||
|
|
||||||
std::vector<std::vector<tile_feature>> outfeatures;
|
|
||||||
|
|
||||||
for (auto &e : events) {
|
for (auto &e : events) {
|
||||||
if (e.kind == index_event::ENTER) {
|
if (e.kind == index_event::ENTER) {
|
||||||
active_bin a(e.layer, e.feature);
|
active_bin a(e.layer, e.feature);
|
||||||
@@ -1886,35 +1938,6 @@ mvt_tile assign_to_bins(mvt_tile &features,
|
|||||||
outfeatures.push_back({std::move(outfeature)});
|
outfeatures.push_back({std::move(outfeature)});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bin_by_id_list.size() > 0) {
|
|
||||||
for (size_t k = 0; k < bin.tags.size(); k += 2) {
|
|
||||||
if (bins[e.layer].keys[bin.tags[k]] == bin_by_id_list) {
|
|
||||||
std::vector<size_t> ids = parse_ids_string(bins[e.layer].values[bin.tags[k + 1]]);
|
|
||||||
for (auto &id : ids) {
|
|
||||||
auto f = fid_to_feature.find(id);
|
|
||||||
if (f != fid_to_feature.end()) {
|
|
||||||
mvt_feature &feature = features.layers[f->second.first].features[f->second.second];
|
|
||||||
if (feature.geometry.size() > 0) {
|
|
||||||
tile_feature outfeature;
|
|
||||||
for (auto const &g : feature.geometry) {
|
|
||||||
outfeature.geom.emplace_back(g.op, g.x, g.y);
|
|
||||||
}
|
|
||||||
feature.geometry.clear();
|
|
||||||
outfeature.t = feature.type;
|
|
||||||
outfeature.has_id = feature.has_id;
|
|
||||||
outfeature.id = feature.id;
|
|
||||||
outfeature.tags = feature.tags;
|
|
||||||
outfeature.layer = &features.layers[e.layer];
|
|
||||||
outfeature.seq = e.feature;
|
|
||||||
outfeatures.back().push_back(std::move(outfeature));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
active.insert(std::move(a));
|
active.insert(std::move(a));
|
||||||
} else if (e.kind == index_event::CHECK) {
|
} else if (e.kind == index_event::CHECK) {
|
||||||
if (bin_by_id_list.size() > 0) {
|
if (bin_by_id_list.size() > 0) {
|
||||||
@@ -1967,7 +1990,9 @@ mvt_tile assign_to_bins(mvt_tile &features,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
key_pool key_pool;
|
||||||
for (size_t i = 0; i < outfeatures.size(); i++) {
|
for (size_t i = 0; i < outfeatures.size(); i++) {
|
||||||
if (outfeatures[i].size() > 1) {
|
if (outfeatures[i].size() > 1) {
|
||||||
if (feature_out(outfeatures[i], outlayer,
|
if (feature_out(outfeatures[i], outlayer,
|
||||||
|
|||||||
Reference in New Issue
Block a user