diff --git a/Makefile b/Makefile index c1994049..85130114 100644 --- a/Makefile +++ b/Makefile @@ -377,6 +377,11 @@ overzoom-test: tippecanoe-overzoom ./tippecanoe-decode tests/pbf/bin-11-327-791-ids.pbf.out 11 327 791 > tests/pbf/bin-11-327-791-ids.pbf.out.json.check cmp tests/pbf/bin-11-327-791-ids.pbf.out.json.check tests/pbf/bin-11-327-791-ids.pbf.out.json rm tests/pbf/bin-11-327-791-ids.pbf.out.json.check tests/pbf/bin-11-327-791-ids.pbf.out + # Binning by id, clipping by polygon + ./tippecanoe-overzoom -o tests/pbf/bin-11-327-791-ids-clip.pbf.out --clip-polygon='{"coordinates":[[[-122.4527379,37.8128815],[-122.4598853,37.7834743],[-122.4280914,37.7959397],[-122.4527379,37.8128815]]],"type":"Polygon"}' --assign-to-bins tests/pbf/sf-zips.json --bin-by-id-list bin-ids tests/pbf/yearbuilt.pbf 11/327/791 11/327/791 + ./tippecanoe-decode tests/pbf/bin-11-327-791-ids-clip.pbf.out 11 327 791 > tests/pbf/bin-11-327-791-ids-clip.pbf.out.json.check + cmp tests/pbf/bin-11-327-791-ids-clip.pbf.out.json.check tests/pbf/bin-11-327-791-ids-clip.pbf.out.json + rm tests/pbf/bin-11-327-791-ids-clip.pbf.out.json.check tests/pbf/bin-11-327-791-ids-clip.pbf.out # Binning by id, attribute stripping # Note that it still works even if we exclude the ID that we are binning by ./tippecanoe-overzoom -yZCTA5CE10 -ytippecanoe:count -o tests/pbf/bin-11-327-791-ids-zip.pbf.out --assign-to-bins tests/pbf/sf-zips.json --bin-by-id-list bin-ids tests/pbf/yearbuilt.pbf 11/327/791 11/327/791 diff --git a/clip.cpp b/clip.cpp index 0f366fba..2d1740a5 100644 --- a/clip.cpp +++ b/clip.cpp @@ -1228,7 +1228,7 @@ clipbbox parse_clip_poly(std::string arg) { exit(EXIT_ARGS); } - std::pair parsed_geometry = parse_geometry(j, jp, j, 0, 0, 0, 1LL << 32, false); + std::pair parsed_geometry = parse_geometry(j, jp, j, 0, 0, 0, 1LL << 32, false, false); json_end(jp); clipbbox out; @@ -1539,11 +1539,17 @@ static bool feature_out(std::vector const &features, mvt_layer &ou for (auto const &c_world : clipbboxes) { clipbbox c = c_world; + c.minx = std::llround((c_world.minx - dx) * scale); c.miny = std::llround((c_world.miny - dy) * scale); c.maxx = std::llround((c_world.maxx - dx) * scale); c.maxy = std::llround((c_world.maxy - dy) * scale); + for (auto &p : c.dv) { + p.x = std::llround((p.x - dx) * scale); + p.y = std::llround((p.y - dy) * scale); + } + if (t == VT_POLYGON) { geom = simple_clip_poly(geom, c.minx, c.miny, c.maxx, c.maxy, false); if (c.dv.size() > 0 && geom.size() > 0) { diff --git a/read_json.cpp b/read_json.cpp index 2a95e4d3..63329acb 100644 --- a/read_json.cpp +++ b/read_json.cpp @@ -179,7 +179,7 @@ static std::vector to_feature(drawvec &geom) { } std::pair parse_geometry(json_object *geometry, json_pull *jp, json_object *j, - int z, int x, int y, long long extent, bool fix_longitudes) { + int z, int x, int y, long long extent, bool fix_longitudes, bool mvt_style) { json_object *geometry_type = json_hash_get(geometry, "type"); if (geometry_type == NULL) { fprintf(stderr, "Filter output:%d: null geometry (additional not reported): ", jp->line); @@ -291,8 +291,11 @@ std::pair parse_geometry(json_object *geometry, json_pull *jp, jso } } dv = remove_noop(dv, mb_geometry[t], 0); - if (mb_geometry[t] == VT_POLYGON) { - dv = close_poly(dv); + + if (mvt_style) { + if (mb_geometry[t] == VT_POLYGON) { + dv = close_poly(dv); + } } return std::pair(t, dv); @@ -364,7 +367,7 @@ std::vector parse_layers(FILE *fp, int z, unsigned x, unsigned y, int exit(EXIT_JSON); } - std::pair parsed_geometry = parse_geometry(geometry, jp, j, z, x, y, extent, fix_longitudes); + std::pair parsed_geometry = parse_geometry(geometry, jp, j, z, x, y, extent, fix_longitudes, true); int t = parsed_geometry.first; drawvec &dv = parsed_geometry.second; diff --git a/read_json.hpp b/read_json.hpp index 6323c497..a5d5d7b2 100644 --- a/read_json.hpp +++ b/read_json.hpp @@ -13,7 +13,7 @@ extern int mb_geometry[GEOM_TYPES]; void json_context(json_object *j); void parse_coordinates(int t, json_object *j, drawvec &out, int op, const char *fname, int line, json_object *feature); std::pair parse_geometry(json_object *geometry, json_pull *jp, json_object *j, - int z, int x, int y, long long extent, bool fix_longitudes); + int z, int x, int y, long long extent, bool fix_longitudes, bool mvt_style); std::vector parse_layers(FILE *fp, int z, unsigned x, unsigned y, int extent, bool fix_longitudes); serial_val stringify_value(json_object *value, const char *reading, int line, json_object *feature); diff --git a/tests/pbf/bin-11-327-791-ids-clip.pbf.out.json b/tests/pbf/bin-11-327-791-ids-clip.pbf.out.json new file mode 100644 index 00000000..1fb063bd --- /dev/null +++ b/tests/pbf/bin-11-327-791-ids-clip.pbf.out.json @@ -0,0 +1,7 @@ +{ "type": "FeatureCollection", "properties": { "zoom": 11, "x": 327, "y": 791 }, "features": [ +{ "type": "FeatureCollection", "properties": { "layer": "parsed", "version": 2, "extent": 4096 }, "features": [ +{ "type": "Feature", "properties": { "bin-ids": "236,237,510,514", "ZCTA5CE10": "94129", "GEOID10": "94129", "CLASSFP10": "B5", "MTFCC10": "G6350", "FUNCSTAT10": "S", "ALAND10": 5968455, "AWATER10": 14697, "INTPTLAT10": "+37.7973402", "INTPTLON10": "-122.4644664", "tippecanoe:count": 4 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -122.448120, 37.806936 ], [ -122.448120, 37.806393 ], [ -122.448463, 37.806122 ], [ -122.448292, 37.804766 ], [ -122.451553, 37.803409 ], [ -122.450180, 37.802867 ], [ -122.450008, 37.802460 ], [ -122.447605, 37.800697 ], [ -122.447262, 37.798527 ], [ -122.448120, 37.798255 ], [ -122.448292, 37.797848 ], [ -122.447948, 37.797441 ], [ -122.448635, 37.797441 ], [ -122.448635, 37.797034 ], [ -122.447948, 37.796899 ], [ -122.447948, 37.796492 ], [ -122.448978, 37.796356 ], [ -122.447433, 37.795814 ], [ -122.447433, 37.795542 ], [ -122.447777, 37.795407 ], [ -122.448635, 37.795542 ], [ -122.448978, 37.795000 ], [ -122.448635, 37.794728 ], [ -122.447948, 37.793101 ], [ -122.448463, 37.792829 ], [ -122.448635, 37.791880 ], [ -122.458334, 37.789879 ], [ -122.454300, 37.806495 ], [ -122.452412, 37.806258 ], [ -122.448120, 37.806936 ] ], [ [ -122.452583, 37.803274 ], [ -122.452412, 37.803138 ], [ -122.450008, 37.802460 ], [ -122.451210, 37.803138 ], [ -122.452583, 37.803274 ] ] ] } } +, +{ "type": "Feature", "properties": { "bin-ids": "529,531", "ZCTA5CE10": "94123", "GEOID10": "94123", "CLASSFP10": "B5", "MTFCC10": "G6350", "FUNCSTAT10": "S", "ALAND10": 2646572, "AWATER10": 218721, "INTPTLAT10": "+37.8009336", "INTPTLON10": "-122.4383664", "tippecanoe:count": 2 }, "geometry": { "type": "MultiPolygon", "coordinates": [ [ [ [ -122.447004, 37.808936 ], [ -122.428250, 37.796051 ], [ -122.433529, 37.795407 ], [ -122.433357, 37.794457 ], [ -122.434902, 37.794322 ], [ -122.435074, 37.795271 ], [ -122.436790, 37.795000 ], [ -122.436619, 37.794050 ], [ -122.440739, 37.793508 ], [ -122.440910, 37.794457 ], [ -122.441769, 37.794322 ], [ -122.441597, 37.793372 ], [ -122.446404, 37.792829 ], [ -122.446232, 37.791880 ], [ -122.447605, 37.791744 ], [ -122.448635, 37.794728 ], [ -122.448978, 37.795000 ], [ -122.448635, 37.795542 ], [ -122.447777, 37.795407 ], [ -122.447433, 37.795542 ], [ -122.447433, 37.795814 ], [ -122.448978, 37.796356 ], [ -122.447948, 37.796492 ], [ -122.447948, 37.796899 ], [ -122.448635, 37.797034 ], [ -122.448635, 37.797441 ], [ -122.447948, 37.797441 ], [ -122.448292, 37.797848 ], [ -122.448120, 37.798255 ], [ -122.447262, 37.798527 ], [ -122.447605, 37.800697 ], [ -122.450008, 37.802460 ], [ -122.450180, 37.802867 ], [ -122.451553, 37.803409 ], [ -122.448292, 37.804766 ], [ -122.448463, 37.806122 ], [ -122.448120, 37.806393 ], [ -122.448120, 37.806936 ], [ -122.448635, 37.808563 ], [ -122.447004, 37.808936 ] ] ], [ [ [ -122.452583, 37.803274 ], [ -122.451210, 37.803138 ], [ -122.450008, 37.802460 ], [ -122.452583, 37.803274 ] ] ] ] } } +] } +] }