mirror of
https://github.com/mapbox/tippecanoe.git
synced 2025-02-02 01:08:14 +00:00
Parse JSON coming back in and turn it back into features
This commit is contained in:
parent
c82e3e98c3
commit
679189e5a2
73
plugin.cpp
73
plugin.cpp
@ -46,8 +46,22 @@ void *run_writer(void *a) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
mvt_layer parse_layer(int fd, unsigned z, unsigned x, unsigned y) {
|
// XXX deduplicate
|
||||||
|
static std::vector<mvt_geometry> to_feature(drawvec &geom) {
|
||||||
|
std::vector<mvt_geometry> out;
|
||||||
|
|
||||||
|
for (size_t i = 0; i < geom.size(); i++) {
|
||||||
|
out.push_back(mvt_geometry(geom[i].op, geom[i].x, geom[i].y));
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
mvt_layer parse_layer(int fd, unsigned z, unsigned x, unsigned y, mvt_layer const &olayer) {
|
||||||
mvt_layer ret;
|
mvt_layer ret;
|
||||||
|
ret.name = olayer.name;
|
||||||
|
ret.version = olayer.version;
|
||||||
|
ret.extent = olayer.extent;
|
||||||
|
|
||||||
FILE *f = fdopen(fd, "r");
|
FILE *f = fdopen(fd, "r");
|
||||||
if (f == NULL) {
|
if (f == NULL) {
|
||||||
@ -127,6 +141,61 @@ mvt_layer parse_layer(int fd, unsigned z, unsigned x, unsigned y) {
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
drawvec dv;
|
||||||
|
parse_geometry(t, coordinates, dv, VT_MOVETO, "Filter output", jp->line, j);
|
||||||
|
if (mb_geometry[t] == VT_POLYGON) {
|
||||||
|
dv = fix_polygon(dv);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scale and offset geometry from global to tile
|
||||||
|
for (size_t i = 0; i < dv.size(); i++) {
|
||||||
|
long long scale = 1LL << (32 - z);
|
||||||
|
dv[i].x = (dv[i].x - scale * x) * olayer.extent / scale;
|
||||||
|
dv[i].y = (dv[i].y - scale * y) * olayer.extent / scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mb_geometry[t] == VT_POLYGON) {
|
||||||
|
dv = clean_or_clip_poly(dv, 0, 0, 0, false);
|
||||||
|
if (dv.size() < 3) {
|
||||||
|
dv.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dv = remove_noop(dv, mb_geometry[t], 0);
|
||||||
|
if (mb_geometry[t] == VT_POLYGON) {
|
||||||
|
dv = close_poly(dv);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dv.size() > 0) {
|
||||||
|
mvt_feature feature;
|
||||||
|
feature.type = mb_geometry[t];
|
||||||
|
feature.geometry = to_feature(dv);
|
||||||
|
|
||||||
|
json_object *id = json_hash_get(j, "id");
|
||||||
|
if (id != NULL) {
|
||||||
|
feature.id = atoll(id->string);
|
||||||
|
feature.has_id = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < properties->length; i++) {
|
||||||
|
mvt_value v;
|
||||||
|
|
||||||
|
// XXX reconcile with JSON property parsing
|
||||||
|
if (properties->values[i]->type == JSON_STRING) {
|
||||||
|
v.type = mvt_string;
|
||||||
|
v.string_value = std::string(properties->values[i]->string);
|
||||||
|
} else if (properties->values[i]->type == JSON_NUMBER) {
|
||||||
|
v.type = mvt_double;
|
||||||
|
v.numeric_value.double_value = atof(properties->values[i]->string);
|
||||||
|
} else {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret.tag(feature, std::string(properties->keys[i]->string), v);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret.features.push_back(feature);
|
||||||
|
}
|
||||||
|
|
||||||
json_free(j);
|
json_free(j);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -207,7 +276,7 @@ mvt_layer filter_layer(const char *filter, mvt_layer &layer, unsigned z, unsigne
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
layer = parse_layer(pipe_filtered[0], z, x, y);
|
layer = parse_layer(pipe_filtered[0], z, x, y, layer);
|
||||||
|
|
||||||
int stat_loc;
|
int stat_loc;
|
||||||
if (waitpid(pid, &stat_loc, 0) < 0) {
|
if (waitpid(pid, &stat_loc, 0) < 0) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user