Add support for pmtiles output format (#55)

* add pmtiles.hpp from github.com/protomaps/PMTiles [#10]

* tippecanoe main writes pmtiles output. [#10]

* detect output format using suffix
* after mbtiles is done writing, replace with pmtiles based on map/image tables.
* add method to write_json for writing json sub-object.

* tippecanoe-decode reads pmtiles input. [#10]

* tile-join reads and writes pmtiles. [#10]

* pmtiles test suite for decode and tile-join [#10]

* add base GitHub CI action for compiling and test suite.

* update pmtiles.hpp with z>15 fix

* Fix some ordering problems with pmtiles decode

* Pmtiles should also pass the raw tiles tests

* Eradicate spaces from tileset metadata JSON fields

* Eradicate spaces from more test fixtures

* Update more tests

* Pmtiles tests pass now too

* Remove unnecessary sort (and make indent)

* Update changelog

* The allow-existing test for pmtiles needs -o, not -e

* Declare --allow-existing to be unsupported for pmtiles.

It was always a bad idea even for mbtiles.

Co-authored-by: Brandon Liu <bdon@bdon.org>
This commit is contained in:
Erica Fischer
2022-12-29 12:00:13 -08:00
committed by GitHub
co-authored by Brandon Liu
parent a374263466
commit 3b2599f587
197 changed files with 2517 additions and 325 deletions
+1 -1
View File
@@ -4,7 +4,7 @@
"description": "tests/tl_2015_us_county/out/-z8.json.check.mbtiles",
"format": "pbf",
"generator_options": "./tippecanoe -q -a@ -f -o tests/tl_2015_us_county/out/-z8.json.check.mbtiles -z8 tests/tl_2015_us_county/piscataquis.json tests/tl_2015_us_county/somerset.json",
"json": "{\"vector_layers\": [ { \"id\": \"piscataquis\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 8, \"fields\": {\"ALAND\": \"Number\", \"AWATER\": \"Number\", \"CLASSFP\": \"String\", \"COUNTYFP\": \"String\", \"COUNTYNS\": \"String\", \"FUNCSTAT\": \"String\", \"GEOID\": \"String\", \"INTPTLAT\": \"String\", \"INTPTLON\": \"String\", \"LSAD\": \"String\", \"MTFCC\": \"String\", \"NAME\": \"String\", \"NAMELSAD\": \"String\", \"STATEFP\": \"String\"} }, { \"id\": \"somerset\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 8, \"fields\": {\"ALAND\": \"Number\", \"AWATER\": \"Number\", \"CLASSFP\": \"String\", \"COUNTYFP\": \"String\", \"COUNTYNS\": \"String\", \"FUNCSTAT\": \"String\", \"GEOID\": \"String\", \"INTPTLAT\": \"String\", \"INTPTLON\": \"String\", \"LSAD\": \"String\", \"MTFCC\": \"String\", \"NAME\": \"String\", \"NAMELSAD\": \"String\", \"STATEFP\": \"String\"} } ],\"tilestats\": {\"layerCount\": 2,\"layers\": [{\"layer\": \"piscataquis\",\"count\": 1,\"geometry\": \"Polygon\",\"attributeCount\": 14,\"attributes\": [{\"attribute\": \"ALAND\",\"count\": 1,\"type\": \"number\",\"values\": [10258678459],\"min\": 10258678459,\"max\": 10258678459},{\"attribute\": \"AWATER\",\"count\": 1,\"type\": \"number\",\"values\": [1080563045],\"min\": 1080563045,\"max\": 1080563045},{\"attribute\": \"CLASSFP\",\"count\": 1,\"type\": \"string\",\"values\": [\"H1\"]},{\"attribute\": \"COUNTYFP\",\"count\": 1,\"type\": \"string\",\"values\": [\"021\"]},{\"attribute\": \"COUNTYNS\",\"count\": 1,\"type\": \"string\",\"values\": [\"00581296\"]},{\"attribute\": \"FUNCSTAT\",\"count\": 1,\"type\": \"string\",\"values\": [\"A\"]},{\"attribute\": \"GEOID\",\"count\": 1,\"type\": \"string\",\"values\": [\"23021\"]},{\"attribute\": \"INTPTLAT\",\"count\": 1,\"type\": \"string\",\"values\": [\"+45.917685\"]},{\"attribute\": \"INTPTLON\",\"count\": 1,\"type\": \"string\",\"values\": [\"-069.104535\"]},{\"attribute\": \"LSAD\",\"count\": 1,\"type\": \"string\",\"values\": [\"06\"]},{\"attribute\": \"MTFCC\",\"count\": 1,\"type\": \"string\",\"values\": [\"G4020\"]},{\"attribute\": \"NAME\",\"count\": 1,\"type\": \"string\",\"values\": [\"Piscataquis\"]},{\"attribute\": \"NAMELSAD\",\"count\": 1,\"type\": \"string\",\"values\": [\"Piscataquis County\"]},{\"attribute\": \"STATEFP\",\"count\": 1,\"type\": \"string\",\"values\": [\"23\"]}]},{\"layer\": \"somerset\",\"count\": 1,\"geometry\": \"Polygon\",\"attributeCount\": 14,\"attributes\": [{\"attribute\": \"ALAND\",\"count\": 1,\"type\": \"number\",\"values\": [10164314642],\"min\": 10164314642,\"max\": 10164314642},{\"attribute\": \"AWATER\",\"count\": 1,\"type\": \"number\",\"values\": [437895944],\"min\": 437895944,\"max\": 437895944},{\"attribute\": \"CLASSFP\",\"count\": 1,\"type\": \"string\",\"values\": [\"H1\"]},{\"attribute\": \"COUNTYFP\",\"count\": 1,\"type\": \"string\",\"values\": [\"025\"]},{\"attribute\": \"COUNTYNS\",\"count\": 1,\"type\": \"string\",\"values\": [\"00581298\"]},{\"attribute\": \"FUNCSTAT\",\"count\": 1,\"type\": \"string\",\"values\": [\"A\"]},{\"attribute\": \"GEOID\",\"count\": 1,\"type\": \"string\",\"values\": [\"23025\"]},{\"attribute\": \"INTPTLAT\",\"count\": 1,\"type\": \"string\",\"values\": [\"+45.507482\"]},{\"attribute\": \"INTPTLON\",\"count\": 1,\"type\": \"string\",\"values\": [\"-069.976039\"]},{\"attribute\": \"LSAD\",\"count\": 1,\"type\": \"string\",\"values\": [\"06\"]},{\"attribute\": \"MTFCC\",\"count\": 1,\"type\": \"string\",\"values\": [\"G4020\"]},{\"attribute\": \"NAME\",\"count\": 1,\"type\": \"string\",\"values\": [\"Somerset\"]},{\"attribute\": \"NAMELSAD\",\"count\": 1,\"type\": \"string\",\"values\": [\"Somerset County\"]},{\"attribute\": \"STATEFP\",\"count\": 1,\"type\": \"string\",\"values\": [\"23\"]}]}]}}",
"json": "{\"vector_layers\":[{\"id\":\"piscataquis\",\"description\":\"\",\"minzoom\":0,\"maxzoom\":8,\"fields\":{\"ALAND\":\"Number\",\"AWATER\":\"Number\",\"CLASSFP\":\"String\",\"COUNTYFP\":\"String\",\"COUNTYNS\":\"String\",\"FUNCSTAT\":\"String\",\"GEOID\":\"String\",\"INTPTLAT\":\"String\",\"INTPTLON\":\"String\",\"LSAD\":\"String\",\"MTFCC\":\"String\",\"NAME\":\"String\",\"NAMELSAD\":\"String\",\"STATEFP\":\"String\"}},{\"id\":\"somerset\",\"description\":\"\",\"minzoom\":0,\"maxzoom\":8,\"fields\":{\"ALAND\":\"Number\",\"AWATER\":\"Number\",\"CLASSFP\":\"String\",\"COUNTYFP\":\"String\",\"COUNTYNS\":\"String\",\"FUNCSTAT\":\"String\",\"GEOID\":\"String\",\"INTPTLAT\":\"String\",\"INTPTLON\":\"String\",\"LSAD\":\"String\",\"MTFCC\":\"String\",\"NAME\":\"String\",\"NAMELSAD\":\"String\",\"STATEFP\":\"String\"}}],\"tilestats\":{\"layerCount\":2,\"layers\":[{\"layer\":\"piscataquis\",\"count\":1,\"geometry\":\"Polygon\",\"attributeCount\":14,\"attributes\":[{\"attribute\":\"ALAND\",\"count\":1,\"type\":\"number\",\"values\":[10258678459],\"min\":10258678459,\"max\":10258678459},{\"attribute\":\"AWATER\",\"count\":1,\"type\":\"number\",\"values\":[1080563045],\"min\":1080563045,\"max\":1080563045},{\"attribute\":\"CLASSFP\",\"count\":1,\"type\":\"string\",\"values\":[\"H1\"]},{\"attribute\":\"COUNTYFP\",\"count\":1,\"type\":\"string\",\"values\":[\"021\"]},{\"attribute\":\"COUNTYNS\",\"count\":1,\"type\":\"string\",\"values\":[\"00581296\"]},{\"attribute\":\"FUNCSTAT\",\"count\":1,\"type\":\"string\",\"values\":[\"A\"]},{\"attribute\":\"GEOID\",\"count\":1,\"type\":\"string\",\"values\":[\"23021\"]},{\"attribute\":\"INTPTLAT\",\"count\":1,\"type\":\"string\",\"values\":[\"+45.917685\"]},{\"attribute\":\"INTPTLON\",\"count\":1,\"type\":\"string\",\"values\":[\"-069.104535\"]},{\"attribute\":\"LSAD\",\"count\":1,\"type\":\"string\",\"values\":[\"06\"]},{\"attribute\":\"MTFCC\",\"count\":1,\"type\":\"string\",\"values\":[\"G4020\"]},{\"attribute\":\"NAME\",\"count\":1,\"type\":\"string\",\"values\":[\"Piscataquis\"]},{\"attribute\":\"NAMELSAD\",\"count\":1,\"type\":\"string\",\"values\":[\"Piscataquis County\"]},{\"attribute\":\"STATEFP\",\"count\":1,\"type\":\"string\",\"values\":[\"23\"]}]},{\"layer\":\"somerset\",\"count\":1,\"geometry\":\"Polygon\",\"attributeCount\":14,\"attributes\":[{\"attribute\":\"ALAND\",\"count\":1,\"type\":\"number\",\"values\":[10164314642],\"min\":10164314642,\"max\":10164314642},{\"attribute\":\"AWATER\",\"count\":1,\"type\":\"number\",\"values\":[437895944],\"min\":437895944,\"max\":437895944},{\"attribute\":\"CLASSFP\",\"count\":1,\"type\":\"string\",\"values\":[\"H1\"]},{\"attribute\":\"COUNTYFP\",\"count\":1,\"type\":\"string\",\"values\":[\"025\"]},{\"attribute\":\"COUNTYNS\",\"count\":1,\"type\":\"string\",\"values\":[\"00581298\"]},{\"attribute\":\"FUNCSTAT\",\"count\":1,\"type\":\"string\",\"values\":[\"A\"]},{\"attribute\":\"GEOID\",\"count\":1,\"type\":\"string\",\"values\":[\"23025\"]},{\"attribute\":\"INTPTLAT\",\"count\":1,\"type\":\"string\",\"values\":[\"+45.507482\"]},{\"attribute\":\"INTPTLON\",\"count\":1,\"type\":\"string\",\"values\":[\"-069.976039\"]},{\"attribute\":\"LSAD\",\"count\":1,\"type\":\"string\",\"values\":[\"06\"]},{\"attribute\":\"MTFCC\",\"count\":1,\"type\":\"string\",\"values\":[\"G4020\"]},{\"attribute\":\"NAME\",\"count\":1,\"type\":\"string\",\"values\":[\"Somerset\"]},{\"attribute\":\"NAMELSAD\",\"count\":1,\"type\":\"string\",\"values\":[\"Somerset County\"]},{\"attribute\":\"STATEFP\",\"count\":1,\"type\":\"string\",\"values\":[\"23\"]}]}]}}",
"maxzoom": "8",
"minzoom": "0",
"name": "tests/tl_2015_us_county/out/-z8.json.check.mbtiles",
+1 -1
View File
@@ -4,7 +4,7 @@
"description": "tests/tl_2015_us_county/out/-z8_-pp.json.check.mbtiles",
"format": "pbf",
"generator_options": "./tippecanoe -q -a@ -f -o tests/tl_2015_us_county/out/-z8_-pp.json.check.mbtiles -z8 -pp tests/tl_2015_us_county/piscataquis.json tests/tl_2015_us_county/somerset.json",
"json": "{\"vector_layers\": [ { \"id\": \"piscataquis\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 8, \"fields\": {\"ALAND\": \"Number\", \"AWATER\": \"Number\", \"CLASSFP\": \"String\", \"COUNTYFP\": \"String\", \"COUNTYNS\": \"String\", \"FUNCSTAT\": \"String\", \"GEOID\": \"String\", \"INTPTLAT\": \"String\", \"INTPTLON\": \"String\", \"LSAD\": \"String\", \"MTFCC\": \"String\", \"NAME\": \"String\", \"NAMELSAD\": \"String\", \"STATEFP\": \"String\"} }, { \"id\": \"somerset\", \"description\": \"\", \"minzoom\": 0, \"maxzoom\": 8, \"fields\": {\"ALAND\": \"Number\", \"AWATER\": \"Number\", \"CLASSFP\": \"String\", \"COUNTYFP\": \"String\", \"COUNTYNS\": \"String\", \"FUNCSTAT\": \"String\", \"GEOID\": \"String\", \"INTPTLAT\": \"String\", \"INTPTLON\": \"String\", \"LSAD\": \"String\", \"MTFCC\": \"String\", \"NAME\": \"String\", \"NAMELSAD\": \"String\", \"STATEFP\": \"String\"} } ],\"tilestats\": {\"layerCount\": 2,\"layers\": [{\"layer\": \"piscataquis\",\"count\": 1,\"geometry\": \"Polygon\",\"attributeCount\": 14,\"attributes\": [{\"attribute\": \"ALAND\",\"count\": 1,\"type\": \"number\",\"values\": [10258678459],\"min\": 10258678459,\"max\": 10258678459},{\"attribute\": \"AWATER\",\"count\": 1,\"type\": \"number\",\"values\": [1080563045],\"min\": 1080563045,\"max\": 1080563045},{\"attribute\": \"CLASSFP\",\"count\": 1,\"type\": \"string\",\"values\": [\"H1\"]},{\"attribute\": \"COUNTYFP\",\"count\": 1,\"type\": \"string\",\"values\": [\"021\"]},{\"attribute\": \"COUNTYNS\",\"count\": 1,\"type\": \"string\",\"values\": [\"00581296\"]},{\"attribute\": \"FUNCSTAT\",\"count\": 1,\"type\": \"string\",\"values\": [\"A\"]},{\"attribute\": \"GEOID\",\"count\": 1,\"type\": \"string\",\"values\": [\"23021\"]},{\"attribute\": \"INTPTLAT\",\"count\": 1,\"type\": \"string\",\"values\": [\"+45.917685\"]},{\"attribute\": \"INTPTLON\",\"count\": 1,\"type\": \"string\",\"values\": [\"-069.104535\"]},{\"attribute\": \"LSAD\",\"count\": 1,\"type\": \"string\",\"values\": [\"06\"]},{\"attribute\": \"MTFCC\",\"count\": 1,\"type\": \"string\",\"values\": [\"G4020\"]},{\"attribute\": \"NAME\",\"count\": 1,\"type\": \"string\",\"values\": [\"Piscataquis\"]},{\"attribute\": \"NAMELSAD\",\"count\": 1,\"type\": \"string\",\"values\": [\"Piscataquis County\"]},{\"attribute\": \"STATEFP\",\"count\": 1,\"type\": \"string\",\"values\": [\"23\"]}]},{\"layer\": \"somerset\",\"count\": 1,\"geometry\": \"Polygon\",\"attributeCount\": 14,\"attributes\": [{\"attribute\": \"ALAND\",\"count\": 1,\"type\": \"number\",\"values\": [10164314642],\"min\": 10164314642,\"max\": 10164314642},{\"attribute\": \"AWATER\",\"count\": 1,\"type\": \"number\",\"values\": [437895944],\"min\": 437895944,\"max\": 437895944},{\"attribute\": \"CLASSFP\",\"count\": 1,\"type\": \"string\",\"values\": [\"H1\"]},{\"attribute\": \"COUNTYFP\",\"count\": 1,\"type\": \"string\",\"values\": [\"025\"]},{\"attribute\": \"COUNTYNS\",\"count\": 1,\"type\": \"string\",\"values\": [\"00581298\"]},{\"attribute\": \"FUNCSTAT\",\"count\": 1,\"type\": \"string\",\"values\": [\"A\"]},{\"attribute\": \"GEOID\",\"count\": 1,\"type\": \"string\",\"values\": [\"23025\"]},{\"attribute\": \"INTPTLAT\",\"count\": 1,\"type\": \"string\",\"values\": [\"+45.507482\"]},{\"attribute\": \"INTPTLON\",\"count\": 1,\"type\": \"string\",\"values\": [\"-069.976039\"]},{\"attribute\": \"LSAD\",\"count\": 1,\"type\": \"string\",\"values\": [\"06\"]},{\"attribute\": \"MTFCC\",\"count\": 1,\"type\": \"string\",\"values\": [\"G4020\"]},{\"attribute\": \"NAME\",\"count\": 1,\"type\": \"string\",\"values\": [\"Somerset\"]},{\"attribute\": \"NAMELSAD\",\"count\": 1,\"type\": \"string\",\"values\": [\"Somerset County\"]},{\"attribute\": \"STATEFP\",\"count\": 1,\"type\": \"string\",\"values\": [\"23\"]}]}]}}",
"json": "{\"vector_layers\":[{\"id\":\"piscataquis\",\"description\":\"\",\"minzoom\":0,\"maxzoom\":8,\"fields\":{\"ALAND\":\"Number\",\"AWATER\":\"Number\",\"CLASSFP\":\"String\",\"COUNTYFP\":\"String\",\"COUNTYNS\":\"String\",\"FUNCSTAT\":\"String\",\"GEOID\":\"String\",\"INTPTLAT\":\"String\",\"INTPTLON\":\"String\",\"LSAD\":\"String\",\"MTFCC\":\"String\",\"NAME\":\"String\",\"NAMELSAD\":\"String\",\"STATEFP\":\"String\"}},{\"id\":\"somerset\",\"description\":\"\",\"minzoom\":0,\"maxzoom\":8,\"fields\":{\"ALAND\":\"Number\",\"AWATER\":\"Number\",\"CLASSFP\":\"String\",\"COUNTYFP\":\"String\",\"COUNTYNS\":\"String\",\"FUNCSTAT\":\"String\",\"GEOID\":\"String\",\"INTPTLAT\":\"String\",\"INTPTLON\":\"String\",\"LSAD\":\"String\",\"MTFCC\":\"String\",\"NAME\":\"String\",\"NAMELSAD\":\"String\",\"STATEFP\":\"String\"}}],\"tilestats\":{\"layerCount\":2,\"layers\":[{\"layer\":\"piscataquis\",\"count\":1,\"geometry\":\"Polygon\",\"attributeCount\":14,\"attributes\":[{\"attribute\":\"ALAND\",\"count\":1,\"type\":\"number\",\"values\":[10258678459],\"min\":10258678459,\"max\":10258678459},{\"attribute\":\"AWATER\",\"count\":1,\"type\":\"number\",\"values\":[1080563045],\"min\":1080563045,\"max\":1080563045},{\"attribute\":\"CLASSFP\",\"count\":1,\"type\":\"string\",\"values\":[\"H1\"]},{\"attribute\":\"COUNTYFP\",\"count\":1,\"type\":\"string\",\"values\":[\"021\"]},{\"attribute\":\"COUNTYNS\",\"count\":1,\"type\":\"string\",\"values\":[\"00581296\"]},{\"attribute\":\"FUNCSTAT\",\"count\":1,\"type\":\"string\",\"values\":[\"A\"]},{\"attribute\":\"GEOID\",\"count\":1,\"type\":\"string\",\"values\":[\"23021\"]},{\"attribute\":\"INTPTLAT\",\"count\":1,\"type\":\"string\",\"values\":[\"+45.917685\"]},{\"attribute\":\"INTPTLON\",\"count\":1,\"type\":\"string\",\"values\":[\"-069.104535\"]},{\"attribute\":\"LSAD\",\"count\":1,\"type\":\"string\",\"values\":[\"06\"]},{\"attribute\":\"MTFCC\",\"count\":1,\"type\":\"string\",\"values\":[\"G4020\"]},{\"attribute\":\"NAME\",\"count\":1,\"type\":\"string\",\"values\":[\"Piscataquis\"]},{\"attribute\":\"NAMELSAD\",\"count\":1,\"type\":\"string\",\"values\":[\"Piscataquis County\"]},{\"attribute\":\"STATEFP\",\"count\":1,\"type\":\"string\",\"values\":[\"23\"]}]},{\"layer\":\"somerset\",\"count\":1,\"geometry\":\"Polygon\",\"attributeCount\":14,\"attributes\":[{\"attribute\":\"ALAND\",\"count\":1,\"type\":\"number\",\"values\":[10164314642],\"min\":10164314642,\"max\":10164314642},{\"attribute\":\"AWATER\",\"count\":1,\"type\":\"number\",\"values\":[437895944],\"min\":437895944,\"max\":437895944},{\"attribute\":\"CLASSFP\",\"count\":1,\"type\":\"string\",\"values\":[\"H1\"]},{\"attribute\":\"COUNTYFP\",\"count\":1,\"type\":\"string\",\"values\":[\"025\"]},{\"attribute\":\"COUNTYNS\",\"count\":1,\"type\":\"string\",\"values\":[\"00581298\"]},{\"attribute\":\"FUNCSTAT\",\"count\":1,\"type\":\"string\",\"values\":[\"A\"]},{\"attribute\":\"GEOID\",\"count\":1,\"type\":\"string\",\"values\":[\"23025\"]},{\"attribute\":\"INTPTLAT\",\"count\":1,\"type\":\"string\",\"values\":[\"+45.507482\"]},{\"attribute\":\"INTPTLON\",\"count\":1,\"type\":\"string\",\"values\":[\"-069.976039\"]},{\"attribute\":\"LSAD\",\"count\":1,\"type\":\"string\",\"values\":[\"06\"]},{\"attribute\":\"MTFCC\",\"count\":1,\"type\":\"string\",\"values\":[\"G4020\"]},{\"attribute\":\"NAME\",\"count\":1,\"type\":\"string\",\"values\":[\"Somerset\"]},{\"attribute\":\"NAMELSAD\",\"count\":1,\"type\":\"string\",\"values\":[\"Somerset County\"]},{\"attribute\":\"STATEFP\",\"count\":1,\"type\":\"string\",\"values\":[\"23\"]}]}]}}",
"maxzoom": "8",
"minzoom": "0",
"name": "tests/tl_2015_us_county/out/-z8_-pp.json.check.mbtiles",