mirror of
https://github.com/mapbox/tippecanoe.git
synced 2025-02-23 10:30:16 +00:00
Provide layer names to postfilter and read layer names back in
This commit is contained in:
parent
71ac6596af
commit
cf6a2d3a67
60
plugin.cpp
60
plugin.cpp
@ -34,10 +34,11 @@ extern "C" {
|
|||||||
|
|
||||||
struct writer_arg {
|
struct writer_arg {
|
||||||
int write_to;
|
int write_to;
|
||||||
mvt_layer *layer;
|
std::vector<mvt_layer> *layers;
|
||||||
unsigned z;
|
unsigned z;
|
||||||
unsigned x;
|
unsigned x;
|
||||||
unsigned y;
|
unsigned y;
|
||||||
|
int extent;
|
||||||
};
|
};
|
||||||
|
|
||||||
void *run_writer(void *a) {
|
void *run_writer(void *a) {
|
||||||
@ -49,7 +50,9 @@ void *run_writer(void *a) {
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
layer_to_geojson(fp, *(wa->layer), wa->z, wa->x, wa->y, false, false);
|
for (size_t i = 0; i < wa->layers->size(); i++) {
|
||||||
|
layer_to_geojson(fp, (*(wa->layers))[i], wa->z, wa->x, wa->y, false, true);
|
||||||
|
}
|
||||||
|
|
||||||
if (fclose(fp) != 0) {
|
if (fclose(fp) != 0) {
|
||||||
if (errno == EPIPE) {
|
if (errno == EPIPE) {
|
||||||
@ -78,13 +81,8 @@ static std::vector<mvt_geometry> to_feature(drawvec &geom) {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
mvt_layer parse_layer(int fd, int z, unsigned x, unsigned y, mvt_layer const &olayer, std::vector<std::map<std::string, layermap_entry>> *layermaps, size_t tiling_seg, std::vector<std::vector<std::string>> *layer_unmaps) {
|
std::vector<mvt_layer> parse_layers(int fd, int z, unsigned x, unsigned y, std::vector<std::map<std::string, layermap_entry>> *layermaps, size_t tiling_seg, std::vector<std::vector<std::string>> *layer_unmaps, int extent) {
|
||||||
mvt_layer ret;
|
std::map<std::string, mvt_layer> ret;
|
||||||
ret.name = olayer.name;
|
|
||||||
ret.version = olayer.version;
|
|
||||||
ret.extent = olayer.extent;
|
|
||||||
|
|
||||||
std::string layername = olayer.name;
|
|
||||||
|
|
||||||
FILE *f = fdopen(fd, "r");
|
FILE *f = fdopen(fd, "r");
|
||||||
if (f == NULL) {
|
if (f == NULL) {
|
||||||
@ -164,6 +162,26 @@ mvt_layer parse_layer(int fd, int z, unsigned x, unsigned y, mvt_layer const &ol
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string layername = "unknown";
|
||||||
|
json_object *tippecanoe = json_hash_get(j, "tippecanoe");
|
||||||
|
json_object *layer = NULL;
|
||||||
|
if (tippecanoe != NULL) {
|
||||||
|
layer = json_hash_get(tippecanoe, "layer");
|
||||||
|
if (layer != NULL && layer->type == JSON_STRING) {
|
||||||
|
layername = std::string(layer->string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret.count(layername) == 0) {
|
||||||
|
mvt_layer l;
|
||||||
|
l.name = layername;
|
||||||
|
l.version = 2;
|
||||||
|
l.extent = extent;
|
||||||
|
|
||||||
|
ret.insert(std::pair<std::string, mvt_layer>(layername, l));
|
||||||
|
}
|
||||||
|
auto l = ret.find(layername);
|
||||||
|
|
||||||
drawvec dv;
|
drawvec dv;
|
||||||
parse_geometry(t, coordinates, dv, VT_MOVETO, "Filter output", jp->line, j);
|
parse_geometry(t, coordinates, dv, VT_MOVETO, "Filter output", jp->line, j);
|
||||||
if (mb_geometry[t] == VT_POLYGON) {
|
if (mb_geometry[t] == VT_POLYGON) {
|
||||||
@ -173,8 +191,8 @@ mvt_layer parse_layer(int fd, int z, unsigned x, unsigned y, mvt_layer const &ol
|
|||||||
// Scale and offset geometry from global to tile
|
// Scale and offset geometry from global to tile
|
||||||
for (size_t i = 0; i < dv.size(); i++) {
|
for (size_t i = 0; i < dv.size(); i++) {
|
||||||
long long scale = 1LL << (32 - z);
|
long long scale = 1LL << (32 - z);
|
||||||
dv[i].x = std::round((dv[i].x - scale * x) * olayer.extent / (double) scale);
|
dv[i].x = std::round((dv[i].x - scale * x) * extent / (double) scale);
|
||||||
dv[i].y = std::round((dv[i].y - scale * y) * olayer.extent / (double) scale);
|
dv[i].y = std::round((dv[i].y - scale * y) * extent / (double) scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mb_geometry[t] == VT_POLYGON) {
|
if (mb_geometry[t] == VT_POLYGON) {
|
||||||
@ -208,7 +226,7 @@ mvt_layer parse_layer(int fd, int z, unsigned x, unsigned y, mvt_layer const &ol
|
|||||||
stringify_value(properties->values[i], tp, s, "Filter output", jp->line, j);
|
stringify_value(properties->values[i], tp, s, "Filter output", jp->line, j);
|
||||||
if (tp >= 0) {
|
if (tp >= 0) {
|
||||||
mvt_value v = stringified_to_mvt_value(tp, s.c_str());
|
mvt_value v = stringified_to_mvt_value(tp, s.c_str());
|
||||||
ret.tag(feature, std::string(properties->keys[i]->string), v);
|
l->second.tag(feature, std::string(properties->keys[i]->string), v);
|
||||||
|
|
||||||
if (layermap.count(layername) == 0) {
|
if (layermap.count(layername) == 0) {
|
||||||
layermap_entry lme = layermap_entry(layermap.size());
|
layermap_entry lme = layermap_entry(layermap.size());
|
||||||
@ -238,7 +256,7 @@ mvt_layer parse_layer(int fd, int z, unsigned x, unsigned y, mvt_layer const &ol
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret.features.push_back(feature);
|
l->second.features.push_back(feature);
|
||||||
}
|
}
|
||||||
|
|
||||||
json_free(j);
|
json_free(j);
|
||||||
@ -249,7 +267,12 @@ mvt_layer parse_layer(int fd, int z, unsigned x, unsigned y, mvt_layer const &ol
|
|||||||
perror("fclose postfilter output");
|
perror("fclose postfilter output");
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
return ret;
|
|
||||||
|
std::vector<mvt_layer> final;
|
||||||
|
for (auto a : ret) {
|
||||||
|
final.push_back(a.second);
|
||||||
|
}
|
||||||
|
return final;
|
||||||
}
|
}
|
||||||
|
|
||||||
serial_feature parse_feature(json_pull *jp, int z, unsigned x, unsigned y, std::vector<std::map<std::string, layermap_entry>> *layermaps, size_t tiling_seg, std::vector<std::vector<std::string>> *layer_unmaps) {
|
serial_feature parse_feature(json_pull *jp, int z, unsigned x, unsigned y, std::vector<std::map<std::string, layermap_entry>> *layermaps, size_t tiling_seg, std::vector<std::vector<std::string>> *layer_unmaps) {
|
||||||
@ -520,17 +543,18 @@ void setup_filter(const char *filter, int *write_to, int *read_from, pid_t *pid,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mvt_layer filter_layer(const char *filter, mvt_layer &layer, unsigned z, unsigned x, unsigned y, std::vector<std::map<std::string, layermap_entry>> *layermaps, size_t tiling_seg, std::vector<std::vector<std::string>> *layer_unmaps) {
|
std::vector<mvt_layer> filter_layers(const char *filter, std::vector<mvt_layer> &layers, unsigned z, unsigned x, unsigned y, std::vector<std::map<std::string, layermap_entry>> *layermaps, size_t tiling_seg, std::vector<std::vector<std::string>> *layer_unmaps, int extent) {
|
||||||
int write_to, read_from;
|
int write_to, read_from;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
setup_filter(filter, &write_to, &read_from, &pid, z, x, y);
|
setup_filter(filter, &write_to, &read_from, &pid, z, x, y);
|
||||||
|
|
||||||
writer_arg wa;
|
writer_arg wa;
|
||||||
wa.write_to = write_to;
|
wa.write_to = write_to;
|
||||||
wa.layer = &layer;
|
wa.layers = &layers;
|
||||||
wa.z = z;
|
wa.z = z;
|
||||||
wa.x = x;
|
wa.x = x;
|
||||||
wa.y = y;
|
wa.y = y;
|
||||||
|
wa.extent = extent;
|
||||||
|
|
||||||
pthread_t writer;
|
pthread_t writer;
|
||||||
if (pthread_create(&writer, NULL, run_writer, &wa) != 0) {
|
if (pthread_create(&writer, NULL, run_writer, &wa) != 0) {
|
||||||
@ -538,7 +562,7 @@ mvt_layer filter_layer(const char *filter, mvt_layer &layer, unsigned z, unsigne
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
layer = parse_layer(read_from, z, x, y, layer, layermaps, tiling_seg, layer_unmaps);
|
layers = parse_layers(read_from, z, x, y, layermaps, tiling_seg, layer_unmaps, extent);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
int stat_loc;
|
int stat_loc;
|
||||||
@ -557,5 +581,5 @@ mvt_layer filter_layer(const char *filter, mvt_layer &layer, unsigned z, unsigne
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return layer;
|
return layers;
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
mvt_layer filter_layer(const char *filter, mvt_layer &layer, unsigned z, unsigned x, unsigned y, std::vector<std::map<std::string, layermap_entry>> *layermaps, size_t tiling_seg, std::vector<std::vector<std::string>> *layer_unmaps);
|
std::vector<mvt_layer> filter_layers(const char *filter, std::vector<mvt_layer> &layer, unsigned z, unsigned x, unsigned y, std::vector<std::map<std::string, layermap_entry>> *layermaps, size_t tiling_seg, std::vector<std::vector<std::string>> *layer_unmaps, int extent);
|
||||||
void setup_filter(const char *filter, int *write_to, int *read_from, pid_t *pid, unsigned z, unsigned x, unsigned y);
|
void setup_filter(const char *filter, int *write_to, int *read_from, pid_t *pid, unsigned z, unsigned x, unsigned y);
|
||||||
serial_feature parse_feature(json_pull *jp, int z, unsigned x, unsigned y, std::vector<std::map<std::string, layermap_entry>> *layermaps, size_t tiling_seg, std::vector<std::vector<std::string>> *layer_unmaps);
|
serial_feature parse_feature(json_pull *jp, int z, unsigned x, unsigned y, std::vector<std::map<std::string, layermap_entry>> *layermaps, size_t tiling_seg, std::vector<std::vector<std::string>> *layer_unmaps);
|
||||||
|
8
tile.cpp
8
tile.cpp
@ -1833,15 +1833,15 @@ long long write_tile(FILE *geoms, long long *geompos_in, char *metabase, char *s
|
|||||||
layer.features.push_back(feature);
|
layer.features.push_back(feature);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (postfilter != NULL) {
|
|
||||||
layer = filter_layer(postfilter, layer, z, tx, ty, layermaps, tiling_seg, layer_unmaps);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (layer.features.size() > 0) {
|
if (layer.features.size() > 0) {
|
||||||
tile.layers.push_back(layer);
|
tile.layers.push_back(layer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (postfilter != NULL) {
|
||||||
|
tile.layers = filter_layers(postfilter, tile.layers, z, tx, ty, layermaps, tiling_seg, layer_unmaps, 1 << line_detail);
|
||||||
|
}
|
||||||
|
|
||||||
if (z == 0 && unclipped_features < original_features / 2) {
|
if (z == 0 && unclipped_features < original_features / 2) {
|
||||||
fprintf(stderr, "\n\nMore than half the features were clipped away at zoom level 0.\n");
|
fprintf(stderr, "\n\nMore than half the features were clipped away at zoom level 0.\n");
|
||||||
fprintf(stderr, "Is your data in the wrong projection? It should be in WGS84/EPSG:4326.\n");
|
fprintf(stderr, "Is your data in the wrong projection? It should be in WGS84/EPSG:4326.\n");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user