mirror of
https://github.com/mapbox/tippecanoe.git
synced 2025-02-02 01:08:14 +00:00
Make an array of features in each tile to prepare to coalesce features
This commit is contained in:
parent
26e9feda02
commit
c02c91df5a
65
tile.cc
65
tile.cc
@ -436,6 +436,16 @@ int simplify_lines(struct draw *geom, int n, int z, int detail) {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct coalesce {
|
||||||
|
int type;
|
||||||
|
|
||||||
|
int ngeom;
|
||||||
|
struct draw *geom;
|
||||||
|
|
||||||
|
int nmeta;
|
||||||
|
int *meta;
|
||||||
|
};
|
||||||
|
|
||||||
long long write_tile(struct index *start, struct index *end, char *metabase, unsigned *file_bbox, int z, unsigned tx, unsigned ty, int detail, int basezoom, struct pool *file_keys, char *layername, sqlite3 *outdb) {
|
long long write_tile(struct index *start, struct index *end, char *metabase, unsigned *file_bbox, int z, unsigned tx, unsigned ty, int detail, int basezoom, struct pool *file_keys, char *layername, sqlite3 *outdb) {
|
||||||
GOOGLE_PROTOBUF_VERIFY_VERSION;
|
GOOGLE_PROTOBUF_VERIFY_VERSION;
|
||||||
|
|
||||||
@ -460,6 +470,9 @@ long long write_tile(struct index *start, struct index *end, char *metabase, uns
|
|||||||
interval = exp(log(2.5) * (basezoom - z));
|
interval = exp(log(2.5) * (basezoom - z));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nfeatures = 0;
|
||||||
|
struct coalesce features[end - start];
|
||||||
|
|
||||||
struct index *i;
|
struct index *i;
|
||||||
for (i = start; i < end; i++) {
|
for (i = start; i < end; i++) {
|
||||||
int t;
|
int t;
|
||||||
@ -511,24 +524,18 @@ long long write_tile(struct index *start, struct index *end, char *metabase, uns
|
|||||||
}
|
}
|
||||||
pv->n = 0;
|
pv->n = 0;
|
||||||
|
|
||||||
mapnik::vector::tile_feature *feature = layer->add_features();
|
features[nfeatures].type = t;
|
||||||
|
|
||||||
if (t == VT_POINT) {
|
features[nfeatures].ngeom = len;
|
||||||
feature->set_type(mapnik::vector::tile::Point);
|
features[nfeatures].geom = (struct draw *) malloc(len * sizeof(struct draw));
|
||||||
} else if (t == VT_LINE) {
|
memcpy(features[nfeatures].geom, geom, len * sizeof(struct draw));
|
||||||
feature->set_type(mapnik::vector::tile::LineString);
|
|
||||||
} else if (t == VT_POLYGON) {
|
|
||||||
feature->set_type(mapnik::vector::tile::Polygon);
|
|
||||||
} else {
|
|
||||||
feature->set_type(mapnik::vector::tile::Unknown);
|
|
||||||
}
|
|
||||||
|
|
||||||
draw(geom, len, feature);
|
|
||||||
count += len;
|
|
||||||
|
|
||||||
int m;
|
int m;
|
||||||
deserialize_int(&meta, &m);
|
deserialize_int(&meta, &m);
|
||||||
|
|
||||||
|
features[nfeatures].nmeta = 2 * m;
|
||||||
|
features[nfeatures].meta = (int *) malloc(2 * m * sizeof(int));
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < m; i++) {
|
for (i = 0; i < m; i++) {
|
||||||
int t;
|
int t;
|
||||||
@ -536,15 +543,43 @@ long long write_tile(struct index *start, struct index *end, char *metabase, uns
|
|||||||
struct pool_val *key = deserialize_string(&meta, &keys, VT_STRING);
|
struct pool_val *key = deserialize_string(&meta, &keys, VT_STRING);
|
||||||
struct pool_val *value = deserialize_string(&meta, &values, t);
|
struct pool_val *value = deserialize_string(&meta, &values, t);
|
||||||
|
|
||||||
feature->add_tags(key->n);
|
features[nfeatures].meta[2 * i + 0] = key->n;
|
||||||
feature->add_tags(value->n);
|
features[nfeatures].meta[2 * i + 1] = value->n;
|
||||||
|
|
||||||
// Dup to retain after munmap
|
// Dup to retain after munmap
|
||||||
pool(file_keys, strdup(key->s), t);
|
pool(file_keys, strdup(key->s), t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nfeatures++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int x;
|
||||||
|
for (x = 0; x < nfeatures; x++) {
|
||||||
|
mapnik::vector::tile_feature *feature = layer->add_features();
|
||||||
|
|
||||||
|
if (features[x].type == VT_POINT) {
|
||||||
|
feature->set_type(mapnik::vector::tile::Point);
|
||||||
|
} else if (features[x].type == VT_LINE) {
|
||||||
|
feature->set_type(mapnik::vector::tile::LineString);
|
||||||
|
} else if (features[x].type == VT_POLYGON) {
|
||||||
|
feature->set_type(mapnik::vector::tile::Polygon);
|
||||||
|
} else {
|
||||||
|
feature->set_type(mapnik::vector::tile::Unknown);
|
||||||
|
}
|
||||||
|
|
||||||
|
draw(features[x].geom, features[x].ngeom, feature);
|
||||||
|
count += features[x].ngeom;
|
||||||
|
|
||||||
|
int y;
|
||||||
|
for (y = 0; y < features[x].nmeta; y++) {
|
||||||
|
feature->add_tags(features[x].meta[y]);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(features[x].geom);
|
||||||
|
free(features[x].meta);
|
||||||
|
}
|
||||||
|
|
||||||
struct pool_val *pv;
|
struct pool_val *pv;
|
||||||
for (pv = keys.head; pv != NULL; pv = pv->next) {
|
for (pv = keys.head; pv != NULL; pv = pv->next) {
|
||||||
layer->add_keys(pv->s, strlen(pv->s));
|
layer->add_keys(pv->s, strlen(pv->s));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user