mirror of
https://github.com/mapbox/tippecanoe.git
synced 2025-05-09 20:32:54 +00:00
Preserve per-node attributes through feature filter pipelines
They now stay in array form until just before printing, rather than being decoded into strings as part of tile deserialization
This commit is contained in:
parent
56bf3f4218
commit
4ce81bd587
31
mvt.cpp
31
mvt.cpp
@ -432,40 +432,11 @@ bool mvt_tile::decode(std::string &message, bool &was_compressed) {
|
|||||||
|
|
||||||
for (size_t i = 0; i < layer.features.size(); i++) {
|
for (size_t i = 0; i < layer.features.size(); i++) {
|
||||||
std::vector<mvt_geometry> &geom = layer.features[i].geometry;
|
std::vector<mvt_geometry> &geom = layer.features[i].geometry;
|
||||||
std::vector<unsigned long> &attr = layer.features[i].node_attributes;
|
std::vector<int> &elevations = layer.features[i].elevations;
|
||||||
|
|
||||||
for (size_t t = 0; t + 1 < attr.size(); t++) {
|
|
||||||
if (attr[t] >= layer.keys.size()) {
|
|
||||||
fprintf(stderr, "Out of bounds attribute reference %lu into %zu\n", attr[t], layer.keys.size());
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string key = layer.keys[attr[t]];
|
|
||||||
|
|
||||||
t++;
|
|
||||||
mvt_value const &val = layer.decode_property(attr, t);
|
|
||||||
|
|
||||||
if (val.type != mvt_list) {
|
|
||||||
fprintf(stderr, "Expected node attribute to be a list\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (val.list_value.size() != geom.size()) {
|
|
||||||
fprintf(stderr, "Node attribute list size doesn't match geometry size\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t g = 0; g < geom.size(); g++) {
|
|
||||||
geom[g].attribute = std::string("{\"") + quote(key) + "\":" + val.list_value[g].toString() + "}";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
attr.clear();
|
|
||||||
|
|
||||||
long current_elevation = elevation_scaling.offset;
|
long current_elevation = elevation_scaling.offset;
|
||||||
size_t off = 0;
|
size_t off = 0;
|
||||||
|
|
||||||
std::vector<int> &elevations = layer.features[i].elevations;
|
|
||||||
if (elevations.size() != 0) {
|
if (elevations.size() != 0) {
|
||||||
for (size_t j = 0; j < geom.size(); j++) {
|
for (size_t j = 0; j < geom.size(); j++) {
|
||||||
if (geom[j].op == mvt_moveto || geom[j].op == mvt_lineto) {
|
if (geom[j].op == mvt_moveto || geom[j].op == mvt_lineto) {
|
||||||
|
1
mvt.hpp
1
mvt.hpp
@ -31,7 +31,6 @@ struct mvt_geometry {
|
|||||||
long long y = 0;
|
long long y = 0;
|
||||||
int /* mvt_operation */ op = 0;
|
int /* mvt_operation */ op = 0;
|
||||||
std::vector<double> elevations;
|
std::vector<double> elevations;
|
||||||
std::string attribute;
|
|
||||||
|
|
||||||
mvt_geometry(int op, long long x, long long y);
|
mvt_geometry(int op, long long x, long long y);
|
||||||
mvt_geometry(int op, long long x, long long y, std::vector<double> elevation);
|
mvt_geometry(int op, long long x, long long y, std::vector<double> elevation);
|
||||||
|
@ -182,7 +182,7 @@ std::vector<mvt_layer> parse_layers(int fd, int z, unsigned x, unsigned y, std::
|
|||||||
parse_geometry(t, coordinates, dv, VT_MOVETO, "Filter output", jp->line, j, false);
|
parse_geometry(t, coordinates, dv, VT_MOVETO, "Filter output", jp->line, j, false);
|
||||||
if (attributes != NULL) {
|
if (attributes != NULL) {
|
||||||
drawvec dv2;
|
drawvec dv2;
|
||||||
parse_geometry(t, attributes, dv, VT_MOVETO, "Filter output", jp->line, j, true);
|
parse_geometry(t, attributes, dv2, VT_MOVETO, "Filter output", jp->line, j, true);
|
||||||
merge_node_attributes(dv, dv2);
|
merge_node_attributes(dv, dv2);
|
||||||
}
|
}
|
||||||
if (mb_geometry[t] == VT_POLYGON) {
|
if (mb_geometry[t] == VT_POLYGON) {
|
||||||
@ -385,7 +385,7 @@ serial_feature parse_feature(json_pull *jp, int z, unsigned x, unsigned y, std::
|
|||||||
parse_geometry(t, coordinates, dv, VT_MOVETO, "Filter output", jp->line, j, false);
|
parse_geometry(t, coordinates, dv, VT_MOVETO, "Filter output", jp->line, j, false);
|
||||||
if (attributes != NULL) {
|
if (attributes != NULL) {
|
||||||
drawvec dv2;
|
drawvec dv2;
|
||||||
parse_geometry(t, attributes, dv, VT_MOVETO, "Filter output", jp->line, j, true);
|
parse_geometry(t, attributes, dv2, VT_MOVETO, "Filter output", jp->line, j, true);
|
||||||
merge_node_attributes(dv, dv2);
|
merge_node_attributes(dv, dv2);
|
||||||
}
|
}
|
||||||
if (mb_geometry[t] == VT_POLYGON) {
|
if (mb_geometry[t] == VT_POLYGON) {
|
||||||
|
@ -132,13 +132,13 @@ void parse_geometry(int t, json_object *j, drawvec &out, int op, const char *fna
|
|||||||
|
|
||||||
void merge_node_attributes(drawvec &geom, drawvec &attributes) {
|
void merge_node_attributes(drawvec &geom, drawvec &attributes) {
|
||||||
if (attributes.size() != geom.size()) {
|
if (attributes.size() != geom.size()) {
|
||||||
fprintf(stderr, "Geometry attributes don't match coordinates\n");
|
fprintf(stderr, "Geometry attributes don't match coordinates: %zu attributes for %zu geometries\n", attributes.size(), geom.size());
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < attributes.size(); i++) {
|
for (size_t i = 0; i < attributes.size(); i++) {
|
||||||
if (geom[i].op != attributes[i].op) {
|
if (geom[i].op != attributes[i].op) {
|
||||||
fprintf(stderr, "Geometry attributes don't match coordinates\n");
|
fprintf(stderr, "Geometry attributes don't match coordinates: op %d vs %d\n", geom[i].op, attributes[i].op);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,25 +12,25 @@
|
|||||||
}, "features": [
|
}, "features": [
|
||||||
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [
|
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [
|
||||||
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
|
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -122.255859, 37.718590, 0 ], [ -122.431641, 37.788081, 0 ], [ -122.431641, 37.439974, 8192 ], [ -122.255859, 37.370157, 8192 ], [ -120.146484, 36.949892, 8192 ], [ -116.982422, 36.879621, 8192 ], [ -116.279297, 36.385913, 8192 ], [ -116.103516, 36.385913, 8192 ], [ -115.839844, 36.102376, 8192 ], [ -115.224609, 36.102376, 0 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -122.255859, 37.718590, 0 ], [ -122.431641, 37.788081, 0 ], [ -122.431641, 37.439974, 8192 ], [ -122.255859, 37.370157, 8192 ], [ -120.146484, 36.949892, 8192 ], [ -116.982422, 36.879621, 8192 ], [ -116.279297, 36.385913, 8192 ], [ -116.103516, 36.385913, 8192 ], [ -115.839844, 36.102376, 8192 ], [ -115.224609, 36.102376, 0 ] ], "attributes": [ {"time":"2015-06-23T22:02:16Z"}, {"time":"2015-06-23T22:30:35Z"}, {"time":"2015-06-23T22:34:00Z"}, {"time":"2015-06-23T22:35:21Z"}, {"time":"2015-06-23T22:49:15Z"}, {"time":"2015-06-23T23:09:16Z"}, {"time":"2015-06-23T23:15:42Z"}, {"time":"2015-06-23T23:16:40Z"}, {"time":"2015-06-23T23:20:11Z"}, {"time":"2015-06-23T23:27:27Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -115.224609, 36.102376, 0 ], [ -115.312500, 36.244273, 0 ], [ -113.291016, 36.315125, 8192 ], [ -110.917969, 37.230328, 8192 ], [ -108.193359, 37.718590, 16384 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -115.224609, 36.102376, 0 ], [ -115.312500, 36.244273, 0 ], [ -113.291016, 36.315125, 8192 ], [ -110.917969, 37.230328, 8192 ], [ -108.193359, 37.718590, 16384 ] ], "attributes": [ {"time":"2015-06-24T01:14:16Z"}, {"time":"2015-06-24T01:53:02Z"}, {"time":"2015-06-24T02:06:33Z"}, {"time":"2015-06-24T02:22:26Z"}, {"time":"2015-06-24T02:38:46Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -107.841797, 37.788081, 16384 ], [ -107.138672, 37.926868, 16384 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -107.841797, 37.788081, 16384 ], [ -107.138672, 37.926868, 16384 ] ], "attributes": [ {"time":"2015-06-24T02:41:22Z"}, {"time":"2015-06-24T02:45:17Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -107.050781, 37.926868, 16384 ], [ -105.996094, 38.065392, 16384 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -107.050781, 37.926868, 16384 ], [ -105.996094, 38.065392, 16384 ] ], "attributes": [ {"time":"2015-06-24T02:45:58Z"}, {"time":"2015-06-24T02:52:16Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -105.732422, 38.134557, 16384 ], [ -105.644531, 38.134557, 16384 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -105.732422, 38.134557, 16384 ], [ -105.644531, 38.134557, 16384 ] ], "attributes": [ {"time":"2015-06-24T02:54:01Z"}, {"time":"2015-06-24T02:54:26Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -105.380859, 38.203655, 0 ], [ -103.974609, 38.134557, 16384 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -105.380859, 38.203655, 0 ], [ -103.974609, 38.134557, 16384 ] ], "attributes": [ {"time":"2015-06-24T02:56:22Z"}, {"time":"2015-06-24T03:04:33Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -103.886719, 38.134557, 16384 ], [ -102.568359, 38.134557, 16384 ], [ -101.601562, 38.341656, 16384 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -103.886719, 38.134557, 16384 ], [ -102.568359, 38.134557, 16384 ], [ -101.601562, 38.341656, 16384 ] ], "attributes": [ {"time":"2015-06-24T03:05:09Z"}, {"time":"2015-06-24T03:13:01Z"}, {"time":"2015-06-24T03:18:59Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -101.425781, 38.341656, 16384 ], [ -100.634766, 38.548165, 16384 ], [ -97.207031, 39.027719, 16384 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -101.425781, 38.341656, 16384 ], [ -100.634766, 38.548165, 16384 ], [ -97.207031, 39.027719, 16384 ] ], "attributes": [ {"time":"2015-06-24T03:20:11Z"}, {"time":"2015-06-24T03:25:26Z"}, {"time":"2015-06-24T03:45:35Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -96.328125, 39.164141, 16384 ], [ -90.439453, 39.842286, 16384 ], [ -86.923828, 39.909736, 8192 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -96.328125, 39.164141, 16384 ], [ -90.439453, 39.842286, 16384 ], [ -86.923828, 39.909736, 8192 ] ], "attributes": [ {"time":"2015-06-24T03:51:05Z"}, {"time":"2015-06-24T04:25:18Z"}, {"time":"2015-06-24T04:45:15Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -86.923828, 39.909736, 0 ], [ -86.572266, 39.639538, 0 ], [ -86.308594, 39.774769, 0 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -86.923828, 39.909736, 0 ], [ -86.572266, 39.639538, 0 ], [ -86.308594, 39.774769, 0 ] ], "attributes": [ {"time":"2015-06-24T04:45:30Z"}, {"time":"2015-06-24T04:49:24Z"}, {"time":"2015-06-24T04:55:29Z"} ] } }
|
||||||
] }
|
] }
|
||||||
] }
|
] }
|
||||||
] }
|
] }
|
||||||
|
@ -12,25 +12,25 @@
|
|||||||
}, "features": [
|
}, "features": [
|
||||||
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [
|
{ "type": "FeatureCollection", "properties": { "zoom": 0, "x": 0, "y": 0 }, "features": [
|
||||||
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
|
{ "type": "FeatureCollection", "properties": { "layer": "in", "version": 2, "extent": 4096 }, "features": [
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -122.255859, 37.718590, 0 ], [ -122.431641, 37.788081, 0 ], [ -122.431641, 37.439974, 8192 ], [ -122.255859, 37.370157, 8192 ], [ -120.146484, 36.949892, 8192 ], [ -116.982422, 36.879621, 8192 ], [ -116.279297, 36.385913, 8192 ], [ -116.103516, 36.385913, 8192 ], [ -115.839844, 36.102376, 8192 ], [ -115.224609, 36.102376, 0 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -122.255859, 37.718590, 0 ], [ -122.431641, 37.788081, 0 ], [ -122.431641, 37.439974, 8192 ], [ -122.255859, 37.370157, 8192 ], [ -120.146484, 36.949892, 8192 ], [ -116.982422, 36.879621, 8192 ], [ -116.279297, 36.385913, 8192 ], [ -116.103516, 36.385913, 8192 ], [ -115.839844, 36.102376, 8192 ], [ -115.224609, 36.102376, 0 ] ], "attributes": [ {"time":"2015-06-23T22:02:16Z"}, {"time":"2015-06-23T22:30:35Z"}, {"time":"2015-06-23T22:34:00Z"}, {"time":"2015-06-23T22:35:21Z"}, {"time":"2015-06-23T22:49:15Z"}, {"time":"2015-06-23T23:09:16Z"}, {"time":"2015-06-23T23:15:42Z"}, {"time":"2015-06-23T23:16:40Z"}, {"time":"2015-06-23T23:20:11Z"}, {"time":"2015-06-23T23:27:27Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -115.224609, 36.102376, 0 ], [ -115.312500, 36.244273, 0 ], [ -113.291016, 36.315125, 8192 ], [ -110.917969, 37.230328, 8192 ], [ -108.193359, 37.718590, 16384 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -115.224609, 36.102376, 0 ], [ -115.312500, 36.244273, 0 ], [ -113.291016, 36.315125, 8192 ], [ -110.917969, 37.230328, 8192 ], [ -108.193359, 37.718590, 16384 ] ], "attributes": [ {"time":"2015-06-24T01:14:16Z"}, {"time":"2015-06-24T01:53:02Z"}, {"time":"2015-06-24T02:06:33Z"}, {"time":"2015-06-24T02:22:26Z"}, {"time":"2015-06-24T02:38:46Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -107.841797, 37.788081, 16384 ], [ -107.138672, 37.926868, 16384 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -107.841797, 37.788081, 16384 ], [ -107.138672, 37.926868, 16384 ] ], "attributes": [ {"time":"2015-06-24T02:41:22Z"}, {"time":"2015-06-24T02:45:17Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -107.050781, 37.926868, 16384 ], [ -105.996094, 38.065392, 16384 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -107.050781, 37.926868, 16384 ], [ -105.996094, 38.065392, 16384 ] ], "attributes": [ {"time":"2015-06-24T02:45:58Z"}, {"time":"2015-06-24T02:52:16Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -105.732422, 38.134557, 16384 ], [ -105.644531, 38.134557, 16384 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -105.732422, 38.134557, 16384 ], [ -105.644531, 38.134557, 16384 ] ], "attributes": [ {"time":"2015-06-24T02:54:01Z"}, {"time":"2015-06-24T02:54:26Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -105.380859, 38.203655, 0 ], [ -103.974609, 38.134557, 16384 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -105.380859, 38.203655, 0 ], [ -103.974609, 38.134557, 16384 ] ], "attributes": [ {"time":"2015-06-24T02:56:22Z"}, {"time":"2015-06-24T03:04:33Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -103.886719, 38.134557, 16384 ], [ -102.568359, 38.134557, 16384 ], [ -101.601562, 38.341656, 16384 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -103.886719, 38.134557, 16384 ], [ -102.568359, 38.134557, 16384 ], [ -101.601562, 38.341656, 16384 ] ], "attributes": [ {"time":"2015-06-24T03:05:09Z"}, {"time":"2015-06-24T03:13:01Z"}, {"time":"2015-06-24T03:18:59Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -101.425781, 38.341656, 16384 ], [ -100.634766, 38.548165, 16384 ], [ -97.207031, 39.027719, 16384 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -101.425781, 38.341656, 16384 ], [ -100.634766, 38.548165, 16384 ], [ -97.207031, 39.027719, 16384 ] ], "attributes": [ {"time":"2015-06-24T03:20:11Z"}, {"time":"2015-06-24T03:25:26Z"}, {"time":"2015-06-24T03:45:35Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -96.328125, 39.164141, 16384 ], [ -90.439453, 39.842286, 16384 ], [ -86.923828, 39.909736, 8192 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -96.328125, 39.164141, 16384 ], [ -90.439453, 39.842286, 16384 ], [ -86.923828, 39.909736, 8192 ] ], "attributes": [ {"time":"2015-06-24T03:51:05Z"}, {"time":"2015-06-24T04:25:18Z"}, {"time":"2015-06-24T04:45:15Z"} ] } }
|
||||||
,
|
,
|
||||||
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -86.923828, 39.909736, 0 ], [ -86.572266, 39.639538, 0 ], [ -86.308594, 39.774769, 0 ] ] } }
|
{ "type": "Feature", "properties": { }, "geometry": { "type": "LineString", "coordinates": [ [ -86.923828, 39.909736, 0 ], [ -86.572266, 39.639538, 0 ], [ -86.308594, 39.774769, 0 ] ], "attributes": [ {"time":"2015-06-24T04:45:30Z"}, {"time":"2015-06-24T04:49:24Z"}, {"time":"2015-06-24T04:55:29Z"} ] } }
|
||||||
] }
|
] }
|
||||||
] }
|
] }
|
||||||
] }
|
] }
|
||||||
|
@ -291,8 +291,10 @@ void print_val(mvt_feature const &feature, mvt_layer const &layer, mvt_value con
|
|||||||
state.json_write_stringified(s);
|
state.json_write_stringified(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void quote(std::string &buf, std::string const &s) {
|
static std::string quote(std::string const &s) {
|
||||||
|
std::string buf;
|
||||||
buf.push_back('"');
|
buf.push_back('"');
|
||||||
|
|
||||||
for (size_t i = 0; i < s.size(); i++) {
|
for (size_t i = 0; i < s.size(); i++) {
|
||||||
unsigned char ch = s[i];
|
unsigned char ch = s[i];
|
||||||
|
|
||||||
@ -307,12 +309,14 @@ static void quote(std::string &buf, std::string const &s) {
|
|||||||
buf.push_back(ch);
|
buf.push_back(ch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buf.push_back('"');
|
buf.push_back('"');
|
||||||
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void stringify_val(std::string &out, mvt_feature const &feature, mvt_layer const &layer, mvt_value const &val, size_t vo) {
|
void stringify_val(std::string &out, mvt_feature const &feature, mvt_layer const &layer, mvt_value const &val, size_t vo) {
|
||||||
if (val.type == mvt_string) {
|
if (val.type == mvt_string) {
|
||||||
quote(out, val.string_value);
|
out.append(quote(val.string_value));
|
||||||
} else if (val.type == mvt_int) {
|
} else if (val.type == mvt_int) {
|
||||||
out.append(std::to_string(val.numeric_value.int_value));
|
out.append(std::to_string(val.numeric_value.int_value));
|
||||||
} else if (val.type == mvt_double) {
|
} else if (val.type == mvt_double) {
|
||||||
@ -363,6 +367,40 @@ struct coordinate_writer {
|
|||||||
void (*function)(json_writer &state, lonlat const &p);
|
void (*function)(json_writer &state, lonlat const &p);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
std::vector<std::string> decode_node_attributes(mvt_feature const &feature, const mvt_layer &layer) {
|
||||||
|
std::vector<mvt_geometry> const &geom = feature.geometry;
|
||||||
|
std::vector<unsigned long> const &attr = feature.node_attributes;
|
||||||
|
std::vector<std::string> out;
|
||||||
|
|
||||||
|
for (size_t t = 0; t + 1 < attr.size(); t++) {
|
||||||
|
if (attr[t] >= layer.keys.size()) {
|
||||||
|
fprintf(stderr, "Out of bounds attribute reference %lu into %zu\n", attr[t], layer.keys.size());
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string key = layer.keys[attr[t]];
|
||||||
|
|
||||||
|
t++;
|
||||||
|
mvt_value const &val = layer.decode_property(attr, t);
|
||||||
|
|
||||||
|
if (val.type != mvt_list) {
|
||||||
|
fprintf(stderr, "Expected node attribute to be a list\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (val.list_value.size() != geom.size()) {
|
||||||
|
fprintf(stderr, "Node attribute list size doesn't match geometry size\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t g = 0; g < geom.size(); g++) {
|
||||||
|
out.push_back(std::string("{") + quote(key) + ":" + val.list_value[g].toString() + "}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
void layer_to_geojson(mvt_layer const &layer, unsigned z, unsigned x, unsigned y, bool comma, bool name, bool zoom, bool dropped, unsigned long long index, long long sequence, long long extent, bool complain, json_writer &state) {
|
void layer_to_geojson(mvt_layer const &layer, unsigned z, unsigned x, unsigned y, bool comma, bool name, bool zoom, bool dropped, unsigned long long index, long long sequence, long long extent, bool complain, json_writer &state) {
|
||||||
for (size_t f = 0; f < layer.features.size(); f++) {
|
for (size_t f = 0; f < layer.features.size(); f++) {
|
||||||
mvt_feature const &feat = layer.features[f];
|
mvt_feature const &feat = layer.features[f];
|
||||||
@ -462,6 +500,8 @@ void layer_to_geojson(mvt_layer const &layer, unsigned z, unsigned x, unsigned y
|
|||||||
std::vector<lonlat> ops;
|
std::vector<lonlat> ops;
|
||||||
bool has_attributes = false;
|
bool has_attributes = false;
|
||||||
|
|
||||||
|
std::vector<std::string> attributes = decode_node_attributes(feat, layer);
|
||||||
|
|
||||||
for (size_t g = 0; g < feat.geometry.size(); g++) {
|
for (size_t g = 0; g < feat.geometry.size(); g++) {
|
||||||
int op = feat.geometry[g].op;
|
int op = feat.geometry[g].op;
|
||||||
long long px = feat.geometry[g].x;
|
long long px = feat.geometry[g].x;
|
||||||
@ -475,8 +515,8 @@ void layer_to_geojson(mvt_layer const &layer, unsigned z, unsigned x, unsigned y
|
|||||||
double lat, lon;
|
double lat, lon;
|
||||||
projection->unproject(wx, wy, 32, &lon, &lat);
|
projection->unproject(wx, wy, 32, &lon, &lat);
|
||||||
|
|
||||||
ops.push_back(lonlat(op, lon, lat, px, py, feat.geometry[g].elevations, feat.geometry[g].attribute));
|
ops.push_back(lonlat(op, lon, lat, px, py, feat.geometry[g].elevations, attributes[g]));
|
||||||
if (feat.geometry[g].attribute.size() != 0) {
|
if (attributes[g].size() != 0) {
|
||||||
has_attributes = true;
|
has_attributes = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user