diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..55712c19 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib" +} \ No newline at end of file diff --git a/LICENSE b/LICENSE index 6769be2d..978ae9ff 100755 --- a/LICENSE +++ b/LICENSE @@ -731,3 +731,47 @@ Some code has been repurposed from of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS + +--- + +Some code has been repurposed from + +The MIT License (MIT) + +Copyright (c) 2021 Rowan Winsemius + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--- + +Some code has been repurposed from + +ISC License +Copyright (c) 2016 Mapbox + +Permission to use, copy, modify, and/or distribute this software for any purpose +with or without fee is hereby granted, provided that the above copyright notice +and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. +IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA +OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS +ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. diff --git a/TODO b/TODO index 748ba74f..4a7c3169 100644 --- a/TODO +++ b/TODO @@ -1,17 +1,17 @@ +# LIST OF TODOs + [ ] - reimagine the pointIndex system, its too slow for javascript (but perfect for lower langauges that have u64 support) [ ] - bin -> toS2JSON, toRasterTiles, & toVectorTiles [ ] - toVectorTiles [ ] - readers [ ] - - KML, KMZ, GML, & GPX -[ ] - - GBFS -[ ] - - raster tile reader including DEM for z-data [ ] - - LAS/LAZ +[ ] - - image -> png [ ] - geometry tools (lookup readme in geometry folder) [ ] - support missing projections in proj4 found in c++ implementation -[ ] - restructure all image based content into a reader folder 'image' -[ ] - 'png' reader +[ ] - interpolation tools [ ] - all main functions and classes need example code in the jsdocs diff --git a/assets/badges/cache-brotli.svg b/assets/badges/cache-brotli.svg index aecf476f..aa8c059c 100644 --- a/assets/badges/cache-brotli.svg +++ b/assets/badges/cache-brotli.svg @@ -1 +1 @@ -brotli: 364 Bytesbrotli364 Bytes \ No newline at end of file +brotli: 4.33 kBbrotli4.33 kB \ No newline at end of file diff --git a/assets/badges/cache-file.svg b/assets/badges/cache-file.svg index 9377ab44..1ca914f3 100644 --- a/assets/badges/cache-file.svg +++ b/assets/badges/cache-file.svg @@ -1 +1 @@ -bundle: 777 Bytesbundle777 Bytes \ No newline at end of file +bundle: 12.659 kBbundle12.659 kB \ No newline at end of file diff --git a/assets/badges/cache-gzip-cover.svg b/assets/badges/cache-gzip-cover.svg index 0a177d18..cb415a18 100644 --- a/assets/badges/cache-gzip-cover.svg +++ b/assets/badges/cache-gzip-cover.svg @@ -1 +1 @@ -gzip: 408 Bytesgzip408 Bytes \ No newline at end of file +gzip: 4.999 kBgzip4.999 kB \ No newline at end of file diff --git a/assets/badges/cache-gzip.svg b/assets/badges/cache-gzip.svg index 4d8a3a2a..19d53436 100644 --- a/assets/badges/cache-gzip.svg +++ b/assets/badges/cache-gzip.svg @@ -1 +1 @@ -gzip: 408 Bytesgzip408 Bytes \ No newline at end of file +gzip: 4.999 kBgzip4.999 kB \ No newline at end of file diff --git a/assets/badges/csv-brotli.svg b/assets/badges/csv-brotli.svg index c133812d..5a5833a6 100644 --- a/assets/badges/csv-brotli.svg +++ b/assets/badges/csv-brotli.svg @@ -1 +1 @@ -brotli: 931 Bytesbrotli931 Bytes \ No newline at end of file +brotli: 4.873 kBbrotli4.873 kB \ No newline at end of file diff --git a/assets/badges/csv-file.svg b/assets/badges/csv-file.svg index ff904a94..c5b1dccc 100644 --- a/assets/badges/csv-file.svg +++ b/assets/badges/csv-file.svg @@ -1 +1 @@ -bundle: 1.908 kBbundle1.908 kB \ No newline at end of file +bundle: 13.79 kBbundle13.79 kB \ No newline at end of file diff --git a/assets/badges/csv-gzip-cover.svg b/assets/badges/csv-gzip-cover.svg index d8bbe12f..d661777e 100644 --- a/assets/badges/csv-gzip-cover.svg +++ b/assets/badges/csv-gzip-cover.svg @@ -1 +1 @@ -gzip: 1.024 kBgzip1.024 kB \ No newline at end of file +gzip: 5.573 kBgzip5.573 kB \ No newline at end of file diff --git a/assets/badges/csv-gzip.svg b/assets/badges/csv-gzip.svg index f416b644..decdd9cb 100644 --- a/assets/badges/csv-gzip.svg +++ b/assets/badges/csv-gzip.svg @@ -1 +1 @@ -gzip: 1.024 kBgzip1.024 kB \ No newline at end of file +gzip: 5.573 kBgzip5.573 kB \ No newline at end of file diff --git a/assets/badges/datum-brotli.svg b/assets/badges/datum-brotli.svg index 1f1dd504..fd277240 100644 --- a/assets/badges/datum-brotli.svg +++ b/assets/badges/datum-brotli.svg @@ -1 +1 @@ -brotli: 2.093 kBbrotli2.093 kB \ No newline at end of file +brotli: 6.092 kBbrotli6.092 kB \ No newline at end of file diff --git a/assets/badges/datum-file.svg b/assets/badges/datum-file.svg index 27a68c6e..2e1a1279 100644 --- a/assets/badges/datum-file.svg +++ b/assets/badges/datum-file.svg @@ -1 +1 @@ -bundle: 5.39 kBbundle5.39 kB \ No newline at end of file +bundle: 17.29 kBbundle17.29 kB \ No newline at end of file diff --git a/assets/badges/datum-gzip-cover.svg b/assets/badges/datum-gzip-cover.svg index de9f2c0c..b95a1c92 100644 --- a/assets/badges/datum-gzip-cover.svg +++ b/assets/badges/datum-gzip-cover.svg @@ -1 +1 @@ -gzip: 2.304 kBgzip2.304 kB \ No newline at end of file +gzip: 6.963 kBgzip6.963 kB \ No newline at end of file diff --git a/assets/badges/datum-gzip.svg b/assets/badges/datum-gzip.svg index 58748b8c..a879b932 100644 --- a/assets/badges/datum-gzip.svg +++ b/assets/badges/datum-gzip.svg @@ -1 +1 @@ -gzip: 2.304 kBgzip2.304 kB \ No newline at end of file +gzip: 6.963 kBgzip6.963 kB \ No newline at end of file diff --git a/assets/badges/delaunator-brotli.svg b/assets/badges/delaunator-brotli.svg index 64724686..3e75c5cf 100644 --- a/assets/badges/delaunator-brotli.svg +++ b/assets/badges/delaunator-brotli.svg @@ -1 +1 @@ -brotli: 2.802 kBbrotli2.802 kB \ No newline at end of file +brotli: 6.755 kBbrotli6.755 kB \ No newline at end of file diff --git a/assets/badges/delaunator-file.svg b/assets/badges/delaunator-file.svg index e8efbcd7..85ad13e9 100644 --- a/assets/badges/delaunator-file.svg +++ b/assets/badges/delaunator-file.svg @@ -1 +1 @@ -bundle: 7.584 kBbundle7.584 kB \ No newline at end of file +bundle: 19.528 kBbundle19.528 kB \ No newline at end of file diff --git a/assets/badges/delaunator-gzip-cover.svg b/assets/badges/delaunator-gzip-cover.svg index 87cda814..e0a89cab 100644 --- a/assets/badges/delaunator-gzip-cover.svg +++ b/assets/badges/delaunator-gzip-cover.svg @@ -1 +1 @@ -gzip: 3.112 kBgzip3.112 kB \ No newline at end of file +gzip: 7.717 kBgzip7.717 kB \ No newline at end of file diff --git a/assets/badges/delaunator-gzip.svg b/assets/badges/delaunator-gzip.svg index 1c83caaa..fa99efb7 100644 --- a/assets/badges/delaunator-gzip.svg +++ b/assets/badges/delaunator-gzip.svg @@ -1 +1 @@ -gzip: 3.112 kBgzip3.112 kB \ No newline at end of file +gzip: 7.717 kBgzip7.717 kB \ No newline at end of file diff --git a/assets/badges/gbfs-brotli.svg b/assets/badges/gbfs-brotli.svg index 9aa4e83c..e760c92b 100644 --- a/assets/badges/gbfs-brotli.svg +++ b/assets/badges/gbfs-brotli.svg @@ -1 +1 @@ -brotli: 1.003 kBbrotli1.003 kB \ No newline at end of file +brotli: 5.469 kBbrotli5.469 kB \ No newline at end of file diff --git a/assets/badges/gbfs-file.svg b/assets/badges/gbfs-file.svg index 93814b08..df1cf31d 100644 --- a/assets/badges/gbfs-file.svg +++ b/assets/badges/gbfs-file.svg @@ -1 +1 @@ -bundle: 3.905 kBbundle3.905 kB \ No newline at end of file +bundle: 18.258 kBbundle18.258 kB \ No newline at end of file diff --git a/assets/badges/gbfs-gzip-cover.svg b/assets/badges/gbfs-gzip-cover.svg index 1ef88fe9..4052d085 100644 --- a/assets/badges/gbfs-gzip-cover.svg +++ b/assets/badges/gbfs-gzip-cover.svg @@ -1 +1 @@ -gzip: 1.158 kBgzip1.158 kB \ No newline at end of file +gzip: 6.289 kBgzip6.289 kB \ No newline at end of file diff --git a/assets/badges/gbfs-gzip.svg b/assets/badges/gbfs-gzip.svg index 0ab2d3f4..94fa246f 100644 --- a/assets/badges/gbfs-gzip.svg +++ b/assets/badges/gbfs-gzip.svg @@ -1 +1 @@ -gzip: 1.158 kBgzip1.158 kB \ No newline at end of file +gzip: 6.289 kBgzip6.289 kB \ No newline at end of file diff --git a/assets/badges/geotiff-brotli.svg b/assets/badges/geotiff-brotli.svg index 5a7d48e3..3cd18cb5 100644 --- a/assets/badges/geotiff-brotli.svg +++ b/assets/badges/geotiff-brotli.svg @@ -1 +1 @@ -brotli: 143.003 kBbrotli143.003 kB \ No newline at end of file +brotli: 24.783 kBbrotli24.783 kB \ No newline at end of file diff --git a/assets/badges/geotiff-file.svg b/assets/badges/geotiff-file.svg index 9f03d556..75ca0af0 100644 --- a/assets/badges/geotiff-file.svg +++ b/assets/badges/geotiff-file.svg @@ -1 +1 @@ -bundle: 1.309149 MBbundle1.309149 MB \ No newline at end of file +bundle: 76.511 kBbundle76.511 kB \ No newline at end of file diff --git a/assets/badges/geotiff-gzip-cover.svg b/assets/badges/geotiff-gzip-cover.svg index 79eadbb0..36f1baa2 100644 --- a/assets/badges/geotiff-gzip-cover.svg +++ b/assets/badges/geotiff-gzip-cover.svg @@ -1 +1 @@ -gzip: 234.039 kBgzip234.039 kB \ No newline at end of file +gzip: 28.594 kBgzip28.594 kB \ No newline at end of file diff --git a/assets/badges/geotiff-gzip.svg b/assets/badges/geotiff-gzip.svg index 4c56b71a..a4b571cd 100644 --- a/assets/badges/geotiff-gzip.svg +++ b/assets/badges/geotiff-gzip.svg @@ -1 +1 @@ -gzip: 234.039 kBgzip234.039 kB \ No newline at end of file +gzip: 28.594 kBgzip28.594 kB \ No newline at end of file diff --git a/assets/badges/grib2-brotli.svg b/assets/badges/grib2-brotli.svg index 07fcc47e..07c3ff89 100644 --- a/assets/badges/grib2-brotli.svg +++ b/assets/badges/grib2-brotli.svg @@ -1 +1 @@ -brotli: 45.241 kBbrotli45.241 kB \ No newline at end of file +brotli: 49.223 kBbrotli49.223 kB \ No newline at end of file diff --git a/assets/badges/grib2-file.svg b/assets/badges/grib2-file.svg index b1e96920..cadded1e 100644 --- a/assets/badges/grib2-file.svg +++ b/assets/badges/grib2-file.svg @@ -1 +1 @@ -bundle: 233.378 kBbundle233.378 kB \ No newline at end of file +bundle: 245.388 kBbundle245.388 kB \ No newline at end of file diff --git a/assets/badges/grib2-gzip-cover.svg b/assets/badges/grib2-gzip-cover.svg index 16a8cbf2..4166bdf2 100644 --- a/assets/badges/grib2-gzip-cover.svg +++ b/assets/badges/grib2-gzip-cover.svg @@ -1 +1 @@ -gzip: 54.826 kBgzip54.826 kB \ No newline at end of file +gzip: 59.701 kBgzip59.701 kB \ No newline at end of file diff --git a/assets/badges/grib2-gzip.svg b/assets/badges/grib2-gzip.svg index 2c7c3b63..0605a85c 100644 --- a/assets/badges/grib2-gzip.svg +++ b/assets/badges/grib2-gzip.svg @@ -1 +1 @@ -gzip: 54.826 kBgzip54.826 kB \ No newline at end of file +gzip: 59.701 kBgzip59.701 kB \ No newline at end of file diff --git a/assets/badges/gtfs-brotli.svg b/assets/badges/gtfs-brotli.svg index cdd19916..92967ba6 100644 --- a/assets/badges/gtfs-brotli.svg +++ b/assets/badges/gtfs-brotli.svg @@ -1 +1 @@ -brotli: 8.63 kBbrotli8.63 kB \ No newline at end of file +brotli: 12.531 kBbrotli12.531 kB \ No newline at end of file diff --git a/assets/badges/gtfs-file.svg b/assets/badges/gtfs-file.svg index e3b621f5..968ee04d 100644 --- a/assets/badges/gtfs-file.svg +++ b/assets/badges/gtfs-file.svg @@ -1 +1 @@ -bundle: 39.865 kBbundle39.865 kB \ No newline at end of file +bundle: 51.795 kBbundle51.795 kB \ No newline at end of file diff --git a/assets/badges/gtfs-gzip-cover.svg b/assets/badges/gtfs-gzip-cover.svg index f8ea6bcc..e0a2bb06 100644 --- a/assets/badges/gtfs-gzip-cover.svg +++ b/assets/badges/gtfs-gzip-cover.svg @@ -1 +1 @@ -gzip: 9.722 kBgzip9.722 kB \ No newline at end of file +gzip: 14.323 kBgzip14.323 kB \ No newline at end of file diff --git a/assets/badges/gtfs-gzip.svg b/assets/badges/gtfs-gzip.svg index b80c0a9d..ebff2b7d 100644 --- a/assets/badges/gtfs-gzip.svg +++ b/assets/badges/gtfs-gzip.svg @@ -1 +1 @@ -gzip: 9.722 kBgzip9.722 kB \ No newline at end of file +gzip: 14.323 kBgzip14.323 kB \ No newline at end of file diff --git a/assets/badges/gzip-brotli.svg b/assets/badges/gzip-brotli.svg index b3e1fc61..80419c4a 100644 --- a/assets/badges/gzip-brotli.svg +++ b/assets/badges/gzip-brotli.svg @@ -1 +1 @@ -brotli: 559 Bytesbrotli559 Bytes \ No newline at end of file +brotli: 710 Bytesbrotli710 Bytes \ No newline at end of file diff --git a/assets/badges/gzip-file.svg b/assets/badges/gzip-file.svg index 07ffc3bf..c09f396b 100644 --- a/assets/badges/gzip-file.svg +++ b/assets/badges/gzip-file.svg @@ -1 +1 @@ -bundle: 964 Bytesbundle964 Bytes \ No newline at end of file +bundle: 1.316 kBbundle1.316 kB \ No newline at end of file diff --git a/assets/badges/gzip-gzip-cover.svg b/assets/badges/gzip-gzip-cover.svg index 96b9bf4b..00a72b06 100644 --- a/assets/badges/gzip-gzip-cover.svg +++ b/assets/badges/gzip-gzip-cover.svg @@ -1 +1 @@ -gzip: 616 Bytesgzip616 Bytes \ No newline at end of file +gzip: 774 Bytesgzip774 Bytes \ No newline at end of file diff --git a/assets/badges/gzip-gzip.svg b/assets/badges/gzip-gzip.svg index 4930801a..434eeeca 100644 --- a/assets/badges/gzip-gzip.svg +++ b/assets/badges/gzip-gzip.svg @@ -1 +1 @@ -gzip: 616 Bytesgzip616 Bytes \ No newline at end of file +gzip: 774 Bytesgzip774 Bytes \ No newline at end of file diff --git a/assets/badges/jpeg-brotli.svg b/assets/badges/jpeg-brotli.svg index 105c6396..946dda50 100644 --- a/assets/badges/jpeg-brotli.svg +++ b/assets/badges/jpeg-brotli.svg @@ -1 +1 @@ -brotli: 4.735 kBbrotli4.735 kB \ No newline at end of file +brotli: 8.537 kBbrotli8.537 kB \ No newline at end of file diff --git a/assets/badges/jpeg-file.svg b/assets/badges/jpeg-file.svg index 21430936..d107cdda 100644 --- a/assets/badges/jpeg-file.svg +++ b/assets/badges/jpeg-file.svg @@ -1 +1 @@ -bundle: 13.858 kBbundle13.858 kB \ No newline at end of file +bundle: 25.85 kBbundle25.85 kB \ No newline at end of file diff --git a/assets/badges/jpeg-gzip-cover.svg b/assets/badges/jpeg-gzip-cover.svg index 65248556..0be0d537 100644 --- a/assets/badges/jpeg-gzip-cover.svg +++ b/assets/badges/jpeg-gzip-cover.svg @@ -1 +1 @@ -gzip: 5.351 kBgzip5.351 kB \ No newline at end of file +gzip: 9.756 kBgzip9.756 kB \ No newline at end of file diff --git a/assets/badges/jpeg-gzip.svg b/assets/badges/jpeg-gzip.svg index b9595f80..db95851e 100644 --- a/assets/badges/jpeg-gzip.svg +++ b/assets/badges/jpeg-gzip.svg @@ -1 +1 @@ -gzip: 5.351 kBgzip5.351 kB \ No newline at end of file +gzip: 9.756 kBgzip9.756 kB \ No newline at end of file diff --git a/assets/badges/jpeg2000-brotli.svg b/assets/badges/jpeg2000-brotli.svg index 4cfb2b8f..b8ea02f4 100644 --- a/assets/badges/jpeg2000-brotli.svg +++ b/assets/badges/jpeg2000-brotli.svg @@ -1 +1 @@ -brotli: 8.973 kBbrotli8.973 kB \ No newline at end of file +brotli: 12.9 kBbrotli12.9 kB \ No newline at end of file diff --git a/assets/badges/jpeg2000-file.svg b/assets/badges/jpeg2000-file.svg index 0250d939..6ab4f37e 100644 --- a/assets/badges/jpeg2000-file.svg +++ b/assets/badges/jpeg2000-file.svg @@ -1 +1 @@ -bundle: 31.037 kBbundle31.037 kB \ No newline at end of file +bundle: 42.976 kBbundle42.976 kB \ No newline at end of file diff --git a/assets/badges/jpeg2000-gzip-cover.svg b/assets/badges/jpeg2000-gzip-cover.svg index 0a19000b..125f828b 100644 --- a/assets/badges/jpeg2000-gzip-cover.svg +++ b/assets/badges/jpeg2000-gzip-cover.svg @@ -1 +1 @@ -gzip: 10.171 kBgzip10.171 kB \ No newline at end of file +gzip: 14.745 kBgzip14.745 kB \ No newline at end of file diff --git a/assets/badges/jpeg2000-gzip.svg b/assets/badges/jpeg2000-gzip.svg index 0cf064e0..5b91cb14 100644 --- a/assets/badges/jpeg2000-gzip.svg +++ b/assets/badges/jpeg2000-gzip.svg @@ -1 +1 @@ -gzip: 10.171 kBgzip10.171 kB \ No newline at end of file +gzip: 14.745 kBgzip14.745 kB \ No newline at end of file diff --git a/assets/badges/json-brotli.svg b/assets/badges/json-brotli.svg index 9e10ca8c..5d7fb161 100644 --- a/assets/badges/json-brotli.svg +++ b/assets/badges/json-brotli.svg @@ -1 +1 @@ -brotli: 1.281 kBbrotli1.281 kB \ No newline at end of file +brotli: 5.214 kBbrotli5.214 kB \ No newline at end of file diff --git a/assets/badges/json-file.svg b/assets/badges/json-file.svg index fb80b024..ffd1ec03 100644 --- a/assets/badges/json-file.svg +++ b/assets/badges/json-file.svg @@ -1 +1 @@ -bundle: 3.639 kBbundle3.639 kB \ No newline at end of file +bundle: 15.495 kBbundle15.495 kB \ No newline at end of file diff --git a/assets/badges/json-gzip-cover.svg b/assets/badges/json-gzip-cover.svg index 5121fad8..bca91b58 100644 --- a/assets/badges/json-gzip-cover.svg +++ b/assets/badges/json-gzip-cover.svg @@ -1 +1 @@ -gzip: 1.402 kBgzip1.402 kB \ No newline at end of file +gzip: 5.924 kBgzip5.924 kB \ No newline at end of file diff --git a/assets/badges/json-gzip.svg b/assets/badges/json-gzip.svg index 6f5cda74..6d82ae73 100644 --- a/assets/badges/json-gzip.svg +++ b/assets/badges/json-gzip.svg @@ -1 +1 @@ -gzip: 1.402 kBgzip1.402 kB \ No newline at end of file +gzip: 5.924 kBgzip5.924 kB \ No newline at end of file diff --git a/assets/badges/kd-brotli.svg b/assets/badges/kd-brotli.svg index c0b14e05..d4a5b3f0 100644 --- a/assets/badges/kd-brotli.svg +++ b/assets/badges/kd-brotli.svg @@ -1 +1 @@ -brotli: 193 Bytesbrotli193 Bytes \ No newline at end of file +brotli: 4.199 kBbrotli4.199 kB \ No newline at end of file diff --git a/assets/badges/kd-file.svg b/assets/badges/kd-file.svg index 8484c3ba..e2050f18 100644 --- a/assets/badges/kd-file.svg +++ b/assets/badges/kd-file.svg @@ -1 +1 @@ -bundle: 276 Bytesbundle276 Bytes \ No newline at end of file +bundle: 12.156 kBbundle12.156 kB \ No newline at end of file diff --git a/assets/badges/kd-gzip-cover.svg b/assets/badges/kd-gzip-cover.svg index 3a7c540a..4fcbd32b 100644 --- a/assets/badges/kd-gzip-cover.svg +++ b/assets/badges/kd-gzip-cover.svg @@ -1 +1 @@ -gzip: 199 Bytesgzip199 Bytes \ No newline at end of file +gzip: 4.833 kBgzip4.833 kB \ No newline at end of file diff --git a/assets/badges/kd-gzip.svg b/assets/badges/kd-gzip.svg index 7853419f..f6622d4e 100644 --- a/assets/badges/kd-gzip.svg +++ b/assets/badges/kd-gzip.svg @@ -1 +1 @@ -gzip: 199 Bytesgzip199 Bytes \ No newline at end of file +gzip: 4.833 kBgzip4.833 kB \ No newline at end of file diff --git a/assets/badges/kv-brotli.svg b/assets/badges/kv-brotli.svg index c0b14e05..d4a5b3f0 100644 --- a/assets/badges/kv-brotli.svg +++ b/assets/badges/kv-brotli.svg @@ -1 +1 @@ -brotli: 193 Bytesbrotli193 Bytes \ No newline at end of file +brotli: 4.199 kBbrotli4.199 kB \ No newline at end of file diff --git a/assets/badges/kv-file.svg b/assets/badges/kv-file.svg index 8484c3ba..e2050f18 100644 --- a/assets/badges/kv-file.svg +++ b/assets/badges/kv-file.svg @@ -1 +1 @@ -bundle: 276 Bytesbundle276 Bytes \ No newline at end of file +bundle: 12.156 kBbundle12.156 kB \ No newline at end of file diff --git a/assets/badges/kv-gzip-cover.svg b/assets/badges/kv-gzip-cover.svg index 3a7c540a..4fcbd32b 100644 --- a/assets/badges/kv-gzip-cover.svg +++ b/assets/badges/kv-gzip-cover.svg @@ -1 +1 @@ -gzip: 199 Bytesgzip199 Bytes \ No newline at end of file +gzip: 4.833 kBgzip4.833 kB \ No newline at end of file diff --git a/assets/badges/kv-gzip.svg b/assets/badges/kv-gzip.svg index 7853419f..f6622d4e 100644 --- a/assets/badges/kv-gzip.svg +++ b/assets/badges/kv-gzip.svg @@ -1 +1 @@ -gzip: 199 Bytesgzip199 Bytes \ No newline at end of file +gzip: 4.833 kBgzip4.833 kB \ No newline at end of file diff --git a/assets/badges/lanczos-brotli.svg b/assets/badges/lanczos-brotli.svg index 86ef267f..1f542e30 100644 --- a/assets/badges/lanczos-brotli.svg +++ b/assets/badges/lanczos-brotli.svg @@ -1 +1 @@ -brotli: 1.258 kBbrotli1.258 kB \ No newline at end of file +brotli: 5.199 kBbrotli5.199 kB \ No newline at end of file diff --git a/assets/badges/lanczos-file.svg b/assets/badges/lanczos-file.svg index 1bfa4f2f..335815dd 100644 --- a/assets/badges/lanczos-file.svg +++ b/assets/badges/lanczos-file.svg @@ -1 +1 @@ -bundle: 2.797 kBbundle2.797 kB \ No newline at end of file +bundle: 14.689 kBbundle14.689 kB \ No newline at end of file diff --git a/assets/badges/lanczos-gzip-cover.svg b/assets/badges/lanczos-gzip-cover.svg index b9300afc..8d3342c1 100644 --- a/assets/badges/lanczos-gzip-cover.svg +++ b/assets/badges/lanczos-gzip-cover.svg @@ -1 +1 @@ -gzip: 1.388 kBgzip1.388 kB \ No newline at end of file +gzip: 5.947 kBgzip5.947 kB \ No newline at end of file diff --git a/assets/badges/lanczos-gzip.svg b/assets/badges/lanczos-gzip.svg index 090af9f3..fd3a86c7 100644 --- a/assets/badges/lanczos-gzip.svg +++ b/assets/badges/lanczos-gzip.svg @@ -1 +1 @@ -gzip: 1.388 kBgzip1.388 kB \ No newline at end of file +gzip: 5.947 kBgzip5.947 kB \ No newline at end of file diff --git a/assets/badges/lzw-brotli.svg b/assets/badges/lzw-brotli.svg index 6bf11f1c..9fe17eaa 100644 --- a/assets/badges/lzw-brotli.svg +++ b/assets/badges/lzw-brotli.svg @@ -1 +1 @@ -brotli: 822 Bytesbrotli822 Bytes \ No newline at end of file +brotli: 4.771 kBbrotli4.771 kB \ No newline at end of file diff --git a/assets/badges/lzw-file.svg b/assets/badges/lzw-file.svg index 2e168135..a7444502 100644 --- a/assets/badges/lzw-file.svg +++ b/assets/badges/lzw-file.svg @@ -1 +1 @@ -bundle: 1.602 kBbundle1.602 kB \ No newline at end of file +bundle: 13.489 kBbundle13.489 kB \ No newline at end of file diff --git a/assets/badges/lzw-gzip-cover.svg b/assets/badges/lzw-gzip-cover.svg index 52db2aed..b6fb858f 100644 --- a/assets/badges/lzw-gzip-cover.svg +++ b/assets/badges/lzw-gzip-cover.svg @@ -1 +1 @@ -gzip: 900 Bytesgzip900 Bytes \ No newline at end of file +gzip: 5.456 kBgzip5.456 kB \ No newline at end of file diff --git a/assets/badges/lzw-gzip.svg b/assets/badges/lzw-gzip.svg index fc99afb4..4b656571 100644 --- a/assets/badges/lzw-gzip.svg +++ b/assets/badges/lzw-gzip.svg @@ -1 +1 @@ -gzip: 900 Bytesgzip900 Bytes \ No newline at end of file +gzip: 5.456 kBgzip5.456 kB \ No newline at end of file diff --git a/assets/badges/mgrs-brotli.svg b/assets/badges/mgrs-brotli.svg index c9afb611..857016a2 100644 --- a/assets/badges/mgrs-brotli.svg +++ b/assets/badges/mgrs-brotli.svg @@ -1 +1 @@ -brotli: 2.19 kBbrotli2.19 kB \ No newline at end of file +brotli: 2.2 kBbrotli2.2 kB \ No newline at end of file diff --git a/assets/badges/multimap-brotli.svg b/assets/badges/multimap-brotli.svg index c0b14e05..d4a5b3f0 100644 --- a/assets/badges/multimap-brotli.svg +++ b/assets/badges/multimap-brotli.svg @@ -1 +1 @@ -brotli: 193 Bytesbrotli193 Bytes \ No newline at end of file +brotli: 4.199 kBbrotli4.199 kB \ No newline at end of file diff --git a/assets/badges/multimap-file.svg b/assets/badges/multimap-file.svg index 8484c3ba..e2050f18 100644 --- a/assets/badges/multimap-file.svg +++ b/assets/badges/multimap-file.svg @@ -1 +1 @@ -bundle: 276 Bytesbundle276 Bytes \ No newline at end of file +bundle: 12.156 kBbundle12.156 kB \ No newline at end of file diff --git a/assets/badges/multimap-gzip-cover.svg b/assets/badges/multimap-gzip-cover.svg index 3a7c540a..4fcbd32b 100644 --- a/assets/badges/multimap-gzip-cover.svg +++ b/assets/badges/multimap-gzip-cover.svg @@ -1 +1 @@ -gzip: 199 Bytesgzip199 Bytes \ No newline at end of file +gzip: 4.833 kBgzip4.833 kB \ No newline at end of file diff --git a/assets/badges/multimap-gzip.svg b/assets/badges/multimap-gzip.svg index 7853419f..f6622d4e 100644 --- a/assets/badges/multimap-gzip.svg +++ b/assets/badges/multimap-gzip.svg @@ -1 +1 @@ -gzip: 199 Bytesgzip199 Bytes \ No newline at end of file +gzip: 4.833 kBgzip4.833 kB \ No newline at end of file diff --git a/assets/badges/nadgrid-brotli.svg b/assets/badges/nadgrid-brotli.svg index b6a60e9b..caae2c30 100644 --- a/assets/badges/nadgrid-brotli.svg +++ b/assets/badges/nadgrid-brotli.svg @@ -1 +1 @@ -brotli: 1.237 kBbrotli1.237 kB \ No newline at end of file +brotli: 5.174 kBbrotli5.174 kB \ No newline at end of file diff --git a/assets/badges/nadgrid-file.svg b/assets/badges/nadgrid-file.svg index 37a6d549..0b59a545 100644 --- a/assets/badges/nadgrid-file.svg +++ b/assets/badges/nadgrid-file.svg @@ -1 +1 @@ -bundle: 3.024 kBbundle3.024 kB \ No newline at end of file +bundle: 14.912 kBbundle14.912 kB \ No newline at end of file diff --git a/assets/badges/nadgrid-gzip-cover.svg b/assets/badges/nadgrid-gzip-cover.svg index 22859aeb..27e2d74d 100644 --- a/assets/badges/nadgrid-gzip-cover.svg +++ b/assets/badges/nadgrid-gzip-cover.svg @@ -1 +1 @@ -gzip: 1.363 kBgzip1.363 kB \ No newline at end of file +gzip: 5.921 kBgzip5.921 kB \ No newline at end of file diff --git a/assets/badges/nadgrid-gzip.svg b/assets/badges/nadgrid-gzip.svg index 01043411..f1162ba3 100644 --- a/assets/badges/nadgrid-gzip.svg +++ b/assets/badges/nadgrid-gzip.svg @@ -1 +1 @@ -gzip: 1.363 kBgzip1.363 kB \ No newline at end of file +gzip: 5.921 kBgzip5.921 kB \ No newline at end of file diff --git a/assets/badges/netcdf-brotli.svg b/assets/badges/netcdf-brotli.svg index 548384c8..27343953 100644 --- a/assets/badges/netcdf-brotli.svg +++ b/assets/badges/netcdf-brotli.svg @@ -1 +1 @@ -brotli: 1.622 kBbrotli1.622 kB \ No newline at end of file +brotli: 5.541 kBbrotli5.541 kB \ No newline at end of file diff --git a/assets/badges/netcdf-file.svg b/assets/badges/netcdf-file.svg index 7edb1e5f..2dfa6d40 100644 --- a/assets/badges/netcdf-file.svg +++ b/assets/badges/netcdf-file.svg @@ -1 +1 @@ -bundle: 4.532 kBbundle4.532 kB \ No newline at end of file +bundle: 16.412 kBbundle16.412 kB \ No newline at end of file diff --git a/assets/badges/netcdf-gzip-cover.svg b/assets/badges/netcdf-gzip-cover.svg index f64e2cf1..e4cec82e 100644 --- a/assets/badges/netcdf-gzip-cover.svg +++ b/assets/badges/netcdf-gzip-cover.svg @@ -1 +1 @@ -gzip: 1.813 kBgzip1.813 kB \ No newline at end of file +gzip: 6.353 kBgzip6.353 kB \ No newline at end of file diff --git a/assets/badges/netcdf-gzip.svg b/assets/badges/netcdf-gzip.svg index 947ad8fc..4f0aaec8 100644 --- a/assets/badges/netcdf-gzip.svg +++ b/assets/badges/netcdf-gzip.svg @@ -1 +1 @@ -gzip: 1.813 kBgzip1.813 kB \ No newline at end of file +gzip: 6.353 kBgzip6.353 kB \ No newline at end of file diff --git a/assets/badges/orthodrome-brotli.svg b/assets/badges/orthodrome-brotli.svg index 0661fd13..d5585554 100644 --- a/assets/badges/orthodrome-brotli.svg +++ b/assets/badges/orthodrome-brotli.svg @@ -1 +1 @@ -brotli: 554 Bytesbrotli554 Bytes \ No newline at end of file +brotli: 4.522 kBbrotli4.522 kB \ No newline at end of file diff --git a/assets/badges/orthodrome-file.svg b/assets/badges/orthodrome-file.svg index a27bfe63..f4c16761 100644 --- a/assets/badges/orthodrome-file.svg +++ b/assets/badges/orthodrome-file.svg @@ -1 +1 @@ -bundle: 1.053 kBbundle1.053 kB \ No newline at end of file +bundle: 12.94 kBbundle12.94 kB \ No newline at end of file diff --git a/assets/badges/orthodrome-gzip-cover.svg b/assets/badges/orthodrome-gzip-cover.svg index 68ecfce7..588edcbc 100644 --- a/assets/badges/orthodrome-gzip-cover.svg +++ b/assets/badges/orthodrome-gzip-cover.svg @@ -1 +1 @@ -gzip: 618 Bytesgzip618 Bytes \ No newline at end of file +gzip: 5.201 kBgzip5.201 kB \ No newline at end of file diff --git a/assets/badges/orthodrome-gzip.svg b/assets/badges/orthodrome-gzip.svg index b20abb0f..0f119ef4 100644 --- a/assets/badges/orthodrome-gzip.svg +++ b/assets/badges/orthodrome-gzip.svg @@ -1 +1 @@ -gzip: 618 Bytesgzip618 Bytes \ No newline at end of file +gzip: 5.201 kBgzip5.201 kB \ No newline at end of file diff --git a/assets/badges/osm-brotli.svg b/assets/badges/osm-brotli.svg index ef2f6151..1976f120 100644 --- a/assets/badges/osm-brotli.svg +++ b/assets/badges/osm-brotli.svg @@ -1 +1 @@ -brotli: 7.063 kBbrotli7.063 kB \ No newline at end of file +brotli: 10.93 kBbrotli10.93 kB \ No newline at end of file diff --git a/assets/badges/osm-file.svg b/assets/badges/osm-file.svg index 24dc419e..14a5cf49 100644 --- a/assets/badges/osm-file.svg +++ b/assets/badges/osm-file.svg @@ -1 +1 @@ -bundle: 26.671 kBbundle26.671 kB \ No newline at end of file +bundle: 38.612 kBbundle38.612 kB \ No newline at end of file diff --git a/assets/badges/osm-gzip-cover.svg b/assets/badges/osm-gzip-cover.svg index 6bef4a25..16e824a1 100644 --- a/assets/badges/osm-gzip-cover.svg +++ b/assets/badges/osm-gzip-cover.svg @@ -1 +1 @@ -gzip: 7.867 kBgzip7.867 kB \ No newline at end of file +gzip: 12.374 kBgzip12.374 kB \ No newline at end of file diff --git a/assets/badges/osm-gzip.svg b/assets/badges/osm-gzip.svg index c1121f71..590390af 100644 --- a/assets/badges/osm-gzip.svg +++ b/assets/badges/osm-gzip.svg @@ -1 +1 @@ -gzip: 7.867 kBgzip7.867 kB \ No newline at end of file +gzip: 12.374 kBgzip12.374 kB \ No newline at end of file diff --git a/assets/badges/pmtiles-brotli.svg b/assets/badges/pmtiles-brotli.svg index a410e933..a95b0368 100644 --- a/assets/badges/pmtiles-brotli.svg +++ b/assets/badges/pmtiles-brotli.svg @@ -1 +1 @@ -brotli: 2.64 kBbrotli2.64 kB \ No newline at end of file +brotli: 6.573 kBbrotli6.573 kB \ No newline at end of file diff --git a/assets/badges/pmtiles-file.svg b/assets/badges/pmtiles-file.svg index f03cf6a3..8b3e6cb0 100644 --- a/assets/badges/pmtiles-file.svg +++ b/assets/badges/pmtiles-file.svg @@ -1 +1 @@ -bundle: 7.478 kBbundle7.478 kB \ No newline at end of file +bundle: 19.61 kBbundle19.61 kB \ No newline at end of file diff --git a/assets/badges/pmtiles-gzip-cover.svg b/assets/badges/pmtiles-gzip-cover.svg index 51be14a1..dd92fb0c 100644 --- a/assets/badges/pmtiles-gzip-cover.svg +++ b/assets/badges/pmtiles-gzip-cover.svg @@ -1 +1 @@ -gzip: 2.932 kBgzip2.932 kB \ No newline at end of file +gzip: 7.467 kBgzip7.467 kB \ No newline at end of file diff --git a/assets/badges/pmtiles-gzip.svg b/assets/badges/pmtiles-gzip.svg index d00ffe62..0ba38dff 100644 --- a/assets/badges/pmtiles-gzip.svg +++ b/assets/badges/pmtiles-gzip.svg @@ -1 +1 @@ -gzip: 2.932 kBgzip2.932 kB \ No newline at end of file +gzip: 7.467 kBgzip7.467 kB \ No newline at end of file diff --git a/assets/badges/pointCluster-brotli.svg b/assets/badges/pointCluster-brotli.svg index 7e7132b4..e36812c2 100644 --- a/assets/badges/pointCluster-brotli.svg +++ b/assets/badges/pointCluster-brotli.svg @@ -1 +1 @@ -brotli: 6.271 kBbrotli6.271 kB \ No newline at end of file +brotli: 9.93 kBbrotli9.93 kB \ No newline at end of file diff --git a/assets/badges/pointCluster-file.svg b/assets/badges/pointCluster-file.svg index 358d35fa..574f8ac0 100644 --- a/assets/badges/pointCluster-file.svg +++ b/assets/badges/pointCluster-file.svg @@ -1 +1 @@ -bundle: 18.557 kBbundle18.557 kB \ No newline at end of file +bundle: 30.569 kBbundle30.569 kB \ No newline at end of file diff --git a/assets/badges/pointCluster-gzip-cover.svg b/assets/badges/pointCluster-gzip-cover.svg index bb7dfcf6..1feb560d 100644 --- a/assets/badges/pointCluster-gzip-cover.svg +++ b/assets/badges/pointCluster-gzip-cover.svg @@ -1 +1 @@ -gzip: 6.879 kBgzip6.879 kB \ No newline at end of file +gzip: 11.16 kBgzip11.16 kB \ No newline at end of file diff --git a/assets/badges/pointCluster-gzip.svg b/assets/badges/pointCluster-gzip.svg index 28cb8bbc..82ad3873 100644 --- a/assets/badges/pointCluster-gzip.svg +++ b/assets/badges/pointCluster-gzip.svg @@ -1 +1 @@ -gzip: 6.879 kBgzip6.879 kB \ No newline at end of file +gzip: 11.16 kBgzip11.16 kB \ No newline at end of file diff --git a/assets/badges/pointIndex-brotli.svg b/assets/badges/pointIndex-brotli.svg index 56ab12ce..220339bd 100644 --- a/assets/badges/pointIndex-brotli.svg +++ b/assets/badges/pointIndex-brotli.svg @@ -1 +1 @@ -brotli: 2.511 kBbrotli2.511 kB \ No newline at end of file +brotli: 6.19 kBbrotli6.19 kB \ No newline at end of file diff --git a/assets/badges/pointIndex-file.svg b/assets/badges/pointIndex-file.svg index 68f3d26e..488800f3 100644 --- a/assets/badges/pointIndex-file.svg +++ b/assets/badges/pointIndex-file.svg @@ -1 +1 @@ -bundle: 6.405 kBbundle6.405 kB \ No newline at end of file +bundle: 18.342 kBbundle18.342 kB \ No newline at end of file diff --git a/assets/badges/pointIndex-gzip-cover.svg b/assets/badges/pointIndex-gzip-cover.svg index 6b769fda..2512b80b 100644 --- a/assets/badges/pointIndex-gzip-cover.svg +++ b/assets/badges/pointIndex-gzip-cover.svg @@ -1 +1 @@ -gzip: 2.751 kBgzip2.751 kB \ No newline at end of file +gzip: 7.003 kBgzip7.003 kB \ No newline at end of file diff --git a/assets/badges/pointIndex-gzip.svg b/assets/badges/pointIndex-gzip.svg index 00a9df14..88ab2aa1 100644 --- a/assets/badges/pointIndex-gzip.svg +++ b/assets/badges/pointIndex-gzip.svg @@ -1 +1 @@ -gzip: 2.751 kBgzip2.751 kB \ No newline at end of file +gzip: 7.003 kBgzip7.003 kB \ No newline at end of file diff --git a/assets/badges/pointIndexFast-brotli.svg b/assets/badges/pointIndexFast-brotli.svg index a1f7e06b..14f1d06e 100644 --- a/assets/badges/pointIndexFast-brotli.svg +++ b/assets/badges/pointIndexFast-brotli.svg @@ -1 +1 @@ -brotli: 2.026 kBbrotli2.026 kB \ No newline at end of file +brotli: 5.964 kBbrotli5.964 kB \ No newline at end of file diff --git a/assets/badges/pointIndexFast-file.svg b/assets/badges/pointIndexFast-file.svg index ad45d563..45ca08bb 100644 --- a/assets/badges/pointIndexFast-file.svg +++ b/assets/badges/pointIndexFast-file.svg @@ -1 +1 @@ -bundle: 5.138 kBbundle5.138 kB \ No newline at end of file +bundle: 17.047 kBbundle17.047 kB \ No newline at end of file diff --git a/assets/badges/pointIndexFast-gzip-cover.svg b/assets/badges/pointIndexFast-gzip-cover.svg index f68ed8d8..7ec4b160 100644 --- a/assets/badges/pointIndexFast-gzip-cover.svg +++ b/assets/badges/pointIndexFast-gzip-cover.svg @@ -1 +1 @@ -gzip: 2.218 kBgzip2.218 kB \ No newline at end of file +gzip: 6.777 kBgzip6.777 kB \ No newline at end of file diff --git a/assets/badges/pointIndexFast-gzip.svg b/assets/badges/pointIndexFast-gzip.svg index c16ec045..cab628f5 100644 --- a/assets/badges/pointIndexFast-gzip.svg +++ b/assets/badges/pointIndexFast-gzip.svg @@ -1 +1 @@ -gzip: 2.218 kBgzip2.218 kB \ No newline at end of file +gzip: 6.777 kBgzip6.777 kB \ No newline at end of file diff --git a/assets/badges/polylabel-brotli.svg b/assets/badges/polylabel-brotli.svg index 6382f287..8a6d6f7c 100644 --- a/assets/badges/polylabel-brotli.svg +++ b/assets/badges/polylabel-brotli.svg @@ -1 +1 @@ -brotli: 1.137 kBbrotli1.137 kB \ No newline at end of file +brotli: 5.053 kBbrotli5.053 kB \ No newline at end of file diff --git a/assets/badges/polylabel-file.svg b/assets/badges/polylabel-file.svg index 35e52105..d2460424 100644 --- a/assets/badges/polylabel-file.svg +++ b/assets/badges/polylabel-file.svg @@ -1 +1 @@ -bundle: 2.25 kBbundle2.25 kB \ No newline at end of file +bundle: 14.138 kBbundle14.138 kB \ No newline at end of file diff --git a/assets/badges/polylabel-gzip-cover.svg b/assets/badges/polylabel-gzip-cover.svg index 101128c0..df7cbba6 100644 --- a/assets/badges/polylabel-gzip-cover.svg +++ b/assets/badges/polylabel-gzip-cover.svg @@ -1 +1 @@ -gzip: 1.215 kBgzip1.215 kB \ No newline at end of file +gzip: 5.82 kBgzip5.82 kB \ No newline at end of file diff --git a/assets/badges/polylabel-gzip.svg b/assets/badges/polylabel-gzip.svg index 707184b7..e1b940fa 100644 --- a/assets/badges/polylabel-gzip.svg +++ b/assets/badges/polylabel-gzip.svg @@ -1 +1 @@ -gzip: 1.215 kBgzip1.215 kB \ No newline at end of file +gzip: 5.82 kBgzip5.82 kB \ No newline at end of file diff --git a/assets/badges/priorityQueue-brotli.svg b/assets/badges/priorityQueue-brotli.svg index 4b834645..fa49e0a0 100644 --- a/assets/badges/priorityQueue-brotli.svg +++ b/assets/badges/priorityQueue-brotli.svg @@ -1 +1 @@ -brotli: 508 Bytesbrotli508 Bytes \ No newline at end of file +brotli: 4.472 kBbrotli4.472 kB \ No newline at end of file diff --git a/assets/badges/priorityQueue-file.svg b/assets/badges/priorityQueue-file.svg index a77f9a72..cd49a9bc 100644 --- a/assets/badges/priorityQueue-file.svg +++ b/assets/badges/priorityQueue-file.svg @@ -1 +1 @@ -bundle: 969 Bytesbundle969 Bytes \ No newline at end of file +bundle: 12.847 kBbundle12.847 kB \ No newline at end of file diff --git a/assets/badges/priorityQueue-gzip-cover.svg b/assets/badges/priorityQueue-gzip-cover.svg index 43576007..6d71e16b 100644 --- a/assets/badges/priorityQueue-gzip-cover.svg +++ b/assets/badges/priorityQueue-gzip-cover.svg @@ -1 +1 @@ -gzip: 540 Bytesgzip540 Bytes \ No newline at end of file +gzip: 5.125 kBgzip5.125 kB \ No newline at end of file diff --git a/assets/badges/priorityQueue-gzip.svg b/assets/badges/priorityQueue-gzip.svg index a48edac4..7925b315 100644 --- a/assets/badges/priorityQueue-gzip.svg +++ b/assets/badges/priorityQueue-gzip.svg @@ -1 +1 @@ -gzip: 540 Bytesgzip540 Bytes \ No newline at end of file +gzip: 5.125 kBgzip5.125 kB \ No newline at end of file diff --git a/assets/badges/projections-brotli.svg b/assets/badges/projections-brotli.svg index d2940b5c..daad8f4d 100644 --- a/assets/badges/projections-brotli.svg +++ b/assets/badges/projections-brotli.svg @@ -1 +1 @@ -brotli: 121.655 kBbrotli121.655 kB \ No newline at end of file +brotli: 147.373 kBbrotli147.373 kB \ No newline at end of file diff --git a/assets/badges/projections-file.svg b/assets/badges/projections-file.svg index 6a7d6b03..158bbac8 100644 --- a/assets/badges/projections-file.svg +++ b/assets/badges/projections-file.svg @@ -1 +1 @@ -bundle: 1.24021 MBbundle1.24021 MB \ No newline at end of file +bundle: 1.390583 MBbundle1.390583 MB \ No newline at end of file diff --git a/assets/badges/projections-gzip-cover.svg b/assets/badges/projections-gzip-cover.svg index 432fd702..e42e36c5 100644 --- a/assets/badges/projections-gzip-cover.svg +++ b/assets/badges/projections-gzip-cover.svg @@ -1 +1 @@ -gzip: 209.141 kBgzip209.141 kB \ No newline at end of file +gzip: 249.445 kBgzip249.445 kB \ No newline at end of file diff --git a/assets/badges/projections-gzip.svg b/assets/badges/projections-gzip.svg index 049d2be3..c680881d 100644 --- a/assets/badges/projections-gzip.svg +++ b/assets/badges/projections-gzip.svg @@ -1 +1 @@ -gzip: 209.141 kBgzip209.141 kB \ No newline at end of file +gzip: 249.445 kBgzip249.445 kB \ No newline at end of file diff --git a/assets/badges/protobuf-brotli.svg b/assets/badges/protobuf-brotli.svg index 21fca045..b67584d7 100644 --- a/assets/badges/protobuf-brotli.svg +++ b/assets/badges/protobuf-brotli.svg @@ -1 +1 @@ -brotli: 2.798 kBbrotli2.798 kB \ No newline at end of file +brotli: 6.701 kBbrotli6.701 kB \ No newline at end of file diff --git a/assets/badges/protobuf-file.svg b/assets/badges/protobuf-file.svg index 92c190ab..d5ec3a4b 100644 --- a/assets/badges/protobuf-file.svg +++ b/assets/badges/protobuf-file.svg @@ -1 +1 @@ -bundle: 10.439 kBbundle10.439 kB \ No newline at end of file +bundle: 22.341 kBbundle22.341 kB \ No newline at end of file diff --git a/assets/badges/protobuf-gzip-cover.svg b/assets/badges/protobuf-gzip-cover.svg index ad201bbe..ee665df8 100644 --- a/assets/badges/protobuf-gzip-cover.svg +++ b/assets/badges/protobuf-gzip-cover.svg @@ -1 +1 @@ -gzip: 3.085 kBgzip3.085 kB \ No newline at end of file +gzip: 7.6 kBgzip7.6 kB \ No newline at end of file diff --git a/assets/badges/protobuf-gzip.svg b/assets/badges/protobuf-gzip.svg index 5852aa25..746b2eec 100644 --- a/assets/badges/protobuf-gzip.svg +++ b/assets/badges/protobuf-gzip.svg @@ -1 +1 @@ -gzip: 3.085 kBgzip3.085 kB \ No newline at end of file +gzip: 7.6 kBgzip7.6 kB \ No newline at end of file diff --git a/assets/badges/sat-brotli.svg b/assets/badges/sat-brotli.svg index 8574b758..d4d1197c 100644 --- a/assets/badges/sat-brotli.svg +++ b/assets/badges/sat-brotli.svg @@ -1 +1 @@ -brotli: 9.239 kBbrotli9.239 kB \ No newline at end of file +brotli: 13.158 kBbrotli13.158 kB \ No newline at end of file diff --git a/assets/badges/sat-file.svg b/assets/badges/sat-file.svg index 87e787f1..9afe0139 100644 --- a/assets/badges/sat-file.svg +++ b/assets/badges/sat-file.svg @@ -1 +1 @@ -bundle: 22.382 kBbundle22.382 kB \ No newline at end of file +bundle: 34.444 kBbundle34.444 kB \ No newline at end of file diff --git a/assets/badges/sat-gzip-cover.svg b/assets/badges/sat-gzip-cover.svg index 0ddd7351..e23d5f6b 100644 --- a/assets/badges/sat-gzip-cover.svg +++ b/assets/badges/sat-gzip-cover.svg @@ -1 +1 @@ -gzip: 10.818 kBgzip10.818 kB \ No newline at end of file +gzip: 15.444 kBgzip15.444 kB \ No newline at end of file diff --git a/assets/badges/sat-gzip.svg b/assets/badges/sat-gzip.svg index 6373b154..7e953af4 100644 --- a/assets/badges/sat-gzip.svg +++ b/assets/badges/sat-gzip.svg @@ -1 +1 @@ -gzip: 10.818 kBgzip10.818 kB \ No newline at end of file +gzip: 15.444 kBgzip15.444 kB \ No newline at end of file diff --git a/assets/badges/shapefile-brotli.svg b/assets/badges/shapefile-brotli.svg index 74c7bb1a..b510e4d7 100644 --- a/assets/badges/shapefile-brotli.svg +++ b/assets/badges/shapefile-brotli.svg @@ -1 +1 @@ -brotli: 1.601 kBbrotli1.601 kB \ No newline at end of file +brotli: 5.517 kBbrotli5.517 kB \ No newline at end of file diff --git a/assets/badges/shapefile-file.svg b/assets/badges/shapefile-file.svg index 8a4d8ce3..4eaf1fdf 100644 --- a/assets/badges/shapefile-file.svg +++ b/assets/badges/shapefile-file.svg @@ -1 +1 @@ -bundle: 3.809 kBbundle3.809 kB \ No newline at end of file +bundle: 15.71 kBbundle15.71 kB \ No newline at end of file diff --git a/assets/badges/shapefile-gzip-cover.svg b/assets/badges/shapefile-gzip-cover.svg index 51384187..385ee092 100644 --- a/assets/badges/shapefile-gzip-cover.svg +++ b/assets/badges/shapefile-gzip-cover.svg @@ -1 +1 @@ -gzip: 1.765 kBgzip1.765 kB \ No newline at end of file +gzip: 6.291 kBgzip6.291 kB \ No newline at end of file diff --git a/assets/badges/shapefile-gzip.svg b/assets/badges/shapefile-gzip.svg index 6dfff9f1..e4350b51 100644 --- a/assets/badges/shapefile-gzip.svg +++ b/assets/badges/shapefile-gzip.svg @@ -1 +1 @@ -gzip: 1.765 kBgzip1.765 kB \ No newline at end of file +gzip: 6.291 kBgzip6.291 kB \ No newline at end of file diff --git a/assets/badges/tile-brotli.svg b/assets/badges/tile-brotli.svg index c0b14e05..31ba255e 100644 --- a/assets/badges/tile-brotli.svg +++ b/assets/badges/tile-brotli.svg @@ -1 +1 @@ -brotli: 193 Bytesbrotli193 Bytes \ No newline at end of file +brotli: 5.916 kBbrotli5.916 kB \ No newline at end of file diff --git a/assets/badges/tile-file.svg b/assets/badges/tile-file.svg index 8484c3ba..d7efb18e 100644 --- a/assets/badges/tile-file.svg +++ b/assets/badges/tile-file.svg @@ -1 +1 @@ -bundle: 276 Bytesbundle276 Bytes \ No newline at end of file +bundle: 17.207 kBbundle17.207 kB \ No newline at end of file diff --git a/assets/badges/tile-gzip-cover.svg b/assets/badges/tile-gzip-cover.svg index 3a7c540a..4bbf3fe0 100644 --- a/assets/badges/tile-gzip-cover.svg +++ b/assets/badges/tile-gzip-cover.svg @@ -1 +1 @@ -gzip: 199 Bytesgzip199 Bytes \ No newline at end of file +gzip: 6.737 kBgzip6.737 kB \ No newline at end of file diff --git a/assets/badges/tile-gzip.svg b/assets/badges/tile-gzip.svg index 7853419f..9ed1b346 100644 --- a/assets/badges/tile-gzip.svg +++ b/assets/badges/tile-gzip.svg @@ -1 +1 @@ -gzip: 199 Bytesgzip199 Bytes \ No newline at end of file +gzip: 6.737 kBgzip6.737 kB \ No newline at end of file diff --git a/assets/badges/transformer-brotli.svg b/assets/badges/transformer-brotli.svg index 2e243425..1ad920fc 100644 --- a/assets/badges/transformer-brotli.svg +++ b/assets/badges/transformer-brotli.svg @@ -1 +1 @@ -brotli: 9.011 kBbrotli9.011 kB \ No newline at end of file +brotli: 12.879 kBbrotli12.879 kB \ No newline at end of file diff --git a/assets/badges/transformer-file.svg b/assets/badges/transformer-file.svg index d9cd2365..43af6b06 100644 --- a/assets/badges/transformer-file.svg +++ b/assets/badges/transformer-file.svg @@ -1 +1 @@ -bundle: 25.956 kBbundle25.956 kB \ No newline at end of file +bundle: 37.901 kBbundle37.901 kB \ No newline at end of file diff --git a/assets/badges/transformer-gzip-cover.svg b/assets/badges/transformer-gzip-cover.svg index 633a0508..d89c0bbe 100644 --- a/assets/badges/transformer-gzip-cover.svg +++ b/assets/badges/transformer-gzip-cover.svg @@ -1 +1 @@ -gzip: 10.131 kBgzip10.131 kB \ No newline at end of file +gzip: 14.658 kBgzip14.658 kB \ No newline at end of file diff --git a/assets/badges/transformer-gzip.svg b/assets/badges/transformer-gzip.svg index e4ee8997..e8475f7b 100644 --- a/assets/badges/transformer-gzip.svg +++ b/assets/badges/transformer-gzip.svg @@ -1 +1 @@ -gzip: 10.131 kBgzip10.131 kB \ No newline at end of file +gzip: 14.658 kBgzip14.658 kB \ No newline at end of file diff --git a/assets/badges/vector-brotli.svg b/assets/badges/vector-brotli.svg index c0b14e05..d4a5b3f0 100644 --- a/assets/badges/vector-brotli.svg +++ b/assets/badges/vector-brotli.svg @@ -1 +1 @@ -brotli: 193 Bytesbrotli193 Bytes \ No newline at end of file +brotli: 4.199 kBbrotli4.199 kB \ No newline at end of file diff --git a/assets/badges/vector-file.svg b/assets/badges/vector-file.svg index 8484c3ba..e2050f18 100644 --- a/assets/badges/vector-file.svg +++ b/assets/badges/vector-file.svg @@ -1 +1 @@ -bundle: 276 Bytesbundle276 Bytes \ No newline at end of file +bundle: 12.156 kBbundle12.156 kB \ No newline at end of file diff --git a/assets/badges/vector-gzip-cover.svg b/assets/badges/vector-gzip-cover.svg index 3a7c540a..4fcbd32b 100644 --- a/assets/badges/vector-gzip-cover.svg +++ b/assets/badges/vector-gzip-cover.svg @@ -1 +1 @@ -gzip: 199 Bytesgzip199 Bytes \ No newline at end of file +gzip: 4.833 kBgzip4.833 kB \ No newline at end of file diff --git a/assets/badges/vector-gzip.svg b/assets/badges/vector-gzip.svg index 7853419f..f6622d4e 100644 --- a/assets/badges/vector-gzip.svg +++ b/assets/badges/vector-gzip.svg @@ -1 +1 @@ -gzip: 199 Bytesgzip199 Bytes \ No newline at end of file +gzip: 4.833 kBgzip4.833 kB \ No newline at end of file diff --git a/assets/badges/wkt-brotli.svg b/assets/badges/wkt-brotli.svg index 19a986eb..5056b6aa 100644 --- a/assets/badges/wkt-brotli.svg +++ b/assets/badges/wkt-brotli.svg @@ -1 +1 @@ -brotli: 2.514 kBbrotli2.514 kB \ No newline at end of file +brotli: 6.482 kBbrotli6.482 kB \ No newline at end of file diff --git a/assets/badges/wkt-file.svg b/assets/badges/wkt-file.svg index 870f22e1..bbc2126f 100644 --- a/assets/badges/wkt-file.svg +++ b/assets/badges/wkt-file.svg @@ -1 +1 @@ -bundle: 8.542 kBbundle8.542 kB \ No newline at end of file +bundle: 20.432 kBbundle20.432 kB \ No newline at end of file diff --git a/assets/badges/wkt-gzip-cover.svg b/assets/badges/wkt-gzip-cover.svg index 9a35a6d1..a77186c1 100644 --- a/assets/badges/wkt-gzip-cover.svg +++ b/assets/badges/wkt-gzip-cover.svg @@ -1 +1 @@ -gzip: 2.769 kBgzip2.769 kB \ No newline at end of file +gzip: 7.362 kBgzip7.362 kB \ No newline at end of file diff --git a/assets/badges/wkt-gzip.svg b/assets/badges/wkt-gzip.svg index 21cc37d6..11b69c0b 100644 --- a/assets/badges/wkt-gzip.svg +++ b/assets/badges/wkt-gzip.svg @@ -1 +1 @@ -gzip: 2.769 kBgzip2.769 kB \ No newline at end of file +gzip: 7.362 kBgzip7.362 kB \ No newline at end of file diff --git a/assets/doc-coverage.svg b/assets/doc-coverage.svg index 0af9a2bf..4e0dd103 100644 --- a/assets/doc-coverage.svg +++ b/assets/doc-coverage.svg @@ -8,10 +8,14 @@ - - document - document - 58% - 58% + + + document + document + + + 58% + 58% + \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index ddf04e9b..ec219d13 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/docs-ts/geometry/angles.md b/docs-ts/geometry/angles.md index e69de29b..e9162db9 100644 --- a/docs-ts/geometry/angles.md +++ b/docs-ts/geometry/angles.md @@ -0,0 +1 @@ +# Angles diff --git a/docs-ts/geometry/bbox.md b/docs-ts/geometry/bbox.md index e69de29b..44cf4597 100644 --- a/docs-ts/geometry/bbox.md +++ b/docs-ts/geometry/bbox.md @@ -0,0 +1 @@ +# Bounding Box diff --git a/docs-ts/geometry/id.md b/docs-ts/geometry/id.md index e69de29b..326718ab 100644 --- a/docs-ts/geometry/id.md +++ b/docs-ts/geometry/id.md @@ -0,0 +1 @@ +# Identifiers diff --git a/docs-ts/geometry/predicates.md b/docs-ts/geometry/predicates.md index e69de29b..7728463e 100644 --- a/docs-ts/geometry/predicates.md +++ b/docs-ts/geometry/predicates.md @@ -0,0 +1 @@ +# Predicates diff --git a/docs-ts/geometry/s2.md b/docs-ts/geometry/s2.md index e69de29b..e6bc4625 100644 --- a/docs-ts/geometry/s2.md +++ b/docs-ts/geometry/s2.md @@ -0,0 +1 @@ +# S2 Geometry diff --git a/docs-ts/geometry/tools.md b/docs-ts/geometry/tools.md index e69de29b..40986fae 100644 --- a/docs-ts/geometry/tools.md +++ b/docs-ts/geometry/tools.md @@ -0,0 +1 @@ +# Tools diff --git a/docs-ts/geometry/wm.md b/docs-ts/geometry/wm.md index e69de29b..22ad4ee5 100644 --- a/docs-ts/geometry/wm.md +++ b/docs-ts/geometry/wm.md @@ -0,0 +1 @@ +# Web Mercator diff --git a/docs-ts/readers/tile.md b/docs-ts/readers/tile.md new file mode 100644 index 00000000..eff7645b --- /dev/null +++ b/docs-ts/readers/tile.md @@ -0,0 +1,4 @@ +# Tile Readers + +- [ ] Raster +- [ ] Elevation diff --git a/package.json b/package.json index 728434df..b936d5c7 100755 --- a/package.json +++ b/package.json @@ -67,8 +67,8 @@ "devDependencies": { "@skypack/package-check": "^0.2.2", "@types/all-the-cities": "^3.1.3", - "@types/bun": "^1.1.14", - "@types/node": "^22.10.2", + "@types/bun": "^1.1.15", + "@types/node": "^22.10.5", "@types/tmp": "^0.2.6", "@webgpu/types": "^0.1.52", "ajv": "^8.17.1", @@ -84,23 +84,22 @@ "eslint-plugin-tsdoc": "^0.4.0", "geotiff": "^2.1.3", "kdbush": "^4.0.2", - "lmdb": "^3.2.0", + "lmdb": "^3.2.2", "long": "^5.2.3", - "mitata": "^1.0.23", "nextafter": "^1.0.0", "prettier": "^3.4.2", "robust-orientation": "^1.2.1", "satellite.js": "^5.0.0", "tmp": "^0.2.3", "typedoc": "^0.27.6", - "typedoc-plugin-coverage": "^3.4.0", + "typedoc-plugin-coverage": "^3.4.1", "typescript": "^5.7.2", - "typescript-eslint": "^8.18.2" + "typescript-eslint": "^8.19.1" }, "dependencies": { "earclip": "^1.1.1", - "open-vector-tile": "^1.6.1", - "s2-tilejson": "^1.7.0", + "open-vector-tile": "^1.6.2", + "s2-tilejson": "^1.8.1", "s2json-spec": "^1.6.2", "sharp": "^0.33.5" } diff --git a/src/constants/licenses.ts b/src/constants/licenses.ts index ca89a8ef..3eabe94f 100644 --- a/src/constants/licenses.ts +++ b/src/constants/licenses.ts @@ -1,3 +1,4 @@ +/** Common Code Licenses */ export const LICENSES = [ '0BSD', 'AAL', diff --git a/src/constants/timezones.ts b/src/constants/timezones.ts index d342c44a..47e57771 100644 --- a/src/constants/timezones.ts +++ b/src/constants/timezones.ts @@ -1,3 +1,4 @@ +/** Known Timezones, their names, abbreviations, offsets, utc codes, and whether they are DST */ export const TIMEZONES = [ { value: 'Dateline Standard Time', @@ -1207,6 +1208,7 @@ export const TIMEZONES = [ }, ]; +/** Timezone identifier list */ export const TIMEZONE_IDENTIFIER_LIST = [ 'Africa/Abidjan', 'Africa/Accra', diff --git a/src/converters/toJSON/index.ts b/src/converters/toJSON/index.ts index 1812edd7..3b4d1efc 100644 --- a/src/converters/toJSON/index.ts +++ b/src/converters/toJSON/index.ts @@ -14,6 +14,17 @@ export interface ToJSONOptions { /** * Given a writer and an array of iterators, write the input features to the writer as a JSON object + * + * Usage: + * ```ts + * import { toJSON, JSONReader } from 's2-tools' + * import { FileReader, FileWriter } from 's2-tools/file' + * + * const fileReader = new FileReader(`${__dirname}/fixtures/points.geojson`); + * const jsonReader = new JSONReader(fileReader); + * const bufWriter = new FileWriter(`${__dirname}/fixtures/points2.geojson`); + * await toJSON(bufWriter, [jsonReader], { projection: 'WM', buildBBox: true }); + * ``` * @param writer - the writer to append strings to * @param iterators - the collection of iterators to write * @param opts - user defined options [optional] @@ -58,6 +69,21 @@ export async function toJSON( /** * Given a writer and an array of iterators, write the input features to the writer as JSON-LD + * + * Usage: + * ```ts + * import { toJSON, JSONReader } from 's2-tools' + * import { FileReader, FileWriter } from 's2-tools/file' + * + * const fileReader = new FileReader(`${__dirname}/fixtures/points.geojson`); + * const jsonReader = new JSONReader(fileReader); + * const bufWriter = new FileWriter(`${__dirname}/fixtures/points.geojsonld`); + * const onFeature = (feature) => { + * feature.metadata = { id: feature.id }; + * return feature; + * } + * await toJSONLD(bufWriter, [jsonReader], { projection: 'S2', buildBBox: true, onFeature }); + * ``` * @param writer - the writer to apppend strings to * @param iterators - the collection of iterators to write * @param opts - user defined options [optional] diff --git a/src/converters/toTiles/file.ts b/src/converters/toTiles/file.ts index e69de29b..4fcb4b8a 100644 --- a/src/converters/toTiles/file.ts +++ b/src/converters/toTiles/file.ts @@ -0,0 +1,63 @@ +// /** +// * Build vector tiles give a guide on what sources to parse data from and how to store it +// * @param buildGuide - the user defined guide on building the vector tiles +// */ +// export async function toVectorTiles(buildGuide: BuildGuide): Promise { +// const { tileWriter, threads } = buildGuide; +// const totalThreads = Math.max(threads ?? 1, navigator.hardwareConcurrency ?? 1); + +// // STEP 1: Convert all features to tile slices of said features. +// await toVectorTilesSliceFeatures(buildGuide, totalThreads); + +// // STEP 2: Sort the stores + +// // STEP 3: Create workers that collect all existing multimap feature stores and build tiles + +// // STEP 4: build metadata based on the guide +// const metaBuilder = new MetadataBuilder(); +// updateBuilder(metaBuilder, buildGuide); +// const metadata = metaBuilder.commit(); + +// // STEP 5: Commit the metadata +// await tileWriter.commit(metadata); +// } + +// /** +// * STEP 1: Convert all features to tile slices of said features. +// * @param buildGuide - the user defined guide on building the vector tiles +// * @param totalThreads - the number of threads to use +// */ +// async function toVectorTilesSliceFeatures( +// buildGuide: BuildGuide, +// totalThreads: number, +// ): Promise { +// const { vectorSources, rasterSources, layerGuides } = buildGuide; +// const featuresIterator = getFeature(vectorSources, rasterSources); + +// await new Promise((resolve) => { +// let threadsComplete = 0; +// for (let i = 0; i < totalThreads; i++) { +// const worker = new Worker(new URL('./vectorWorker', import.meta.url).href, { +// type: 'module', +// }); +// /** A ready state has been submitted for work */ +// worker.onmessage = async (): Promise => { +// // iterate features and have workers split/store them +// const nextFeature = await featuresIterator.next(); +// if (nextFeature.done === true) { +// threadsComplete++; +// if (threadsComplete === totalThreads) resolve(); +// worker.terminate(); +// } else { +// const { sourceName, feature } = nextFeature.value; +// const featureMessage: FeatureMessage = { type: 'feature', sourceName, feature }; +// worker.postMessage(featureMessage); +// } +// }; +// // Prepare workers with init messages +// const stringifiedLayerGuides = prepareLayerGuides(layerGuides); +// const initMessage: InitMessage = { type: 'init', id: i, layerGuides: stringifiedLayerGuides }; +// worker.postMessage(initMessage); +// } +// }); +// } diff --git a/src/converters/toTiles/index.ts b/src/converters/toTiles/index.ts index 00e1c625..60fb57f8 100644 --- a/src/converters/toTiles/index.ts +++ b/src/converters/toTiles/index.ts @@ -1,13 +1,16 @@ import { MetadataBuilder } from 's2-tilejson'; +import VectorTileWorker from './worker/tileWorker'; import type { ClusterOptions } from '../../dataStructures/pointCluster'; +import type { Extents } from 'open-vector-tile'; import type { FeatureIterator } from '../../readers'; import type { Features } from '../../geometry'; import type { TileStoreOptions } from '../../dataStructures/tile'; import type { TileWriter } from '../../writers'; import type { Attribution, Encoding, LayerMetaData, Scheme } from 's2-tilejson'; +import type { FeatureMessage, InitMessage } from './worker/tileWorker'; -import type { FeatureMessage, InitMessage } from './vectorWorker/vectorTileWorker'; +// NOTE: IF using workers in threads, it MUST be for local use filesytem. If using a buffer system it's single threaded /** * Before tiling the data, you can mutate it here. It can also act as a filter if you return undefined @@ -29,7 +32,7 @@ export interface BaseLayer { /** Guide to building Raster layer data */ export interface RasterLayer extends BaseLayer { /** describes how the image will be stored */ - outputType: 'webp' | 'png' | 'jpeg'; + outputType: 'webp' | 'png' | 'jpeg' | 'avif'; } /** Guide to building Raster layer data where the onFeature & filter is stringified to ship to workers */ export interface StringifiedRasterLayer extends Omit { @@ -40,7 +43,9 @@ export interface StringifiedRasterLayer extends Omit { @@ -52,6 +57,8 @@ export interface StringifiedClusterLayer extends Omit { @@ -89,13 +96,14 @@ export interface BuildGuide { * The vector format if applicable helps define how the vector data is stored. * - The more modern vector format is the 'open-v2' which supports things like m-values * and 3D geometries. + * - The new vector format is the 'open-v2' which only supports 2D & 3D geometries, supports M-Values, + * properties and M-Values can have nested properties and/or arrays, and is decently fast to parse. * - The legacy vector format is the 'open-v1' which only supports 2D geometries and works on - * older map engines like Mapbox-gl-js. + * older map engines like Mapbox-gl-js, is faster to parse and often lighter in size. + * - The older vector format is the 'mapbox' which is the legacy format used by Mapbox and slow to parse. * [Default: 'open-v2'] */ - vectorFormat?: 'open-v1' | 'open-v2'; - //! Everything after this is crucial to properly build vector tiles - //! Take these next variables most seriously when building your data. + vectorFormat?: 'mapbox' | 'open-v1' | 'open-v2'; /** * The vector sources that the tile is built from and how the layers are to be stored. * Created using `{ [sourceName: string]: FeatureIterator }` @@ -103,6 +111,8 @@ export interface BuildGuide { vectorSources?: Record; /** The raster sources that will be conjoined into a single rgba pixel index for tile extraction */ rasterSources?: Record; + /** The elevation sources that will be conjoined into a single elevation index for tile extraction */ + elevationSources?: Record; /** The guides on how to build the various data */ layerGuides: LayerGuide[]; /** @@ -120,50 +130,61 @@ export interface BuildGuide { * @param buildGuide - the user defined guide on building the vector tiles */ export async function toVectorTiles(buildGuide: BuildGuide): Promise { - const { tileWriter, vectorSources, rasterSources, layerGuides, threads } = buildGuide; - const totalThreads = Math.max(threads ?? 1, navigator.hardwareConcurrency ?? 1); - const featuresIterator = getFeature(vectorSources, rasterSources); + const { tileWriter, scheme } = buildGuide; + const vectorWorker = new VectorTileWorker(); - await new Promise((resolve) => { - let threadsComplete = 0; - for (let i = 0; i < totalThreads; i++) { - const worker = new Worker(new URL('./vectorWorker', import.meta.url).href, { - type: 'module', - }); - /** A ready state has been submitted for work */ - worker.onmessage = async (): Promise => { - // iterate features and have workers split/store them - const nextFeature = await featuresIterator.next(); - if (nextFeature.done === true) { - threadsComplete++; - if (threadsComplete === totalThreads) resolve(); - worker.terminate(); - } else { - const { sourceName, feature } = nextFeature.value; - const featureMessage: FeatureMessage = { type: 'feature', sourceName, feature }; - worker.postMessage(featureMessage); - } - }; - // Prepare workers with init messages - const stringifiedLayerGuides = prepareLayerGuides(layerGuides); - const initMessage: InitMessage = { type: 'init', id: i, layerGuides: stringifiedLayerGuides }; - worker.postMessage(initMessage); - } - }); + // STEP 1: Convert all features to tile slices of said features. + await toVectorTilesSliceFeatures(buildGuide, vectorWorker); - // TODO: externalSort on vector source data at this point. + // STEP 2: Ensure all data is prepped/sorted for reading/building tiles + await vectorWorker.sort(); - // TODO: create workers and build tiles + // STEP 3: collect all existing multimap feature stores and build tiles + for await (const { face, zoom, x, y, data } of vectorWorker.buildTiles()) { + if (scheme === 'fzxy') await tileWriter.writeTileS2(face, zoom, x, y, data); + else await tileWriter.writeTileWM(zoom, x, y, data); + } - // build metadata based on the guide + // STEP 4: build metadata based on the guide const metaBuilder = new MetadataBuilder(); updateBuilder(metaBuilder, buildGuide); const metadata = metaBuilder.commit(); - // FINISH + // STEP 5: Commit the metadata await tileWriter.commit(metadata); } +/** + * STEP 1: Convert all features to tile slices of said features. + * @param buildGuide - the user defined guide on building the vector tiles + * @param vectorWorker - the vector tile worker to use + */ +async function toVectorTilesSliceFeatures( + buildGuide: BuildGuide, + vectorWorker: VectorTileWorker, +): Promise { + const { vectorSources, rasterSources, layerGuides, scheme, encoding } = buildGuide; + const featuresIterator = getFeature(vectorSources, rasterSources); + + // Prepare workers with init messages + const stringifiedLayerGuides = prepareLayerGuides(layerGuides); + const initMessage: InitMessage = { + type: 'init', + id: 0, + scheme, + encoding, + layerGuides: stringifiedLayerGuides, + }; + + vectorWorker.handleMessage(initMessage); + + for await (const nextFeature of featuresIterator) { + const { sourceName, feature } = nextFeature; + const featureMessage: FeatureMessage = { type: 'feature', sourceName, feature }; + vectorWorker.handleMessage(featureMessage); + } +} + /** * Prepare the layer guides for workers to be stringified * @param layerGuides - the user defined guide on building the vector tiles @@ -240,6 +261,9 @@ function _findErrors(_layerGuides: LayerGuide[]): void { // // const { metadata } = layerGuide; // } } +// TODO: tileGuide should be modifed to match metadata minzoom, maxzoom, and projection +// minzoom and maxzoom can be left alone if they already exist, but projection MUST match the +// output projection. // TODO: // VECTOR: diff --git a/src/converters/toTiles/tileWorkers/buildTile.ts b/src/converters/toTiles/tileWorkers/buildTile.ts deleted file mode 100644 index c447f137..00000000 --- a/src/converters/toTiles/tileWorkers/buildTile.ts +++ /dev/null @@ -1,15 +0,0 @@ -declare let self: Worker; - -// TWO WAYS TO BUILD TILES: -// * Vector Tiles -// * Raster Tiles - -/** - * A worker that sorts a chunk of a file and sends it to an output directory - * @param _event - the sort chunk message - */ -self.onmessage = (_event: Bun.MessageEvent): void => { - // void sortChunk(event.data as SortChunk).then((outFile): void => { - // postMessage(outFile); - // }); -}; diff --git a/src/converters/toTiles/vectorWorker/file.ts b/src/converters/toTiles/vectorWorker/file.ts deleted file mode 100644 index 6ebe90ae..00000000 --- a/src/converters/toTiles/vectorWorker/file.ts +++ /dev/null @@ -1,15 +0,0 @@ -declare let self: Worker; - -import { FileMultiMap } from '../../../dataStore/multimap/file'; -import VectorTileWorker from './vectorTileWorker'; - -import type { FeatureMetadata } from './vectorTileWorker'; -import type { VectorFeature } from '../../../geometry'; - -/** Convert a vector feature to a collection of tiles and store each tile feature */ -class FileVectorTileWorker extends VectorTileWorker { - vectorStore = new FileMultiMap>(); -} - -const vecWorker = new FileVectorTileWorker(); -self.onmessage = vecWorker.onmessage.bind(vecWorker); diff --git a/src/converters/toTiles/vectorWorker/vectorTileWorker.ts b/src/converters/toTiles/vectorWorker/vectorTileWorker.ts deleted file mode 100644 index 159ec0ce..00000000 --- a/src/converters/toTiles/vectorWorker/vectorTileWorker.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { DrawType } from 's2-tilejson'; -import { MultiMap } from '../../../dataStore'; -import { PointCluster, TileStore } from '../../../dataStructures'; -import { childrenIJ, fromFace } from '../../../geometry'; - -import type { MultiMapStore } from '../../../dataStore'; -import type { Features, VectorFeature } from '../../../geometry'; -import type { LayerGuide, OnFeature, StringifiedLayerGuide, VectorLayer } from '../..'; - -/** Take in options that will be used to create a tiled data correctly */ -export interface InitMessage { - /** Message type */ - type: 'init'; - /** id of the worker */ - id: number; - /** The sources that will be used to create the tile */ - layerGuides: StringifiedLayerGuide[]; -} - -/** Take in a feature that will be added to the tile */ -export interface FeatureMessage { - /** Message type */ - type: 'feature'; - /** The name of the source to add the feature to */ - sourceName: string; - /** The feature to add to the tile */ - feature: Features; -} - -/** We want to track the associated layer for each feature */ -export interface FeatureMetadata { - layerName: string; -} - -/** Convert a vector feature to a collection of tiles and store each tile feature */ -export default class VectorTileWorker { - id = 0; - layerGuides: LayerGuide[] = []; - // TODO: We have vectorSources, clusterSources, and rasterSources - // TODO: that way each will have their own sorting. - vectorStore: MultiMapStore> = new MultiMap< - VectorFeature - >(); - // Unique store for each layer that describes itself as a cluster source - clusterStores: { [layerName: string]: PointCluster } = {}; - /** - * Tile-ize input vector features and store them - * @param event - the init message or a feature message - */ - onmessage(event: Bun.MessageEvent): void { - this.handleMessage(event.data); - } - - /** - * Tile-ize input vector features and store them - * @param message - the init message or a feature message - */ - handleMessage(message: InitMessage | FeatureMessage): void { - const { type } = message; - if (type === 'init') { - this.layerGuides = parseLayerGuides(message.layerGuides); - this.id = message.id; - self.postMessage({ type: 'ready' }); - } else { - this.storeFeature(message); - } - } - - /** - * Store a feature across all appropriate zooms - * @param message - the message to pull the feature and source info from - */ - storeFeature(message: FeatureMessage): void { - const { layerGuides } = this; - const { feature, sourceName } = message; - - for (const layerGuide of layerGuides.filter((layer) => layer.sourceName === sourceName)) { - const { - onFeature, - metadata: { drawTypes }, - } = layerGuide; - const parsedFeature = onFeature !== undefined ? onFeature(feature) : feature; - if (parsedFeature === undefined) return; - if (drawTypes.length === 0 || drawTypes.includes(toDrawType(feature))) return; - - if ('tileGuide' in layerGuide) this.#storeVectorFeature(parsedFeature, layerGuide); - } - } - - /** - * Store a vector feature across all appropriate zooms - * @param feature - the feature to store - * @param vectorLayer - the layer guide to describe how to store the feature - */ - #storeVectorFeature(feature: Features, vectorLayer: VectorLayer): void { - // TODO: tileGuide should be modifed to match metadata minzoom, maxzoom, and projection - // minzoom and maxzoom can be left alone if they already exist, but projection MUST match the - // output projection. - const { tileGuide, layerName } = vectorLayer; - - // three directions we can build data - const tileStore = new TileStore(feature, tileGuide); - const tileCache = [fromFace(0)]; - if (tileStore.projection === 'S2') - tileCache.push(fromFace(1), fromFace(2), fromFace(3), fromFace(4), fromFace(5)); - while (tileCache.length > 0) { - const id = tileCache.pop()!; - const tile = tileStore.getTile(id); - if (tile !== undefined && !tile.isEmpty()) { - // store feature with the associated layername - feature.metadata = { layerName }; - this.vectorStore.set(id, feature as VectorFeature); - - // store 4 children tiles to ask for - tileCache.push(...childrenIJ(tile.face, tile.zoom, tile.i, tile.j)); - } - } - } -} - -/** - * Convert a source guide to a parsed source guide (where onFeature is parsed back into a function) - * @param sourceGuide - the source guide to parse - * @returns the parsed source guide - */ -function parseLayerGuides(sourceGuide: StringifiedLayerGuide[]): LayerGuide[] { - return sourceGuide.map((guide) => { - return { - ...guide, - onFeature: - guide.onFeature !== undefined ? (new Function(guide.onFeature)() as OnFeature) : undefined, - }; - }); -} - -/** - * Check if a feature is included by draw types defined by the layer guide - * @param feature - the feature to find the associating draw type for - * @returns - the associating draw type for the feature - */ -function toDrawType(feature: Features): DrawType { - const { - geometry: { type }, - } = feature; - if (type === 'Point' || type === 'MultiPoint') return DrawType.Points; - else if (type === 'Point3D' || type === 'MultiPoint3D') return DrawType.Points3D; - else if (type === 'LineString' || type === 'MultiLineString') return DrawType.Lines; - else if (type === 'Polygon' || type === 'MultiPolygon') return DrawType.Polys; - else if (type === 'LineString3D' || type === 'MultiLineString3D') return DrawType.Lines3D; - else if (type === 'Polygon3D' || type === 'MultiPolygon3D') return DrawType.Polys3D; - else return DrawType.Points; -} diff --git a/src/converters/toTiles/worker/file.ts b/src/converters/toTiles/worker/file.ts new file mode 100644 index 00000000..b37883d6 --- /dev/null +++ b/src/converters/toTiles/worker/file.ts @@ -0,0 +1,15 @@ +// declare let self: Worker; + +// import { FileMultiMap } from '../../../dataStore/multimap/file'; +// import VectorTileWorker from './tileWorker'; + +// import type { FeatureMetadata } from './tileWorker'; +// import type { VectorFeature } from '../../../geometry'; + +// /** Convert a vector feature to a collection of tiles and store each tile feature */ +// class FileVectorTileWorker extends VectorTileWorker { +// vectorStore = new FileMultiMap>(); +// } + +// const vecWorker = new FileVectorTileWorker(); +// self.onmessage = vecWorker.onmessage.bind(vecWorker); diff --git a/src/converters/toTiles/vectorWorker/index.ts b/src/converters/toTiles/worker/index.ts similarity index 70% rename from src/converters/toTiles/vectorWorker/index.ts rename to src/converters/toTiles/worker/index.ts index da1bdbad..826094fc 100644 --- a/src/converters/toTiles/vectorWorker/index.ts +++ b/src/converters/toTiles/worker/index.ts @@ -1,6 +1,6 @@ declare let self: Worker; -import VectorTileWorker from './vectorTileWorker'; +import VectorTileWorker from './tileWorker'; const vecWorker = new VectorTileWorker(); self.onmessage = vecWorker.onmessage.bind(vecWorker); diff --git a/src/converters/toTiles/worker/tileWorker.ts b/src/converters/toTiles/worker/tileWorker.ts new file mode 100644 index 00000000..d2fc8ced --- /dev/null +++ b/src/converters/toTiles/worker/tileWorker.ts @@ -0,0 +1,314 @@ +declare let self: Worker; + +import { DrawType } from 's2-tilejson'; +import { MultiMap } from '../../../dataStore'; +import { compressStream } from '../../../util'; +import { BaseVectorTile, writeOVTile } from 'open-vector-tile'; +import { PointCluster, PointIndex, Tile, TileStore } from '../../../dataStructures'; +import { childrenIJ, convert, fromFace, toFaceIJ } from '../../../geometry'; + +import type { MultiMapStore } from '../../../dataStore'; +import type { S2JSONLayerMap } from 'open-vector-tile'; +import type { + ClusterLayer, + LayerGuide, + OnFeature, + StringifiedLayerGuide, + VectorLayer, +} from '../..'; +import type { ElevationPoint, RGBA } from '../../..'; +import type { Encoding, Scheme } from 's2-tilejson'; +import type { Face, Features, Properties, VectorFeatures } from '../../../geometry'; + +/** Take in options that will be used to create a tiled data correctly */ +export interface InitMessage { + /** Message type */ + type: 'init'; + /** id of the worker */ + id: number; + /** The sources that will be used to create the tile */ + layerGuides: StringifiedLayerGuide[]; + /** The scheme that will be used to decide the projection and store method */ + scheme?: Scheme; + /** The encoding that will be used to compress the tile */ + encoding?: Encoding; +} + +/** Take in a feature that will be added to the tile */ +export interface FeatureMessage { + /** Message type */ + type: 'feature'; + /** The name of the source to add the feature to */ + sourceName: string; + /** The feature to add to the tile */ + feature: Features; +} + +/** We want to track the associated layer for each feature */ +export interface FeatureMetadata extends Properties { + layerName: string; +} + +/** A built tile that is ready to be written to the filesystem */ +export interface BuiltTile { + face: Face; + zoom: number; + x: number; + y: number; + data: Uint8Array; +} + +/** Convert a vector feature to a collection of tiles and store each tile feature */ +export default class VectorTileWorker { + id = 0; + layerGuides: LayerGuide[] = []; + scheme: Scheme = 'fzxy'; + encoding: Encoding = 'none'; + vectorStore: MultiMapStore> = new MultiMap< + VectorFeatures + >(); + // Unique store for each layer that describes itself as a cluster source + clusterStores: { [layerName: string]: PointCluster } = {}; + rasterStore: PointIndex = new PointIndex(); + elevationStore: PointIndex = new PointIndex(); + + /** + * Tile-ize input vector features and store them + * @param event - the init message or a feature message + */ + onmessage(event: Bun.MessageEvent): void { + this.handleMessage(event.data); + } + + /** + * Tile-ize input vector features and store them + * @param message - the init message or a feature message + */ + handleMessage(message: InitMessage | FeatureMessage): void { + const { type } = message; + if (type === 'init') { + this.layerGuides = parseLayerGuides(message.layerGuides); + this.id = message.id; + if (message.scheme !== undefined) this.scheme = message.scheme; + if (message.encoding !== undefined) this.encoding = message.encoding; + self.postMessage({ type: 'ready' }); + } else { + this.storeFeature(message); + } + } + + /** Iterate through all the stores and sort/cluster as needed */ + async sort(): Promise { + for (const cluster of Object.values(this.clusterStores)) await cluster.buildClusters(); + await this.rasterStore.sort(); + await this.elevationStore.sort(); + } + + /** + * Iterate through the stores and build tiles, gzip compressing as we go + * @yields - a built tile + */ + async *buildTiles(): AsyncGenerator { + const { layerGuides, scheme, encoding } = this; + const minzoom = getMinzoom(layerGuides); + + // three directions we can build data + const tileCache = [fromFace(0)]; + if (scheme === 'fzxy') + tileCache.push(fromFace(1), fromFace(2), fromFace(3), fromFace(4), fromFace(5)); + while (tileCache.length > 0) { + const id = tileCache.pop()!; + const tile = new Tile(id); + // store vector features + const vectorFeatures = await this.vectorStore.get(id); + if (vectorFeatures !== undefined) { + for (const feature of vectorFeatures) tile.addFeature(feature); + } + // store all cluster features + for (const [layerName, cluster] of Object.entries(this.clusterStores)) { + const layerClusterFeatures = await cluster.getTile(id); + if (layerClusterFeatures === undefined) continue; + for (const feature of layerClusterFeatures.layers.default.features) { + tile.addFeature(feature, layerName); + } + } + // TODO: Request raster tile if it exists + // if tile is not empty we build a vector tile + if (!tile.isEmpty()) { + // build the base vector tile layerguides => S2JSONLayerMap + const vectorTile = BaseVectorTile.fromS2JSONTile(tile, toLayerMap(layerGuides)); + // write to a buffer using the open-vector-tile spec + let vectorTileBuffer: Uint8Array = writeOVTile(vectorTile); + // gzip if necessary + if (encoding === 'gz') { + vectorTileBuffer = await compressStream(vectorTileBuffer, 'gzip'); + } + // yield the buffer + yield { face: tile.face, zoom: tile.zoom, x: tile.i, y: tile.j, data: vectorTileBuffer }; + // store 4 children tiles to ask for children features + tileCache.push(...childrenIJ(tile.face, tile.zoom, tile.i, tile.j)); + } else if (minzoom > tile.zoom) { + // if we haven't reached the data yet, we store children + tileCache.push(...childrenIJ(tile.face, tile.zoom, tile.i, tile.j)); + } + } + } + + /** + * Store a feature across all appropriate zooms + * @param message - the message to pull the feature and source info from + */ + storeFeature(message: FeatureMessage): void { + const { layerGuides } = this; + const { feature, sourceName } = message; + + for (const layerGuide of layerGuides.filter((layer) => layer.sourceName === sourceName)) { + const { + onFeature, + metadata: { drawTypes }, + } = layerGuide; + const parsedFeature = onFeature !== undefined ? onFeature(feature) : feature; + if (parsedFeature === undefined) return; + if (drawTypes.length === 0 || drawTypes.includes(toDrawType(feature))) return; + + if ('tileGuide' in layerGuide) this.#storeVectorFeature(parsedFeature, layerGuide); + else if ('clusterGuide' in layerGuide) this.#storeClusterFeature(parsedFeature, layerGuide); + // TODO raster source storing + } + } + + /** + * Store a cluster feature in the correct point cluster + * @param feature - the feature to store + * @param clusterLayer - the layer guide to describe how to store the feature + */ + #storeClusterFeature(feature: Features, clusterLayer: ClusterLayer): void { + if (feature.geometry.type !== 'Point' && feature.geometry.type !== 'MultiPoint') return; + const { scheme } = this; + const { + clusterGuide, + layerName, + metadata: { maxzoom }, + } = clusterLayer; + const projection = clusterGuide.projection ?? (scheme === 'fzxy' ? 'S2' : 'WM'); + if (this.clusterStores[layerName] === undefined) { + this.clusterStores[layerName] = new PointCluster(undefined, clusterGuide); + } + const vectorFeature = convert(projection, feature, false, undefined, maxzoom, false)[0]; + const { + face, + geometry: { type, coordinates }, + properties, + } = vectorFeature; + if (type === 'Point') { + const { x, y } = coordinates; + if (projection === 'S2') + this.clusterStores[layerName].insertFaceST(face ?? 0, x, y, properties); + else this.clusterStores[layerName].insertLonLat(x, y, vectorFeature.properties); + } else if (type === 'MultiPoint') { + for (const point of coordinates) { + const { x, y } = point; + if (projection === 'S2') + this.clusterStores[layerName].insertFaceST(face ?? 0, x, y, properties); + else this.clusterStores[layerName].insertLonLat(x, y, vectorFeature.properties); + } + } + } + + /** + * Store a vector feature across all appropriate zooms + * @param feature - the feature to store + * @param vectorLayer - the layer guide to describe how to store the feature + */ + #storeVectorFeature(feature: Features, vectorLayer: VectorLayer): void { + const { + tileGuide, + layerName, + metadata: { minzoom }, + } = vectorLayer; + // NOTE: Don't store above minzoom + + // three directions we can build data + const tileStore = new TileStore(feature, tileGuide); + const tileCache = [fromFace(0)]; + if (tileStore.projection === 'S2') + tileCache.push(fromFace(1), fromFace(2), fromFace(3), fromFace(4), fromFace(5)); + while (tileCache.length > 0) { + const id = tileCache.pop()!; + const [face, zoom, i, j] = toFaceIJ(id); + const tile = tileStore.getTile(id); + if (minzoom > zoom) { + // if we haven't reached the data yet, we store children + tileCache.push(...childrenIJ(face, zoom, i, j)); + } else if (tile !== undefined && !tile.isEmpty()) { + // store feature with the associated layername + for (const { features } of Object.values(tile.layers)) { + for (const feature of features) { + feature.metadata = { layer: layerName }; + this.vectorStore.set(id, feature as VectorFeatures); + } + } + + // store 4 children tiles to ask for + tileCache.push(...childrenIJ(tile.face, tile.zoom, tile.i, tile.j)); + } + } + } +} + +/** + * Get the absolute minzoom from the layer guides + * @param layerGuides - the user defined guide on building the vector tiles + * @returns the absolute minzoom + */ +function getMinzoom(layerGuides: LayerGuide[]): number { + return Math.min(...layerGuides.map((layer) => layer.metadata.minzoom)); +} + +/** + * Convert layer guides to S2JSONLayerMap to store in the open-vector-tile schema + * @param layerGuides - the user defined guide on building the vector tiles + * @returns the S2JSONLayerMap + */ +function toLayerMap(layerGuides: LayerGuide[]): S2JSONLayerMap { + const res: S2JSONLayerMap = {}; + for (const layer of layerGuides) { + if (!('extent' in layer)) continue; + const { shape, mShape } = layer.metadata; + res[layer.layerName] = { extent: layer.extent, shape, mShape }; + } + return res; +} + +/** + * Convert a source guide to a parsed source guide (where onFeature is parsed back into a function) + * @param sourceGuide - the source guide to parse + * @returns the parsed source guide + */ +function parseLayerGuides(sourceGuide: StringifiedLayerGuide[]): LayerGuide[] { + return sourceGuide.map((guide) => { + return { + ...guide, + onFeature: + guide.onFeature !== undefined ? (new Function(guide.onFeature)() as OnFeature) : undefined, + }; + }); +} + +/** + * Check if a feature is included by draw types defined by the layer guide + * @param feature - the feature to find the associating draw type for + * @returns - the associating draw type for the feature + */ +function toDrawType(feature: Features): DrawType { + const { + geometry: { type }, + } = feature; + if (type === 'Point' || type === 'MultiPoint') return DrawType.Points; + else if (type === 'Point3D' || type === 'MultiPoint3D') return DrawType.Points3D; + else if (type === 'LineString' || type === 'MultiLineString') return DrawType.Lines; + else if (type === 'Polygon' || type === 'MultiPolygon') return DrawType.Polys; + else if (type === 'LineString3D' || type === 'MultiLineString3D') return DrawType.Lines3D; + else if (type === 'Polygon3D' || type === 'MultiPolygon3D') return DrawType.Polys3D; + else return DrawType.Points; +} diff --git a/src/dataStore/mmap.ts b/src/dataStore/mmap.ts index 8e01ba61..ea4da92c 100644 --- a/src/dataStore/mmap.ts +++ b/src/dataStore/mmap.ts @@ -48,8 +48,8 @@ export class S2MMapStore { #keyFd: number = -1; #valueFd: number = -1; // readers - #keyReader!: Uint8Array; - #valueReader!: Uint8Array; + #keyReader!: Uint8Array; + #valueReader!: Uint8Array; /** * Builds a new File based KV @@ -65,9 +65,8 @@ export class S2MMapStore { this.#tmpDir = options?.tmpDir; if (!this.#sorted) this.#switchToWriteState(); else { - this.#keyReader = mmap(`${this.fileName}.sortedKeys`) as Uint8Array; - if (!this.#indexIsValues) - this.#valueReader = mmap(`${this.fileName}.values`) as Uint8Array; + this.#keyReader = mmap(`${this.fileName}.sortedKeys`) as Uint8Array; + if (!this.#indexIsValues) this.#valueReader = mmap(`${this.fileName}.values`) as Uint8Array; this.#size = this.#keyReader.length / 16; } } @@ -220,9 +219,8 @@ export class S2MMapStore { } if (this.#size === 0) return; await this.#sort(); - this.#keyReader = mmap(`${this.fileName}.sortedKeys`) as Uint8Array; - if (!this.#indexIsValues) - this.#valueReader = mmap(`${this.fileName}.values`) as Uint8Array; + this.#keyReader = mmap(`${this.fileName}.sortedKeys`); + if (!this.#indexIsValues) this.#valueReader = mmap(`${this.fileName}.values`); } /** Sort the data */ diff --git a/src/dataStructures/cache.ts b/src/dataStructures/cache.ts index 548cb744..44222ed3 100644 --- a/src/dataStructures/cache.ts +++ b/src/dataStructures/cache.ts @@ -1,4 +1,23 @@ -/** A cache of values with a max size to ensure that too much old data is not stored. */ +/** + * # Cache System + * + * ## Description + * A cache of values with a max size to ensure that too much old data is not stored. + * + * ## Usage + * + * ```ts + * import { Cache } from 's2-tools'; + * + * const onDelete = (key: string, value: string) => { + * console.log(`Deleted key ${key} with value ${value}`); + * }; + * const cache = new Cache(10, onDelete); + * cache.set('key', 'value'); + * console.log(cache.get('key')); // 'value' + * cache.delete('key'); + * ``` + */ export class Cache extends Map { order: K[] = []; /** diff --git a/src/dataStructures/pointCluster.ts b/src/dataStructures/pointCluster.ts index c435f22a..7eddeba2 100644 --- a/src/dataStructures/pointCluster.ts +++ b/src/dataStructures/pointCluster.ts @@ -17,7 +17,7 @@ import type { PointShape } from './pointIndex'; import type { S1ChordAngle } from '../geometry/s1/chordAngle'; import type { Face, JSONCollection, Point3D, Projection, Properties, S2CellId } from '../geometry'; -import type { VectorStoreConstructor } from '../dataStore/vector'; +import type { VectorStore, VectorStoreConstructor } from '../dataStore/vector'; /** The kind of input required to store a point for proper indexing */ export type ClusterStore = VectorStoreConstructor>; @@ -54,6 +54,7 @@ function newCluster(properties: Properties): Cluster { } /** + * Create a cluster with the correct sum * @param properties - the properties associated with the cluster * @param sum - the sum of the cluster * @returns - a new cluster with the correct sum and properties data @@ -65,7 +66,31 @@ function sumToCluster(properties: Properties, sum: number): Cluster { /** Compare two data items, return true to merge data */ export type Comparitor = (a: Properties, b: Properties) => boolean; -/** A cluster store to index points at each zoom level */ +/** + * # Point Cluster + * + * ## Description + * A cluster store to index points at each zoom level + * + * ## Usage + * ```ts + * import { PointCluster } from 's2-tools'; + * const pointCluster = new PointCluster(); + * + * // add a lon-lat + * pointCluster.insertLonLat(lon, lat, data); + * // add an STPoint + * pointCluster.insertFaceST(face, s, t, data); + * + * // after adding data build the clusters + * await pointCluster.buildClusters(); + * + * // get the clusters for a tile + * const tile = await pointCluster.getTile(id); + * // or get the raw cluster data + * const clusters = await pointCluster.getCellData(id); + * ``` + */ export class PointCluster { projection: Projection; layerName: string; @@ -78,8 +103,13 @@ export class PointCluster { /** * @param data - if provided, the data to index * @param options - cluster options on how to build the cluster + * @param maxzoomStore - the store to use for the maxzoom index */ - constructor(data?: JSONCollection, options?: ClusterOptions) { + constructor( + data?: JSONCollection, + options?: ClusterOptions, + maxzoomStore?: VectorStore>, + ) { this.projection = options?.projection ?? 'S2'; this.layerName = options?.layerName ?? 'default'; this.minzoom = Math.max(options?.minzoom ?? 0, 0); @@ -88,6 +118,10 @@ export class PointCluster { for (let zoom = this.minzoom; zoom <= this.maxzoom; zoom++) { this.indexes.set(zoom, new PointIndex(options?.store)); } + if (maxzoomStore !== undefined) { + const maxzoomIndex = this.indexes.get(this.maxzoom); + maxzoomIndex?.setStore(maxzoomStore); + } // convert features if provided if (data !== undefined) { const features = convert(this.projection, data, false, undefined, this.maxzoom, true); @@ -139,7 +173,6 @@ export class PointCluster { */ async buildClusters(cmp_?: Comparitor): Promise { const { minzoom, maxzoom } = this; - // const cmp = cmp_ orelse defaultCmp; const cmp: Comparitor = cmp_ ?? ((_a: Properties, _b: Properties) => true); for (let zoom = maxzoom - 1; zoom >= minzoom; zoom--) { const curIndex = this.indexes.get(zoom); @@ -147,6 +180,8 @@ export class PointCluster { if (curIndex === undefined || queryIndex === undefined) throw new Error('Index not found'); await this.#cluster(zoom, queryIndex, curIndex, cmp); } + // ensure all point indexes are sorted + for (const index of this.indexes.values()) await index.sort(); } /** diff --git a/src/dataStructures/pointIndex.ts b/src/dataStructures/pointIndex.ts index d550beca..9ffe3b25 100644 --- a/src/dataStructures/pointIndex.ts +++ b/src/dataStructures/pointIndex.ts @@ -19,8 +19,38 @@ export interface PointShape { data: T; } -/** An index of cells with radius queries */ -export class PointIndex { +/** + * # Point Index + * + * ## Description + * An index of cells with radius queries + * Assumes the data is {@link Stringifiable} + * + * ## Usage + * ```ts + * import { PointIndex } from 's2-tools'; + * import { FileVector } from 's2-tools/file'; + * + * const pointIndex = new PointIndex(); + * // or used a file based store + * const pointIndex = new PointIndex(FileVector); + * + * // insert a lon-lat + * pointIndex.insertLonLat(lon, lat, data); + * // insert an STPoint + * pointIndex.insertFaceST(face, s, t, data); + * + * // after adding data build the index. NOTE: You don't have to call this, it will be called + * // automatically when making a query + * await pointIndex.sort(); + * + * // you can search a range + * const points = await pointIndex.searchRange(low, high); + * // or a radius + * const points = await pointIndex.searchRadius(center, radius); + * ``` + */ +export class PointIndex { #store: VectorStore>; #unsorted: boolean = false; @@ -29,6 +59,14 @@ export class PointIndex { this.#store = new store(); } + /** + * Set the index store to a defined one. Useful for file based stores where we want to reuse data + * @param store - the index store + */ + setStore(store: VectorStore>): void { + this.#store = store; + } + /** * Insert a point3D and its corresponding data to the index * @param point - the point to be indexed @@ -66,7 +104,7 @@ export class PointIndex { */ async *[Symbol.asyncIterator](): AsyncGenerator> { await this.sort(); - for await (const value of this.#store) yield value; + yield* this.#store; } /** Sort the index in place if unsorted */ @@ -103,6 +141,7 @@ export class PointIndex { } /** + * Search for points given a range of low and high ids * @param low - the lower bound * @param high - the upper bound * @param maxResults - the maximum number of results to return diff --git a/src/dataStructures/pointIndexFast.ts b/src/dataStructures/pointIndexFast.ts index 95b58657..ba9fc22b 100644 --- a/src/dataStructures/pointIndexFast.ts +++ b/src/dataStructures/pointIndexFast.ts @@ -1,4 +1,4 @@ -import { EARTH_RADIUS } from '../geometry'; +import { EARTH_RADIUS } from '..'; import { KDSpatialIndex } from '../dataStore'; import { PriorityQueue } from './priorityQueue'; import { fromST } from '../geometry/s2/point'; @@ -23,8 +23,42 @@ interface NodeQuery { const RAD = 0.017453292519943295; // Math.PI / 180; -/** An index of cells with radius queries */ -export class PointIndexFast { +/** + * # Point Index Fast + * + * ## Description + * An index of cells with radius queries + * Assumes the data is {@link Stringifiable} + * Because of the nature of low level language like Javascript, using u64 is slow. This index + * uses f64 which Number supports. So it is fast and efficient. + * + * ## Usage + * ```ts + * import { PointIndexFast } from 's2-tools'; + * import { KDMMapSpatialIndex } from 's2-tools/mmap'; + * + * const pointIndex = new PointIndexFast(); + * // or used a mmap based store + * const pointIndex = new PointIndex(KDMMapSpatialIndex); + * + * // insert a lon-lat + * pointIndex.insertLonLat(lon, lat, data); + * // insert an STPoint + * pointIndex.insertFaceST(face, s, t, data); + * + * // after adding data build the index. NOTE: You don't have to call this, it will be called + * // automatically when making a query + * await pointIndex.sort(); + * + * // you can search a range + * const points = await pointIndex.searchRange(minX, minY, maxX, maxY); + * // or a standard radius search + * const points = await pointIndex.searchRadius(qx, qy, r); + * // or a spherical radius search that wraps around the -180/180 boundary + * const points = await pointIndex.searchRadiusSphere(lon, lat, dist); + * ``` + */ +export class PointIndexFast { #store: KDStore; #sorted: boolean = false; diff --git a/src/dataStructures/priorityQueue.ts b/src/dataStructures/priorityQueue.ts index 3660e72b..2977c734 100644 --- a/src/dataStructures/priorityQueue.ts +++ b/src/dataStructures/priorityQueue.ts @@ -1,7 +1,30 @@ /** How the comparison function needs to work */ export type PriorityCompare = (a: T, b: T) => number; -/** A Priority Queue */ +/** + * # Priority Queue + * + * ## Description + * A priority queue is a data structure that stores elements in a specific order. + * + * ## Usage + * + * ```ts + * import { PriorityQueue } from 's2-tools'; + * + * const queue = new PriorityQueue(); + * + * queue.push(1); + * queue.push(2); + * + * const current = queue.peek(); // 1 + * console.log(queue.length); // 2 + * let next = queue.pop(); // 1 + * console.log(queue.length); // 1 + * next = queue.pop(); // 2 + * console.log(queue.length); // 0 + * ``` + */ export class PriorityQueue { #length: number = 0; /** diff --git a/src/dataStructures/tile.ts b/src/dataStructures/tile.ts index 7b48aff7..3cd52703 100644 --- a/src/dataStructures/tile.ts +++ b/src/dataStructures/tile.ts @@ -20,7 +20,33 @@ import type { VectorPoint, } from '../geometry'; -/** Tile Class to contain the tile information for splitting or simplifying */ +/** + * # Tile Class + * + * ## Description + * Tile Class to contain the tile information for splitting or simplifying + * + * ## Fields + * + * - `extent` - the extent of the tile + * - `face` - the tile's face + * - `zoom` - the tile's zoom + * - `i` - the tile's x position + * - `j` - the tile's y position + * - `layers` - the tile's layers + * - `transformed` - whether the tile feature geometry has been transformed to tile coordinates + * + * ## Usage + * + * ```ts + * import { Tile } from 's2-tools'; + * // create a tile + * const tile = new Tile(id); + * // add a feature + * tile.addFeature(feature); + * // transform the geometry to be relative to the tile + * tile.transform(); + */ export class Tile { extent = 1; face: Face; @@ -151,7 +177,28 @@ export interface TileStoreOptions { buildBBox?: boolean; } -/** TileStore Class is a tile-lookup system that splits and simplifies as needed for each tile request */ +/** + * # Tile Store + * + * ## Description + * TileStore Class is a tile-lookup system that splits and simplifies as needed for each tile request + * + * ## Usage + * ```ts + * const tileStore = new TileStore(data, { + * projection: 'WM', + * minzoom: 0, + * maxzoom: 9, + * indexMaxzoom: 4, + * tolerance: 3, + * buffer: 0.0625 + * buildBBox: false + * }); + * + * // get a tile + * const tile = tileStore.getTile(id); + * ``` + */ export class TileStore { minzoom = 0; // min zoom to preserve detail on maxzoom = 18; // max zoom to preserve detail on @@ -190,18 +237,39 @@ export class TileStore { this.maxzoom, true, ); - for (const feature of features) this.addFeature(feature); + for (const feature of features) this.#addFeature(feature); for (let face = 0; face < 6; face++) { const id = fromFace(face as Face); - this.splitTile(id); + this.#splitTile(id); } } + /** + * @param id - the tile id to acquire + * @returns - the tile if it exists + */ + getTile(id: bigint): undefined | Tile { + const { tiles, faces } = this; + const zoom = level(id); + const face = getFace(id); + // If the zoom is out of bounds, return nothing + if (zoom < 0 || zoom > 20 || !faces.has(face) || zoom < this.minzoom || zoom > this.maxzoom) + return; + + // we want to find the closest tile to the data. + let pID = id; + while (!tiles.has(pID) && !isFace(pID)) pID = parentID(pID); + // split as necessary, the algorithm will know if the tile is already split + this.#splitTile(pID, id, zoom); + + return tiles.get(id); + } + /** * Stores a feature to a tile, creating the tile if it doesn't exist and tracking the faces we use * @param feature - the feature to store to a face tile. Creates the tile if it doesn't exist */ - addFeature(feature: VectorFeatures): void { + #addFeature(feature: VectorFeatures): void { const { faces, tiles } = this; const face = feature.face ?? 0; const id = fromFace(face); @@ -220,7 +288,7 @@ export class TileStore { * @param endID - where to stop tiling * @param endZoom - stop tiling at this zoom */ - splitTile(startID: bigint, endID?: bigint, endZoom: number = this.maxzoom): void { + #splitTile(startID: bigint, endID?: bigint, endZoom: number = this.maxzoom): void { const { buffer, tiles, tolerance, maxzoom, indexMaxzoom } = this; const stack: bigint[] = [startID]; // avoid recursion by using a processing queue @@ -259,25 +327,4 @@ export class TileStore { stack.push(blID, brID, tlID, trID); } } - - /** - * @param id - the tile id to acquire - * @returns - the tile if it exists - */ - getTile(id: bigint): undefined | Tile { - const { tiles, faces } = this; - const zoom = level(id); - const face = getFace(id); - // If the zoom is out of bounds, return nothing - if (zoom < 0 || zoom > 20 || !faces.has(face) || zoom < this.minzoom || zoom > this.maxzoom) - return; - - // we want to find the closest tile to the data. - let pID = id; - while (!tiles.has(pID) && !isFace(pID)) pID = parentID(pID); - // split as necessary, the algorithm will know if the tile is already split - this.splitTile(pID, id, zoom); - - return tiles.get(id); - } } diff --git a/src/experimental/s2cell.ts b/src/experimental/s2cell.ts index 9c30dc5b..df9c729b 100644 --- a/src/experimental/s2cell.ts +++ b/src/experimental/s2cell.ts @@ -110,11 +110,11 @@ export class S2CellGenerator { * @param base64 - base64 encoded string * @returns converted ArrayBuffer of the string data */ -function base64ToArrayBuffer(base64: string): ArrayBuffer { +function base64ToArrayBuffer(base64: string): ArrayBufferLike { const binaryString = atob(base64); const len = binaryString.length; const bytes = new Uint8Array(len); for (let i = 0; i < len; i++) bytes[i] = binaryString.charCodeAt(i); - return bytes.buffer as ArrayBuffer; + return bytes.buffer; } diff --git a/src/geometry/README.md b/src/geometry/README.md index f385dcad..80c67b5a 100644 --- a/src/geometry/README.md +++ b/src/geometry/README.md @@ -8,21 +8,16 @@ The goal here is only to build code for the `s2json-spec` package while also pro - [ ] **clean**: remove redundant points, (multi)linestring and/or (multi)polygon, fixes kinks, etc. -### Points - -- [ ] **center**: find centerpoint of multi-point - ### Lines - [ ] **along**: (given linestring find the point at distance provided) - [ ] **length**: length of a linestring - [ ] **pointToLineDistance**: distance from a point to a line - [ ] **bezierSpline**: create a bezier spline from a line +- [ ] **cubicSpline**: create a cubic spline from a line ### Polygons -- [ ] **area**: area of a polygon - [ ] **length**: length of each polygon ring -- [ ] **pointInPolygon**: test if a point is in a polygon - [ ] **dekink**: remove kinks from a polygon - [ ] **boolean**: boolean operations on polygons diff --git a/src/geometry/bbox.ts b/src/geometry/bbox.ts index 9a01d040..c0cd63e0 100644 --- a/src/geometry/bbox.ts +++ b/src/geometry/bbox.ts @@ -9,6 +9,7 @@ import type { } from './'; /** + * Creates a bounding box from a point * @param point - input vector point * @returns - BBox of the point */ @@ -19,6 +20,7 @@ export function fromPoint(point: VectorPoint): BBOX { } /** + * Creates a bounding box from a linestring * @param line - input vector line * @returns - BBox of the line */ @@ -31,6 +33,7 @@ export function fromLineString(line: VectorLineString): BBOX { } /** + * Creates a bounding box from a multilinestring * @param multiLines - input vector multilinestring * @returns - BBox of the multilinestring */ @@ -43,6 +46,7 @@ export function fromMultiLineString(multiLines: VectorMultiLineString): BBOX { } /** + * Creates a bounding box from a multipolygon * @param multiPolygon - input vector multipolygon * @returns - BBox of the multipolygon */ @@ -62,7 +66,7 @@ export function fromMultiPolygon(multiPolygon: VectorMultiPolygon): BBOX { * @param point - point to test if it exists within the bbox * @returns - true if the point is within the bbox, false otherwise */ -export function pointOverlap(bbox: BBox, point: VectorPoint): boolean { +export function pointOverlap(bbox: BBOX, point: VectorPoint): boolean { const [left, bottom, right, top] = bbox; return point.x >= left && point.x <= right && point.y >= bottom && point.y <= top; } @@ -74,7 +78,7 @@ export function pointOverlap(bbox: BBox, point: VectorPoint): boolean { * @param b2 - second bounding box * @returns - undefined if no overlap, or a bbox of the overlap */ -export function bboxOverlap(b1: BBox, b2: BBox): undefined | BBox { +export function bboxOverlap(b1: BBOX, b2: BBOX): undefined | BBOX { // check if the bboxes overlap at all if (b2[2] < b1[0] || b1[2] < b2[0] || b2[3] < b1[1] || b1[3] < b2[1]) return; // find the middle two X values @@ -88,6 +92,7 @@ export function bboxOverlap(b1: BBox, b2: BBox): undefined | BBox { } /** + * Extends a bounding box to include a point * @param bbox - the bounding box to extend, if it doesn't exist it will be created otherwise just modified * @param point - the point to add to the bbox * @returns - the extended bbox diff --git a/src/geometry/id.ts b/src/geometry/id.ts index 145369fd..d4a27466 100644 --- a/src/geometry/id.ts +++ b/src/geometry/id.ts @@ -65,6 +65,7 @@ export const K_WRAP_OFFSET = 13835058055282163712n; export const K_MAX_SIZE = 1073741824; /** + * Initialize the lookup table for the Hilbert curve * @param level - zoom level of the cell * @param i - x coord * @param j - y coord diff --git a/src/geometry/index.ts b/src/geometry/index.ts index ea300eb0..6d04e624 100644 --- a/src/geometry/index.ts +++ b/src/geometry/index.ts @@ -1,5 +1,4 @@ export * as LonLat from './ll'; -export * from './planets'; export * from './predicates'; export * from './s1'; export * from './s2'; diff --git a/src/geometry/planets/mercury.ts b/src/geometry/planets/mercury.ts deleted file mode 100644 index 79d01a57..00000000 --- a/src/geometry/planets/mercury.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** Mercury's radius in meters */ -export const MERCURY_RADIUS = 2_439_700; -/** Mercury's equitorial radius in meters */ -export const MERCURY_RADIUS_EQUATORIAL = 2_440_500; -/** Mercury's polar radius in meters */ -export const MERCURY_RADIUS_POLAR = 2_438_300; -/** The average circumference of Jupiter in meters. */ -export const MERCURY_CIRCUMFERENCE = 15_329_087.193926036; // 2.0 * Math.PI * MERCURY_RADIUS; diff --git a/src/geometry/planets/moon.ts b/src/geometry/planets/moon.ts deleted file mode 100644 index 2fa6c445..00000000 --- a/src/geometry/planets/moon.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** Moon's radius in meters */ -export const MOON_RADIUS = 1_737_400; -/** Moon's equitorial radius in meters */ -export const MOON_RADIUS_EQUATORIAL = 1_738_100; -/** Moon's polar radius in meters */ -export const MOON_RADIUS_POLAR = 1_736_000; -/** The average circumference of the Moon in meters. */ -export const MOON_CIRCUMFERENCE = 10_916_406.152693814; // 2.0 * Math.PI * MOON_RADIUS; diff --git a/src/geometry/s1/angle.ts b/src/geometry/s1/angle.ts index 98b30bbd..c344c05e 100644 --- a/src/geometry/s1/angle.ts +++ b/src/geometry/s1/angle.ts @@ -1,4 +1,4 @@ -import { EARTH_RADIUS } from '../planets/earth'; +import { EARTH_RADIUS } from '../../space/planets'; import { angle } from '../s2/point'; import { getDistance } from '../ll'; import { degToRad, radToDeg } from '..'; @@ -113,6 +113,7 @@ export function toE7(e7_: number): S1Angle { export function fromS2Points(a: Point3D, b: Point3D): S1Angle { return angle(a, b); } + /** * Like the constructor above, but return the angle (i.e., distance) between * two S2LatLng points. This function has about 15 digits of accuracy for @@ -129,19 +130,41 @@ export function fromLonLat(a: LonLat, b: LonLat): S1Angle { /** * convert an angle in radians to an angle in meters * @param angle - input angle in radians + * @param radius - radius of the planet (defaults to Earth's radius) * @returns - angle in meters */ -export function toMeters(angle: S1Angle): number { - return angle * EARTH_RADIUS; +export function toMeters(angle: S1Angle, radius = EARTH_RADIUS): number { + return angle * radius; +} + +/** + * convert an angle in meters to an angle in radians + * @param angle - angle in meters + * @param radius - radius of the planet (defaults to Earth's radius) + * @returns - angle in radians + */ +export function fromMeters(angle: number, radius = EARTH_RADIUS): S1Angle { + return angle / radius; } /** * convert an angle in radians to an angle in kilometers * @param angle - input angle in radians + * @param radius - radius of the planet (defaults to Earth's radius) * @returns - angle in meters */ -export function toKM(angle: S1Angle): number { - return (angle * EARTH_RADIUS) / 1_000; +export function toKM(angle: S1Angle, radius = EARTH_RADIUS): number { + return (angle * radius) / 1_000; +} + +/** + * convert an angle in kilometers to an angle in radians + * @param angle - angle in kilometers + * @param radius - radius of the planet (defaults to Earth's radius) + * @returns - angle in radians + */ +export function fromKM(angle: number, radius = EARTH_RADIUS): S1Angle { + return (angle * 1_000) / radius; } // Note that the E5, E6, and E7 conversion involve two multiplications rather diff --git a/src/geometry/s1/chordAngle.ts b/src/geometry/s1/chordAngle.ts index 23bd8d92..2bf06353 100644 --- a/src/geometry/s1/chordAngle.ts +++ b/src/geometry/s1/chordAngle.ts @@ -1,4 +1,10 @@ -import { toKM as angleToKM, toMeters as angleToMeters } from './angle'; +import { EARTH_RADIUS } from '../../space/planets'; +import { + fromKM as angleFromKM, + fromMeters as angleFromMeters, + toKM as angleToKM, + toMeters as angleToMeters, +} from './angle'; import { norm2, sub } from '../s2/point'; import type { Point3D } from '../'; @@ -231,6 +237,16 @@ export function toMeters(cAngle: S1ChordAngle): number { return angleToMeters(toAngle(cAngle)); } +/** + * Convert from meters. + * @param meters - distance in meters + * @param radius - radius of the planet (defaults to Earth's radius) + * @returns - the ChordAngle + */ +export function fromMeters(meters: number, radius = EARTH_RADIUS): S1ChordAngle { + return fromAngle(angleFromMeters(meters, radius)); +} + /** * Convert to kilometers. * @param cAngle - The ChordAngle to convert. @@ -240,6 +256,16 @@ export function toKM(cAngle: S1ChordAngle): number { return angleToKM(toAngle(cAngle)); } +/** + * Convert from kilometers. + * @param km - distance in kilometers + * @param radius - radius of the planet (defaults to Earth's radius) + * @returns - the ChordAngle + */ +export function fromKM(km: number, radius = EARTH_RADIUS): S1ChordAngle { + return fromAngle(angleFromKM(km, radius)); +} + // Trigonmetric functions. It is more accurate and efficient to call these // rather than first converting to an S1Angle. diff --git a/src/geometry/s2/point.ts b/src/geometry/s2/point.ts index ac852795..6a919fe5 100644 --- a/src/geometry/s2/point.ts +++ b/src/geometry/s2/point.ts @@ -1,4 +1,4 @@ -import { EARTH_RADIUS_EQUATORIAL, EARTH_RADIUS_POLAR } from '../planets/earth'; +import { EARTH_RADIUS_EQUATORIAL, EARTH_RADIUS_POLAR } from '../../space/planets/earth'; import { IJtoST, STtoIJ, diff --git a/src/geometry/tools/convert.ts b/src/geometry/tools/convert.ts index 54fc5414..50326f9f 100644 --- a/src/geometry/tools/convert.ts +++ b/src/geometry/tools/convert.ts @@ -11,6 +11,7 @@ import type { } from '..'; /** + * Convert a GeoJSON Feature to a GeoJSON Vector Feature in either a WebMercator or S2 projection * @param projection - output either S2 or WM * @param data - the data to convert * @param buildBBox - optional - build a bbox for the feature if desired @@ -53,6 +54,7 @@ export function convert( } /** + * Convert a GeoJSON Feature to a GeoJSON Vector Feature in either a WebMercator or S2 projection * @param projection - either S2 or WM is the end goal feature * @param data - input feature data * @param toUS - convert to unit scale if true @@ -79,6 +81,7 @@ function convertFeature( } /** + * Convert a GeoJSON Vector Feature to the appropriate projection and adjust to a unit scale if desired. * @param projection - either S2 or WM is the end goal feature * @param data - input feature data * @param toUS - convert to unit scale if true @@ -102,6 +105,7 @@ function convertVectorFeature( } /** + * Convert a GeoJSON S2 Feature to the appropriate projection and adjust to a unit scale if desired. * @param projection - either S2 or WM is the end goal feature * @param data - input feature data * @param toUS - convert to unit scale if true diff --git a/src/geometry/tools/index.ts b/src/geometry/tools/index.ts index 674faad4..40ea84c3 100644 --- a/src/geometry/tools/index.ts +++ b/src/geometry/tools/index.ts @@ -1,3 +1,5 @@ export * from './clip'; export * from './convert'; +export * from './points'; +export * from './polys'; export * from './simplify'; diff --git a/src/geometry/tools/points.ts b/src/geometry/tools/points.ts new file mode 100644 index 00000000..43aa4f9a --- /dev/null +++ b/src/geometry/tools/points.ts @@ -0,0 +1,78 @@ +import type { Properties, VectorFeature, VectorMultiPointGeometry, VectorPoint } from '../..'; + +/** + * Find the average of a collection of Vector points + * @param vectorPoints - collection of Vector points, whether from a VectorFeature, geometry, or raw coordinates + * @returns - the average of the vector points + */ +export function averageOfPoints( + vectorPoints: + | VectorPoint[] + | VectorMultiPointGeometry + | VectorFeature, Properties, Properties, VectorMultiPointGeometry>, +): VectorPoint { + const coords = + 'geometry' in vectorPoints + ? vectorPoints.geometry.coordinates + : 'coordinates' in vectorPoints + ? vectorPoints.coordinates + : vectorPoints; + if (coords.length === 0) return { x: 0, y: 0 }; + let xAvg = 0; + let yAvg = 0; + let zAvg = 0; + let hasZ = false; + for (const { x, y, z } of coords) { + xAvg += x; + yAvg += y; + if (z !== undefined) { + zAvg += z; + hasZ = true; + } + } + xAvg /= coords.length; + yAvg /= coords.length; + zAvg /= coords.length; + if (hasZ) return { x: xAvg, y: yAvg, z: zAvg }; + return { x: xAvg, y: yAvg }; +} + +/** + * Find the center of a collection of Vector points + * @param vectorPoints - collection of Vector points, whether from a VectorFeature, geometry, or raw coordinates + * @returns - the center of the vector points + */ +export function centerOfPoints( + vectorPoints: + | VectorPoint[] + | VectorMultiPointGeometry + | VectorFeature, Properties, Properties, VectorMultiPointGeometry>, +): VectorPoint { + const { min, max } = Math; + const coords = + 'geometry' in vectorPoints + ? vectorPoints.geometry.coordinates + : 'coordinates' in vectorPoints + ? vectorPoints.coordinates + : vectorPoints; + let minX = Infinity; + let maxX = -Infinity; + let minY = Infinity; + let maxY = -Infinity; + let minZ = Infinity; + let maxZ = -Infinity; + for (const { x, y, z } of coords) { + minX = min(minX, x); + maxX = max(maxX, x); + minY = min(minY, y); + maxY = max(maxY, y); + if (z !== undefined) { + minZ = min(minZ, z); + maxZ = max(maxZ, z); + } + } + const x = (minX + maxX) / 2; + const y = (minY + maxY) / 2; + if (minZ !== Infinity && maxZ !== -Infinity) return { x, y, z: (minZ + maxZ) / 2 }; + return { x, y }; +} diff --git a/src/geometry/tools/polys.ts b/src/geometry/tools/polys.ts new file mode 100644 index 00000000..464feea2 --- /dev/null +++ b/src/geometry/tools/polys.ts @@ -0,0 +1,235 @@ +import { EARTH_RADIUS } from '../../space/planets'; +import { orient2d } from '../predicates'; +import { pointOverlap } from '../bbox'; + +import type { + Properties, + S2Feature, + VectorFeature, + VectorLineString, + VectorMultiPolygon, + VectorMultiPolygonGeometry, + VectorPoint, + VectorPolygon, + VectorPolygonGeometry, +} from '../..'; + +// TODO: polygon(s)AreaS2(...) + +/** + * Find the area of a collection of polygons. Assumes geometry is in lon-lat space + * @param polygons - the collection of polygons + * @param planetRadius - the radius of the planet (Earth by default) + * @returns - the total area of the polygon + */ +export function polygonsArea( + polygons: + | VectorMultiPolygon + | VectorMultiPolygonGeometry + | VectorFeature, Properties, Properties, VectorMultiPolygonGeometry>, + planetRadius = EARTH_RADIUS, +): number { + const vectorPolygons: VectorMultiPolygon = + 'geometry' in polygons + ? polygons.geometry.coordinates + : 'coordinates' in polygons + ? polygons.coordinates + : polygons; + + let area = 0; + for (const polygon of vectorPolygons) area += polygonArea(polygon, planetRadius); + + return area; +} + +/** + * Find the area of a polygon. Assumes geometry is in Lon-Lat space + * @param polygon - the polygon + * @param planetRadius - the radius of the planet (Earth by default) + * @returns - The approximate signed geodesic area of the polygon in square meters. + */ +export function polygonArea( + polygon: + | VectorPolygon + | VectorPolygonGeometry + | VectorFeature, Properties, Properties, VectorPolygonGeometry>, + planetRadius = EARTH_RADIUS, +): number { + // check poly against the point + const vectorPolygon: VectorPolygon = + 'geometry' in polygon + ? polygon.geometry.coordinates + : 'coordinates' in polygon + ? polygon.coordinates + : polygon; + + // grab the area of the outer ring + let area = _ringArea(vectorPolygon[0], planetRadius); + // subtract the area of the inner rings (holes) + for (let i = 1; i < vectorPolygon.length; i++) { + area -= _ringArea(vectorPolygon[i], planetRadius); + } + + return area; +} + +/** + * A robust method to see if a point is in a collection of polygons or not. + * Be sure the point and polygon are in the same projection space. + * @param point - the point to check + * @param polygons - the collection of polygons + * @param ignoreBoundary - if true, ignore when the point is on the boundary + * @returns - true if the point is in the polygon + */ +export function pointInPolygons( + point: VectorPoint, + polygons: + | VectorMultiPolygon + | VectorMultiPolygonGeometry + | VectorFeature, Properties, Properties, VectorMultiPolygonGeometry> + | S2Feature, Properties, Properties, VectorMultiPolygonGeometry>, + ignoreBoundary = false, +): boolean { + const vectorPolygons: VectorMultiPolygon = + 'geometry' in polygons + ? polygons.geometry.coordinates + : 'coordinates' in polygons + ? polygons.coordinates + : polygons; + for (const polygon of vectorPolygons) + if (pointInPolygon(point, polygon, ignoreBoundary)) return true; + return false; +} + +/** + * A robust method to see if a point is in a polygon or not. + * Be sure the point and polygon are in the same projection space. + * @param point - the point to check + * @param polygon - the polygon + * @param ignoreBoundary - if true, ignore when the point is on the boundary + * @returns - true if the point is in the polygon + */ +export function pointInPolygon( + point: VectorPoint, + polygon: + | VectorPolygon + | VectorPolygonGeometry + | VectorFeature, Properties, Properties, VectorPolygonGeometry> + | S2Feature, Properties, Properties, VectorPolygonGeometry>, + ignoreBoundary = false, +): boolean { + // bbox test case - if it doesn't even fit within the bbox, we know it's not in the polygon + const bbox = + 'geometry' in polygon ? polygon.geometry.bbox : 'bbox' in polygon ? polygon.bbox : undefined; + if (bbox !== undefined && !pointOverlap(bbox, point)) return false; + // check poly against the point + const vectorPolygon: VectorPolygon = + 'geometry' in polygon + ? polygon.geometry.coordinates + : 'coordinates' in polygon + ? polygon.coordinates + : polygon; + + const pip = _pointInPolygon(point, vectorPolygon); + if (pip === 0) { + if (ignoreBoundary) return false; + return true; + } else return pip; +} + +/** + * A Robust point in polygon test + * @param point - the point + * @param polygon - the polygon + * @returns - true if the point is in the polygon, 0 if on the boundary, false otherwise + */ +function _pointInPolygon(point: VectorPoint, polygon: VectorPolygon): boolean | 0 { + let i; + let ii; + let k = 0; + let f; + let u1; + let v1; + let u2; + let v2; + let currentP; + let nextP; + + const { x, y } = point; + + const numContours = polygon.length; + for (i = 0; i < numContours; i++) { + ii = 0; + const contour = polygon[i]; + const contourLen = contour.length - 1; + + currentP = contour[0]; + if (currentP.x !== contour[contourLen].x && currentP.y !== contour[contourLen].y) { + // since the first and last coordinates in a ring are not the same, assume it's not a polygon and return false + return false; + } + + u1 = currentP.x - x; + v1 = currentP.y - y; + + for (ii; ii < contourLen; ii++) { + nextP = contour[ii + 1]; + + u2 = nextP.x - x; + v2 = nextP.y - y; + + if (v1 === 0 && v2 === 0) { + if ((u2 <= 0 && u1 >= 0) || (u1 <= 0 && u2 >= 0)) return 0; + } else if ((v2 >= 0 && v1 <= 0) || (v2 <= 0 && v1 >= 0)) { + f = orient2d(u1, u2, v1, v2, 0, 0); + if (f === 0) return 0; + if ((f > 0 && v2 > 0 && v1 <= 0) || (f < 0 && v2 <= 0 && v1 > 0)) k++; + } + currentP = nextP; + v1 = v2; + u1 = u2; + } + } + + if (k % 2 === 0) return false; + return true; +} + +/** + * Calculate the approximate area of the polygon were it projected onto the planet. + * Note that this area will be positive if ring is oriented counter-clockwise, + * otherwise it will be negative. + * + * Reference: + * Robert. G. Chamberlain and William H. Duquette, "Some Algorithms for Polygons on a Sphere", + * JPL Publication 07-03, Jet Propulsion + * Laboratory, Pasadena, CA, June 2007 https://trs.jpl.nasa.gov/handle/2014/40409 + * @param coords - ring Coordinates in lon-lat space + * @param planetRadius - the radius of the planet (Earth by default) + * @returns - The approximate signed geodesic area of the polygon in square meters. + */ +function _ringArea(coords: VectorLineString, planetRadius: number): number { + const RAD = 0.017453292519943295; // Math.PI / 180; + const coordsLength = coords.length - 1; + const factor = (planetRadius * planetRadius) / 2; + + if (coordsLength <= 2) return 0; + let total = 0; + + let i = 0; + while (i < coordsLength) { + const lower = coords[i]; + const middle = coords[i + 1 === coordsLength ? 0 : i + 1]; + const upper = coords[i + 2 >= coordsLength ? (i + 2) % coordsLength : i + 2]; + + const lowerX = lower.x * RAD; + const middleY = middle.y * RAD; + const upperX = upper.x * RAD; + + total += (upperX - lowerX) * Math.sin(middleY); + + i++; + } + + return -(total * factor); +} diff --git a/src/geometry/wm/coords.ts b/src/geometry/wm/coords.ts index 3a874763..d516abfc 100644 --- a/src/geometry/wm/coords.ts +++ b/src/geometry/wm/coords.ts @@ -1,4 +1,4 @@ -import { EARTH_CIRCUMFERENCE } from '../planets/earth'; +import { EARTH_CIRCUMFERENCE } from '../../space/planets/earth'; import { degToRad, radToDeg } from '../util'; import type { BBox, Point, Point3D } from '../'; @@ -210,7 +210,7 @@ export function xyzToBBOX( /** * Convert a bbox of the form `[w, s, e, n]` to a tile's bounding box - * in the form of { minX, maxX, minY, maxY } + * in the form of [minX, maxX, minY, maxY] * The bbox can be in lon-lat (WGS84) or WebMercator (900913) * The default expectation is in WebMercator (900913) * @param bbox - the bounding box diff --git a/src/proj4/datum.ts b/src/proj4/datum.ts index cdab5964..38719532 100644 --- a/src/proj4/datum.ts +++ b/src/proj4/datum.ts @@ -325,6 +325,7 @@ export function geocentricFromWgs84( } /** + * check if 1 or 2 (3 or 7 parameter datum) * @param type - datum type * @returns - true if 1 or 2 (3 or 7 parameter datum) */ diff --git a/src/proj4/jsonScheme.ts b/src/proj4/jsonScheme.ts new file mode 100644 index 00000000..cc2e1d4e --- /dev/null +++ b/src/proj4/jsonScheme.ts @@ -0,0 +1,878 @@ +/** + * Schema for PROJJSON (v0.7) + * @see https://proj.org/schemas/v0.7/projjson.schema.json + */ +export interface PROJJSON { + $schema?: string; + type?: string; + name?: string; + source_crs?: CRS; + target_crs?: CRS; + method?: Method; + parameters?: ParameterValue[]; + id?: Id; + ids?: Id[]; + accuracy?: string; + scope?: string; + area?: string; + bbox?: BBox; + vertical_extent?: VerticalExtent; + temporal_extent?: TemporalExtent; + remarks?: string; + usages?: Usage[]; +} + +/** Coordinate Reference System */ +export type CRS = + | BoundCRS + | CompoundCRS + | EngineeringCRS + | GeodeticCRS + | ProjectedCRS + | TemporalCRS + | VerticalCRS; + +/** Bounding Box */ +export interface BBox { + east_longitude: number; + west_longitude: number; + south_latitude: number; + north_latitude: number; +} + +/** Vertical Extent */ +export interface VerticalExtent { + minimum: number; + maximum: number; + unit?: Unit; +} + +/** Temporal Extent */ +export interface TemporalExtent { + start: string; + end: string; +} + +/** ID Object */ +export interface Id { + authority: string; + code: string | number; + version?: string | number; + authority_citation?: string; + uri?: string; +} + +/** Usage Object */ +export interface Usage { + scope?: string; + area?: string; + bbox?: BBox; + vertical_extent?: VerticalExtent; + temporal_extent?: TemporalExtent; +} + +/** Parameter Value */ +export interface ParameterValue { + $schema?: string; + type: 'ParameterValue'; + name: string; + value: string | number; + unit?: Unit; + id?: Id; + ids?: Id[]; +} + +/** Method Object */ +export interface Method { + $schema?: string; + type: 'OperationMethod'; + name: string; + id?: Id; + ids?: Id[]; +} + +/** Unit Definition */ +export type Unit = + | 'metre' + | 'degree' + | 'unity' + | { + type: 'LinearUnit' | 'AngularUnit' | 'ScaleUnit' | 'TimeUnit' | 'ParametricUnit' | 'Unit'; + name: string; + conversion_factor?: number; + id?: Id; + ids?: Id[]; + }; + +/** CRS Variants */ +export interface BoundCRS { + type: 'BoundCRS'; + name: string; + source_crs: CRS; + target_crs: CRS; + transformation: AbridgedTransformation; + scope?: string; + area?: string; + bbox?: BBox; + vertical_extent?: VerticalExtent; + temporal_extent?: TemporalExtent; + usages?: Usage[]; + remarks?: string; + id?: Id; + ids?: Id[]; +} + +/** Abridged Transformation */ +export interface AbridgedTransformation { + type: 'AbridgedTransformation'; + name: string; + source_crs?: CRS; + method: Method; + parameters: ParameterValue[]; + id?: Id; + ids?: Id[]; +} + +/** + * CompoundCRS Interface + * + * Represents a compound coordinate reference system, which combines two or more coordinate reference systems. + */ +export interface CompoundCRS { + /** Indicates the type of CRS. Always "CompoundCRS" for this interface. */ + type: 'CompoundCRS'; + /** The name of the compound CRS. */ + name: string; + /** + * Array of component CRS objects. + * Each component is a CRS, such as GeodeticCRS, VerticalCRS, etc. + */ + components: CRS[]; + /** The schema URL or identifier. */ + $schema?: string; + /** The scope of the CRS. */ + scope?: string; + /** The area of use for the CRS. */ + area?: string; + /** The bounding box of the CRS. */ + bbox?: BBox; + /** The vertical extent of the CRS. */ + vertical_extent?: VerticalExtent; + /** The temporal extent of the CRS. */ + temporal_extent?: TemporalExtent; + /** An array of usages for the CRS. */ + usages?: Usage[]; + /** Remarks or additional information about the CRS. */ + remarks?: string; + /** An identifier for the CRS. */ + id?: Id; + /** An array of identifiers for the CRS. */ + ids?: Id[]; +} + +/** + * EngineeringCRS Interface + * + * Represents an engineering coordinate reference system. + */ +export interface EngineeringCRS { + /** Indicates the type of CRS. Always "EngineeringCRS" for this interface. */ + type: 'EngineeringCRS'; + /** The name of the engineering CRS. */ + name: string; + /** The engineering datum associated with this CRS. */ + datum: EngineeringDatum; + /** The coordinate system used in this CRS. */ + coordinate_system?: CoordinateSystem; + /** The schema URL or identifier. */ + $schema?: string; + /** The scope of the CRS. */ + scope?: string; + /** The area of use for the CRS. */ + area?: string; + /** The bounding box of the CRS. */ + bbox?: BBox; + /** The vertical extent of the CRS. */ + vertical_extent?: VerticalExtent; + /** The temporal extent of the CRS. */ + temporal_extent?: TemporalExtent; + /** An array of usages for the CRS. */ + usages?: Usage[]; + /** Remarks or additional information about the CRS. */ + remarks?: string; + /** An identifier for the CRS. */ + id?: Id; + /** An array of identifiers for the CRS. */ + ids?: Id[]; +} + +/** + * EngineeringDatum Interface + * + * Represents the datum associated with an engineering CRS. + */ +export interface EngineeringDatum { + /** Indicates the type of datum. Always "EngineeringDatum" for this interface. */ + type: 'EngineeringDatum'; + /** The name of the datum. */ + name: string; + /** Anchor point of the datum. */ + anchor?: string; + /** The schema URL or identifier. */ + $schema?: string; + /** The scope of the datum. */ + scope?: string; + /** The area of use for the datum. */ + area?: string; + /** The bounding box of the datum. */ + bbox?: BBox; + /** The vertical extent of the datum. */ + vertical_extent?: VerticalExtent; + /** The temporal extent of the datum. */ + temporal_extent?: TemporalExtent; + /** An array of usages for the datum. */ + usages?: Usage[]; + /** Remarks or additional information about the datum. */ + remarks?: string; + /** An identifier for the datum. */ + id?: Id; + /** An array of identifiers for the datum. */ + ids?: Id[]; +} + +/** + * CoordinateSystem Interface + * + * Represents a coordinate system, which defines the axes and their properties. + */ +export interface CoordinateSystem { + /** Indicates the type of coordinate system. Always "CoordinateSystem" for this interface. */ + type: 'CoordinateSystem'; + /** The name of the coordinate system. */ + name?: string; + /** + * The subtype of the coordinate system. + * Examples include Cartesian, spherical, ellipsoidal, vertical, etc. + */ + subtype: + | 'Cartesian' + | 'spherical' + | 'ellipsoidal' + | 'vertical' + | 'ordinal' + | 'parametric' + | 'affine' + | 'TemporalDateTime' + | 'TemporalCount' + | 'TemporalMeasure'; + /** An array of axis definitions that describe the coordinate system. */ + axis: Axis[]; + /** The schema URL or identifier. */ + $schema?: string; + /** An identifier for the coordinate system. */ + id?: Id; + /** An array of identifiers for the coordinate system. */ + ids?: Id[]; +} + +/** + * Axis Interface + * + * Represents an individual axis in a coordinate system. + */ +export interface Axis { + /** Indicates the type of axis. Always "Axis" for this interface. */ + type: 'Axis'; + /** The name of the axis. */ + name: string; + /** Abbreviation for the axis name. */ + abbreviation: string; + /** + * The direction of the axis. + * Examples include north, east, up, down, geocentricX, geocentricY, geocentricZ, etc. + */ + direction: + | 'north' + | 'northNorthEast' + | 'northEast' + | 'eastNorthEast' + | 'east' + | 'eastSouthEast' + | 'southEast' + | 'southSouthEast' + | 'south' + | 'southSouthWest' + | 'southWest' + | 'westSouthWest' + | 'west' + | 'westNorthWest' + | 'northWest' + | 'northNorthWest' + | 'up' + | 'down' + | 'geocentricX' + | 'geocentricY' + | 'geocentricZ' + | 'columnPositive' + | 'columnNegative' + | 'rowPositive' + | 'rowNegative' + | 'displayRight' + | 'displayLeft' + | 'displayUp' + | 'displayDown' + | 'forward' + | 'aft' + | 'port' + | 'starboard' + | 'clockwise' + | 'counterClockwise' + | 'towards' + | 'awayFrom' + | 'future' + | 'past' + | 'unspecified'; + /** The meridian for the axis, if applicable. */ + meridian?: Meridian; + /** The unit of measurement for the axis. */ + unit?: Unit; + /** The minimum value allowed for the axis. */ + minimum_value?: number; + /** The maximum value allowed for the axis. */ + maximum_value?: number; + /** + * The range meaning for the axis. + * Can be either "exact" or "wraparound". + */ + range_meaning?: 'exact' | 'wraparound'; + /** An identifier for the axis. */ + id?: Id; + /** An array of identifiers for the axis. */ + ids?: Id[]; +} + +/** + * Meridian Interface + * + * Represents a meridian, which defines the longitude for an axis. + */ +export interface Meridian { + /** Indicates the type of meridian. Always "Meridian" for this interface. */ + type: 'Meridian'; + /** The longitude of the meridian. */ + longitude: number | ValueAndUnit; + /** The schema URL or identifier. */ + $schema?: string; + /** An identifier for the meridian. */ + id?: Id; + /** An array of identifiers for the meridian. */ + ids?: Id[]; +} + +/** + * ValueAndUnit Interface + * + * Represents a value paired with a unit of measurement. + */ +export interface ValueAndUnit { + /** The numeric value. */ + value: number; + /** The unit of measurement. */ + unit: Unit; +} + +/** + * GeodeticCRS Interface + * + * Represents a geodetic or geographic coordinate reference system. + */ +export interface GeodeticCRS { + /** Indicates the type of CRS. Can be "GeodeticCRS" or "GeographicCRS". */ + type: 'GeodeticCRS' | 'GeographicCRS'; + /** The name of the geodetic CRS. */ + name: string; + /** + * The datum associated with the geodetic CRS. + * One and only one of `datum` or `datum_ensemble` must be provided. + */ + datum?: GeodeticReferenceFrame | DynamicGeodeticReferenceFrame; + /** The datum ensemble associated with the geodetic CRS. */ + datum_ensemble?: DatumEnsemble; + /** The coordinate system used in the geodetic CRS. */ + coordinate_system?: CoordinateSystem; + /** An array of deformation models associated with the geodetic CRS. */ + deformation_models?: DeformationModel[]; + /** The schema URL or identifier. */ + $schema?: string; + /** The scope of the CRS. */ + scope?: string; + /** The area of use for the CRS. */ + area?: string; + /** The bounding box of the CRS. */ + bbox?: BBox; + /** The vertical extent of the CRS. */ + vertical_extent?: VerticalExtent; + /** The temporal extent of the CRS. */ + temporal_extent?: TemporalExtent; + /** An array of usages for the CRS. */ + usages?: Usage[]; + /** Remarks or additional information about the CRS. */ + remarks?: string; + /** An identifier for the CRS. */ + id?: Id; + /** An array of identifiers for the CRS. */ + ids?: Id[]; +} + +/** + * GeodeticReferenceFrame Interface + * + * Represents the geodetic reference frame associated with a geodetic CRS. + */ +export interface GeodeticReferenceFrame { + /** Indicates the type of reference frame. Always "GeodeticReferenceFrame" for this interface. */ + type: 'GeodeticReferenceFrame'; + /** The name of the reference frame. */ + name: string; + /** The anchor point of the reference frame. */ + anchor?: string; + /** The epoch of the anchor point. */ + anchor_epoch?: number; + /** The ellipsoid used in the reference frame. */ + ellipsoid: Ellipsoid; + /** The prime meridian associated with the reference frame. */ + prime_meridian?: PrimeMeridian; + /** The schema URL or identifier. */ + $schema?: string; + /** The scope of the reference frame. */ + scope?: string; + /** The area of use for the reference frame. */ + area?: string; + /** The bounding box of the reference frame. */ + bbox?: BBox; + /** The vertical extent of the reference frame. */ + vertical_extent?: VerticalExtent; + /** The temporal extent of the reference frame. */ + temporal_extent?: TemporalExtent; + /** An array of usages for the reference frame. */ + usages?: Usage[]; + /** Remarks or additional information about the reference frame. */ + remarks?: string; + /** An identifier for the reference frame. */ + id?: Id; + /** An array of identifiers for the reference frame. */ + ids?: Id[]; +} + +/** + * DynamicGeodeticReferenceFrame Interface + * + * Represents a dynamic geodetic reference frame. + */ +export interface DynamicGeodeticReferenceFrame { + /** Indicates the type of reference frame. Always "DynamicGeodeticReferenceFrame" for this interface. */ + type: 'DynamicGeodeticReferenceFrame'; + /** The name of the reference frame. */ + name: string; + /** The anchor point of the reference frame. */ + anchor?: string; + /** The epoch of the anchor point. */ + anchor_epoch?: number; + /** The ellipsoid used in the reference frame. */ + ellipsoid: Ellipsoid; + /** The prime meridian associated with the reference frame. */ + prime_meridian?: PrimeMeridian; + /** The frame reference epoch. */ + frame_reference_epoch: number; + /** The schema URL or identifier. */ + $schema?: string; + /** The scope of the reference frame. */ + scope?: string; + /** The area of use for the reference frame. */ + area?: string; + /** The bounding box of the reference frame. */ + bbox?: BBox; + /** The vertical extent of the reference frame. */ + vertical_extent?: VerticalExtent; + /** The temporal extent of the reference frame. */ + temporal_extent?: TemporalExtent; + /** An array of usages for the reference frame. */ + usages?: Usage[]; + /** Remarks or additional information about the reference frame. */ + remarks?: string; + /** An identifier for the reference frame. */ + id?: Id; + /** An array of identifiers for the reference frame. */ + ids?: Id[]; +} + +/** + * DatumEnsemble Interface + * + * Represents a datum ensemble, which is a collection of datums. + */ +export interface DatumEnsemble { + /** Indicates the type of datum ensemble. Always "DatumEnsemble" for this interface. */ + type: 'DatumEnsemble'; + /** The name of the datum ensemble. */ + name: string; + /** An array of members in the datum ensemble. */ + members: Array<{ + name: string; + id?: Id; + ids?: Id[]; + }>; + /** The ellipsoid associated with the datum ensemble. */ + ellipsoid?: Ellipsoid; + /** The accuracy of the datum ensemble. */ + accuracy: string; + /** An identifier for the datum ensemble. */ + id?: Id; + /** An array of identifiers for the datum ensemble. */ + ids?: Id[]; +} + +/** + * DeformationModel Interface + * + * Represents a deformation model associated with a geodetic CRS. + */ +export interface DeformationModel { + /** The name of the deformation model. */ + name: string; + /** An identifier for the deformation model. */ + id?: Id; +} + +/** + * Ellipsoid Interface + * + * Represents an ellipsoid, a geometric figure used in geodetic reference frames. + */ +export interface Ellipsoid { + /** Indicates the type of ellipsoid. Always "Ellipsoid" for this interface. */ + type: 'Ellipsoid'; + /** The name of the ellipsoid. */ + name: string; + /** + * The semi-major axis of the ellipsoid. + * Represented as a number or a value with a unit. + */ + semi_major_axis?: number | ValueAndUnit; + /** + * The semi-minor axis of the ellipsoid. + * Represented as a number or a value with a unit. + * Required when `inverse_flattening` is not provided. + */ + semi_minor_axis?: number | ValueAndUnit; + /** + * The inverse flattening of the ellipsoid. + * Required when `semi_minor_axis` is not provided. + */ + inverse_flattening?: number; + /** + * The radius of the ellipsoid, used for spherical representations. + * Required when neither `semi_minor_axis` nor `inverse_flattening` are provided. + */ + radius?: number | ValueAndUnit; + /** The schema URL or identifier. */ + $schema?: string; + /** An identifier for the ellipsoid. */ + id?: Id; + /** An array of identifiers for the ellipsoid. */ + ids?: Id[]; +} + +/** + * PrimeMeridian Interface + * + * Represents a prime meridian, which defines the origin of longitude in a geographic coordinate system. + */ +export interface PrimeMeridian { + /** Indicates the type of prime meridian. Always "PrimeMeridian" for this interface. */ + type: 'PrimeMeridian'; + /** The name of the prime meridian. */ + name: string; + /** + * The longitude of the prime meridian. + * Represented as a number or a value with a unit. + */ + longitude: number | ValueAndUnit; + /** The schema URL or identifier. */ + $schema?: string; + /** An identifier for the prime meridian. */ + id?: Id; + /** An array of identifiers for the prime meridian. */ + ids?: Id[]; +} + +/** + * ProjectedCRS Interface + * + * Represents a projected coordinate reference system, which transforms geodetic or geographic coordinates + * into a flat, two-dimensional plane using a map projection. + */ +export interface ProjectedCRS { + /** Indicates the type of CRS. Always "ProjectedCRS" for this interface. */ + type: 'ProjectedCRS'; + /** The name of the projected CRS. */ + name: string; + /** + * The base CRS upon which the projection is defined. + * Typically a geodetic CRS. + */ + base_crs: GeodeticCRS; + /** The conversion defining the map projection. */ + conversion: Conversion; + /** The coordinate system used in the projected CRS. */ + coordinate_system?: CoordinateSystem; + /** The schema URL or identifier. */ + $schema?: string; + /** The scope of the CRS. */ + scope?: string; + /** The area of use for the CRS. */ + area?: string; + /** The bounding box of the CRS. */ + bbox?: BBox; + /** The vertical extent of the CRS. */ + vertical_extent?: VerticalExtent; + /** The temporal extent of the CRS. */ + temporal_extent?: TemporalExtent; + /** An array of usages for the CRS. */ + usages?: Usage[]; + /** Remarks or additional information about the CRS. */ + remarks?: string; + /** An identifier for the CRS. */ + id?: Id; + /** An array of identifiers for the CRS. */ + ids?: Id[]; +} + +/** + * Conversion Interface + * + * Represents the map projection or transformation used in a projected CRS. + */ +export interface Conversion { + /** Indicates the type of conversion. Always "Conversion" for this interface. */ + type: 'Conversion'; + /** The name of the conversion (map projection or transformation). */ + name: string; + /** The method used for the conversion. */ + method: Method; + /** An array of parameter values defining the conversion. */ + parameters?: ParameterValue[]; + /** The schema URL or identifier. */ + $schema?: string; + /** An identifier for the conversion. */ + id?: Id; + /** An array of identifiers for the conversion. */ + ids?: Id[]; +} + +/** + * TemporalCRS Interface + * + * Represents a temporal coordinate reference system, which defines time-based coordinates. + */ +export interface TemporalCRS { + /** Indicates the type of CRS. Always "TemporalCRS" for this interface. */ + type: 'TemporalCRS'; + /** The name of the temporal CRS. */ + name: string; + /** The temporal datum associated with the CRS. */ + datum: TemporalDatum; + /** The coordinate system used in the temporal CRS. */ + coordinate_system?: CoordinateSystem; + /** The schema URL or identifier. */ + $schema?: string; + /** The scope of the CRS. */ + scope?: string; + /** The area of use for the CRS. */ + area?: string; + /** The bounding box of the CRS. */ + bbox?: BBox; + /** The vertical extent of the CRS. */ + vertical_extent?: VerticalExtent; + /** The temporal extent of the CRS. */ + temporal_extent?: TemporalExtent; + /** An array of usages for the CRS. */ + usages?: Usage[]; + /** Remarks or additional information about the CRS. */ + remarks?: string; + /** An identifier for the CRS. */ + id?: Id; + /** An array of identifiers for the CRS. */ + ids?: Id[]; +} + +/** + * TemporalDatum Interface + * + * Represents the temporal datum associated with a temporal CRS. + */ +export interface TemporalDatum { + /** Indicates the type of datum. Always "TemporalDatum" for this interface. */ + type: 'TemporalDatum'; + /** The name of the temporal datum. */ + name: string; + /** The calendar system used for the datum. */ + calendar: string; + /** The time origin of the temporal datum, typically an ISO 8601 date/time string. */ + time_origin: string; + /** The schema URL or identifier. */ + $schema?: string; + /** The scope of the datum. */ + scope?: string; + /** The area of use for the datum. */ + area?: string; + /** The bounding box of the datum. */ + bbox?: BBox; + /** The vertical extent of the datum. */ + vertical_extent?: VerticalExtent; + /** The temporal extent of the datum. */ + temporal_extent?: TemporalExtent; + /** An array of usages for the datum. */ + usages?: Usage[]; + /** Remarks or additional information about the datum. */ + remarks?: string; + /** An identifier for the datum. */ + id?: Id; + /** An array of identifiers for the datum. */ + ids?: Id[]; +} + +/** + * VerticalCRS Interface + * + * Represents a vertical coordinate reference system, which is used for height or depth measurements. + */ +export interface VerticalCRS { + /** Indicates the type of CRS. Always "VerticalCRS" for this interface. */ + type: 'VerticalCRS'; + /** The name of the vertical CRS. */ + name: string; + /** + * The vertical datum associated with the CRS. + * One and only one of `datum` or `datum_ensemble` must be provided. + */ + datum?: VerticalReferenceFrame | DynamicVerticalReferenceFrame; + /** The datum ensemble associated with the CRS. */ + datum_ensemble?: DatumEnsemble; + /** The coordinate system used in the vertical CRS. */ + coordinate_system?: CoordinateSystem; + /** The geoid model associated with the vertical CRS. */ + geoid_model?: GeoidModel; + /** An array of geoid models associated with the vertical CRS. */ + geoid_models?: GeoidModel[]; + /** An array of deformation models associated with the vertical CRS. */ + deformation_models?: DeformationModel[]; + /** The schema URL or identifier. */ + $schema?: string; + /** The scope of the CRS. */ + scope?: string; + /** The area of use for the CRS. */ + area?: string; + /** The bounding box of the CRS. */ + bbox?: BBox; + /** The vertical extent of the CRS. */ + vertical_extent?: VerticalExtent; + /** The temporal extent of the CRS. */ + temporal_extent?: TemporalExtent; + /** An array of usages for the CRS. */ + usages?: Usage[]; + /** Remarks or additional information about the CRS. */ + remarks?: string; + /** An identifier for the CRS. */ + id?: Id; + /** An array of identifiers for the CRS. */ + ids?: Id[]; +} + +/** + * VerticalReferenceFrame Interface + * + * Represents the vertical reference frame associated with a vertical CRS. + */ +export interface VerticalReferenceFrame { + /** Indicates the type of reference frame. Always "VerticalReferenceFrame" for this interface. */ + type: 'VerticalReferenceFrame'; + /** The name of the vertical reference frame. */ + name: string; + /** The anchor point of the reference frame. */ + anchor?: string; + /** The epoch of the anchor point. */ + anchor_epoch?: number; + /** The schema URL or identifier. */ + $schema?: string; + /** The scope of the reference frame. */ + scope?: string; + /** The area of use for the reference frame. */ + area?: string; + /** The bounding box of the reference frame. */ + bbox?: BBox; + /** The vertical extent of the reference frame. */ + vertical_extent?: VerticalExtent; + /** The temporal extent of the reference frame. */ + temporal_extent?: TemporalExtent; + /** An array of usages for the reference frame. */ + usages?: Usage[]; + /** Remarks or additional information about the reference frame. */ + remarks?: string; + /** An identifier for the reference frame. */ + id?: Id; + /** An array of identifiers for the reference frame. */ + ids?: Id[]; +} + +/** + * DynamicVerticalReferenceFrame Interface + * + * Represents a dynamic vertical reference frame. + */ +export interface DynamicVerticalReferenceFrame { + /** Indicates the type of reference frame. Always "DynamicVerticalReferenceFrame" for this interface. */ + type: 'DynamicVerticalReferenceFrame'; + /** The name of the reference frame. */ + name: string; + /** The anchor point of the reference frame. */ + anchor?: string; + /** The epoch of the anchor point. */ + anchor_epoch?: number; + /** The frame reference epoch for the dynamic reference frame. */ + frame_reference_epoch: number; + /** The schema URL or identifier. */ + $schema?: string; + /** The scope of the reference frame. */ + scope?: string; + /** The area of use for the reference frame. */ + area?: string; + /** The bounding box of the reference frame. */ + bbox?: BBox; + /** The vertical extent of the reference frame. */ + vertical_extent?: VerticalExtent; + /** The temporal extent of the reference frame. */ + temporal_extent?: TemporalExtent; + /** An array of usages for the reference frame. */ + usages?: Usage[]; + /** Remarks or additional information about the reference frame. */ + remarks?: string; + /** An identifier for the reference frame. */ + id?: Id; + /** An array of identifiers for the reference frame. */ + ids?: Id[]; +} + +/** + * GeoidModel Interface + * + * Represents a geoid model associated with a vertical CRS. + */ +export interface GeoidModel { + /** The name of the geoid model. */ + name: string; + /** The interpolation CRS for the geoid model. */ + interpolation_crs?: CRS; + /** An identifier for the geoid model. */ + id?: Id; +} diff --git a/src/proj4/mgrs.ts b/src/proj4/mgrs.ts index 7ce8ddad..d7055300 100644 --- a/src/proj4/mgrs.ts +++ b/src/proj4/mgrs.ts @@ -41,7 +41,7 @@ const Z = 90; // Z * 100 m, 2 for 1 km, 1 for 10 km or 0 for 100 km). Optional, default is 5. * @returns the MGRS string for the given location and accuracy. */ -export function forward(ll: VectorPoint, accuracy?: number): string { +export function mgrsForward(ll: VectorPoint, accuracy?: number): string { accuracy = accuracy !== undefined ? accuracy : 5; // default accuracy 1m const { x, y } = ll; @@ -68,7 +68,7 @@ export function forward(ll: VectorPoint, accuracy?: number): string { * (longitude) and top (latitude) values in WGS84, representing the * bounding box for the provided MGRS reference. */ -export function inverse(mgrs: string): undefined | BBox { +export function mgrsInverse(mgrs: string): undefined | BBox { const bbox = UTMtoLL(decode(mgrs.toUpperCase())); if (bbox === undefined) return undefined; if (bbox.lat !== undefined && bbox.lon !== undefined) { @@ -78,10 +78,11 @@ export function inverse(mgrs: string): undefined | BBox { } /** + * Convert MGRS to lat/lon. * @param mgrs - MGRS string. * @returns The center of the MGRS bounding box */ -export function toPoint(mgrs: string): undefined | VectorPoint { +export function mgrsToPoint(mgrs: string): undefined | VectorPoint { const bbox = UTMtoLL(decode(mgrs.toUpperCase())); if (bbox === undefined) return undefined; if (bbox.lat !== undefined && bbox.lon !== undefined) return { x: bbox.lon, y: bbox.lat }; @@ -175,7 +176,7 @@ function LLtoUTM(ll: VectorPoint): UTM { northing: Math.trunc(UTMNorthing), easting: Math.trunc(UTMEasting), zoneNumber: ZoneNumber, - zoneLetter: getLetterDesignator(lat), + zoneLetter: mgrsGetLetterDesignator(lat), }; } @@ -324,7 +325,7 @@ function UTMtoLL(utm: UTM): PointBounds | undefined { * for. * @returns The letter designator. */ -export function getLetterDesignator(latitude: number): string { +export function mgrsGetLetterDesignator(latitude: number): string { if (latitude <= 84 && latitude >= 72) { // the X band is 12 degrees high return 'X'; diff --git a/src/proj4/parseCode.ts b/src/proj4/parseCode.ts index eab50f58..31967c7b 100644 --- a/src/proj4/parseCode.ts +++ b/src/proj4/parseCode.ts @@ -15,7 +15,7 @@ import type { Transformer } from './transformer'; /** * Parse a proj4 string or object into a projection object - * TODO: Support json objects that use the https://proj.org/schemas/v0.7/projjson.schema.json + * TODO: Support json objects that use the jsonScheme.ts file * @param code - a proj4 projection definition string or object * @param transformer - the transformer to build the projection state around * @returns - a projection object diff --git a/src/proj4/projections/base.ts b/src/proj4/projections/base.ts index adedf25f..56ae90f7 100644 --- a/src/proj4/projections/base.ts +++ b/src/proj4/projections/base.ts @@ -1,7 +1,7 @@ import { D2R, PJD_NODATUM, R2D } from '../constants'; import type { DatumParams } from '../../readers/wkt'; -import type { GridDefinition } from '../../readers/nadgrid'; +import type { NadGridDefinition } from '../../readers/nadgrid'; import type { ProjectionTransform } from '.'; import type { VectorPoint } from '../../geometry'; @@ -57,7 +57,7 @@ export interface ProjectionParams { noRot?: boolean; rA?: boolean; projName?: string; - grids?: GridDefinition[]; + grids?: NadGridDefinition[]; } /** Base class for all projections */ @@ -99,7 +99,7 @@ export class ProjectionBase implements ProjectionTransform { approx = false; axis = 'enu'; nadgrids = '@null'; - grids?: GridDefinition[]; + grids?: NadGridDefinition[]; sphere = false; ellps = 'wgs84'; // Ellipsoid name diff --git a/src/proj4/projections/index.ts b/src/proj4/projections/index.ts index 62468712..7d8c490f 100644 --- a/src/proj4/projections/index.ts +++ b/src/proj4/projections/index.ts @@ -37,7 +37,7 @@ import { VanDerGrinten } from './vandg'; import { ProjectionBase } from './base'; import type { DatumParams } from '../../readers/wkt'; -import type { GridDefinition } from '../../readers/nadgrid'; +import type { NadGridDefinition } from '../../readers/nadgrid'; import type { VectorPoint } from '../../geometry'; export * from './aea'; @@ -68,6 +68,7 @@ export * from './ortho'; export * from './poly'; export * from './qsc'; export * from './references'; +export * as EPSG_CODES from './references'; export * from './robin'; export * from './sinu'; export * from './somerc'; @@ -89,7 +90,7 @@ export interface ProjectionTransform { toMeter?: number; fromGreenwich: number; datum?: string; - grids?: GridDefinition[]; + grids?: NadGridDefinition[]; datumCode: string; datumType: number; datumParams: DatumParams; diff --git a/src/proj4/transformer.ts b/src/proj4/transformer.ts index 35693d24..a3a7ece8 100644 --- a/src/proj4/transformer.ts +++ b/src/proj4/transformer.ts @@ -1,7 +1,6 @@ -import * as EPSG_Codes from './projections/references'; import { NadGridStore } from '../readers/nadgrid'; import { parseProj } from './parseCode'; -import { ALL_DEFINITIONS, DEFAULT_DEFINITIONS, WGS84 } from './projections'; +import { ALL_DEFINITIONS, DEFAULT_DEFINITIONS, EPSG_CODES, WGS84 } from './projections'; import { checkNotWGS, datumTransform } from './datum'; import type { MValue, VectorPoint } from '../geometry'; @@ -12,10 +11,58 @@ import type { } from './projections'; /** + * # PROJ4 Transformer + * + * ## Description + * * A Transformer class contains all projections necessary for converting coordinates from one * projection to another. This is a modular class that can be extended to add new projections * as needed to reduce code size and improve performance. * Both forward and inverse projections are default set to wgs84. + * + * Extends the {@link NadGridStore} class to support grid lookups + * + * ## Usage + * + * ### Full Example + * + * ```ts + * import { Transformer, injectAllDefinitions, injectAllEPSGCodes } from 's2-tools'; + * + * // Create a transform using a source and destination projection + * const transform = new Transformer(); + * // inject all default definition projections. This is not memory efficient but ensures all + * // projections are available + * injectAllDefinitions(transform); + * // inject all common EPSG codes. This is not memory efficient but ensures all EPSG codes are available + * injectAllEPSGCodes(transform); + * // If the transform requires a grid, this is how you add it. + * transform.addGridFromReader( + * 'BETA2007.gsb', + * new MMapReader(`${__dirname}/fixtures/BETA2007.gsb`), + * ); + * // Set the source and destination projections + * transform.setSource('EPSG_31466'); + * transform.setDestination('EPSG_25832'); + * // example forward projection + * const forward = transform.forward({ x: 2559552, y: 5670982 }); + * // example inverse projection + * const inverse = transform.inverse({ x: 349757.381712518, y: 5671004.06504954 }); + * ``` + * + * ### Minimal Example only adding the Oblique Mercator + * + * ```ts + * import { Transformer, HotineObliqueMercator, EPSG_8803 } from 's2-tools'; + * + * const transform = new Transformer(); + * transform.insertDefinition(HotineObliqueMercator); + * transform.insertEPSGCode('EPSG_8803', EPSG_8803); + * + * transform.setDestination('EPSG_8803'); + * + * const forward = transform.forward({ x: 60.8, y: -132.2 }); + * ``` */ export class Transformer extends NadGridStore { // EPSG code definitions @@ -34,6 +81,7 @@ export class Transformer extends NadGridStore { */ constructor(sourceCode?: string | ProjectionParams, destCode?: string | ProjectionParams) { super(); + // by default supports the mercator and base (lon-lat) projection for (const def of DEFAULT_DEFINITIONS) this.insertDefinition(def); // defaults to a standard WGS84 lon-lat projection transform this.source = this.destination = this.wgs84 = this.#buildTransformer(WGS84); @@ -58,6 +106,7 @@ export class Transformer extends NadGridStore { } /** + * Build a ProjectionTransform * @param code - can be a WKT object or proj4 encoded string * @returns - A ready to use ProjectionTransform */ @@ -88,6 +137,11 @@ export class Transformer extends NadGridStore { /** * Insert a projection definition + * ```ts + * import { HotineObliqueMercator } from 's2-tools'; + * const transformer = new Transformer(); + * transformer.insertDefinition(HotineObliqueMercator); + * ``` * @param def - a class that may be instatiated with future setSource and setDestination * @param names - optionally add projection reference names to add lookups to the definition */ @@ -98,6 +152,11 @@ export class Transformer extends NadGridStore { /** * Insert an EPSG code definition + * ```ts + * import { EPSG_4326 } from 's2-tools'; + * const transformer = new Transformer(); + * transformer.insertEPSGCode('EPSG_4326', EPSG_4326); + * ``` * @param code - EPSG code to insert e.g. "EPSG_4326" (uses underscore instead of colon) * @param value - the EPSG definition which is either a WKT string object or proj4 encoded string */ @@ -107,6 +166,11 @@ export class Transformer extends NadGridStore { /** * Forward projection from src projection to dest projection + * ```ts + * const transformer = new Transformer(); + * transformer.setSource('EPSG_4326'); + * const point = transformer.forward({ x: 0, y: 0 }); + * ``` * @param p - vector point currently in the "source" projection * @param enforceAxis - enforce axis ensures axis consistency relative to the final projection * @returns - vector point in the "destination" projection @@ -116,6 +180,12 @@ export class Transformer extends NadGridStore { } /** + * Inverse projection from dest projection to src projection + * ```ts + * const transformer = new Transformer(); + * transformer.setSource('EPSG_4326'); + * const point = transformer.inverse({ x: 0, y: 0 }); + * ``` * @param p - vector point currently in the "destination" projection * @param enforceAxis - enforce axis ensures axis consistency relative to the final projection * @returns - vector point in the "source" projection @@ -125,6 +195,7 @@ export class Transformer extends NadGridStore { } /** + * Transforms a point from one projection to another * @param sourcePoint - point to start transforming * @param src - source projection * @param dest - destination projection @@ -195,7 +266,7 @@ export function injectAllDefinitions(transformer: Transformer): void { * @param transformer - the transformer to inject EPSG codes to */ export function injectAllEPSGCodes(transformer: Transformer): void { - for (const [key, value] of Object.entries(EPSG_Codes)) transformer.insertEPSGCode(key, value); + for (const [key, value] of Object.entries(EPSG_CODES)) transformer.insertEPSGCode(key, value); } /** diff --git a/src/readers/README.md b/src/readers/README.md index afbe5772..6a6ec79b 100644 --- a/src/readers/README.md +++ b/src/readers/README.md @@ -14,4 +14,3 @@ - [ ] MDS - [ ] Images (.png) (used by grib2) - [ ] LAS/LAZ -- [ ] webmercator tile reader diff --git a/src/readers/csv/index.ts b/src/readers/csv/index.ts index 962ab53b..16626dd5 100644 --- a/src/readers/csv/index.ts +++ b/src/readers/csv/index.ts @@ -17,7 +17,32 @@ export interface CSVReaderOptions { heightKey?: string; } -/** Parse (Geo|S2)JSON from a file that is in the CSV format */ +/** + * # CSV Reader + * + * ## Description + * Parse (Geo|S2)JSON from a file that is in the CSV format + * Implements the {@link FeatureIterator} interface + * + * ## Usage + * ```ts + * import { CSVReader } from 's2-tools'; + * import { FileReader } from 's2-tools/file'; + * + * const fileReader = new FileReader(`${__dirname}/fixtures/basic3D.csv`); + * const csvReader = new CSVReader(fileReader, { + * delimiter: ',', + * lineDelimiter: '\n', + * lonKey: 'Longitude', + * latKey: 'Latitude', + * heightKey: 'height', + * }); + * // read the features + * for await (const feature of reader) { + * console.log(feature); + * } + * ``` + */ export class CSVReader< M = Record, D extends MValue = MValue, diff --git a/src/readers/fetch.ts b/src/readers/fetch.ts index 018c0ed2..df13093a 100644 --- a/src/readers/fetch.ts +++ b/src/readers/fetch.ts @@ -1,6 +1,20 @@ import type { Reader } from '.'; -/** The browser reader that fetches data from a URL. */ +/** + * # Fetch Reader + * + * ## Description + * The browser reader that fetches data from a URL. + * + * ## Usage + * ```ts + * import { FetchReader } from 's2-tools'; + * + * const reader = new FetchReader('https://example.com/BETA2007.gsb', true); + * + * const data = await reader.getRange(0, 100); + * ``` + */ export class FetchReader implements Reader { byteLength = 0; byteOffset = 0; @@ -107,7 +121,7 @@ export class FetchReader implements Reader { * @param _end - end * @returns - empty DataView */ - slice(_begin?: number, _end?: number): DataView { + slice(_begin?: number, _end?: number): DataView { return new DataView(new Uint8Array([]).buffer); } /** @@ -126,11 +140,12 @@ export class FetchReader implements Reader { } /** + * Reads a range from the file * @param offset - the offset of the range * @param length - the length of the range * @returns - the ranged buffer */ - async getRange(offset: number, length?: number): Promise> { + async getRange(offset: number, length?: number): Promise { const bytes = String(offset) + '-' + (length !== undefined ? String(offset + length) : ''); const fetchReq = this.rangeRequests ? fetch(this.path, { diff --git a/src/readers/file.ts b/src/readers/file.ts index 06d5c4a4..a08c08f7 100644 --- a/src/readers/file.ts +++ b/src/readers/file.ts @@ -3,9 +3,25 @@ import { closeSync, openSync, read, readSync, statSync } from 'fs'; import type { Reader } from '.'; +export * from './tile/file'; + const readAsync = promisify(read); -/** Reads data from a file */ +/** + * # File Reader + * + * ## Description + * Reads data from a file implementing the {@link Reader} interface + * + * ## Usage + * ```ts + * import { FileReader } from 's2-tools/file'; + * + * const reader = new FileReader('./BETA2007.gsb'); + * + * const data = await reader.getRange(0, 100); + * ``` + */ export class FileReader implements Reader { #fileHandle: number; byteOffset: number = 0; @@ -133,7 +149,7 @@ export class FileReader implements Reader { * @param end - End of the slice. If not provided, the end of the data is used * @returns - The data as a DataView */ - slice(begin?: number, end?: number): DataView { + slice(begin?: number, end?: number): DataView { if (begin === undefined) begin = 0; if (end === undefined) end = this.byteLength; if (begin < 0 || end > this.byteLength || begin >= end) { @@ -155,6 +171,7 @@ export class FileReader implements Reader { } /** + * Reads a string from the file * @param byteOffset - Start of the string * @param byteLength - Length of the string * @returns - The string @@ -162,16 +179,17 @@ export class FileReader implements Reader { parseString(byteOffset: number, byteLength: number): string { const { textDecoder } = this; const data = this.slice(byteOffset, byteOffset + byteLength).buffer; - const out = textDecoder.decode(data, { stream: true }) + textDecoder.decode(); + const out = textDecoder.decode(data as ArrayBuffer, { stream: true }) + textDecoder.decode(); return out.replace(/\0/g, '').trim(); } /** + * Reads a range from the file * @param offset - the offset of the range * @param length - the length of the range * @returns - the ranged buffer */ - async getRange(offset: number, length: number): Promise> { + async getRange(offset: number, length: number): Promise { const buffer = Buffer.alloc(length); await readAsync(this.#fileHandle, buffer, 0, length, offset); return new Uint8Array(buffer.buffer, 0, length); diff --git a/src/readers/gbfs/index.ts b/src/readers/gbfs/index.ts index 06165198..89ea8e2c 100644 --- a/src/readers/gbfs/index.ts +++ b/src/readers/gbfs/index.ts @@ -7,12 +7,24 @@ export * from './schemaV1'; export * from './schemaV2'; export * from './schemaV3'; -/** The versions of GBFS reader classes this data could be */ +/** + * # General Bikeshare Feed Specification (GBFS) Reader + * + * ## Description + * The versions of GBFS reader classes this data could be (1, 2, or 3) + * Implements the {@link FeatureIterator} interface. + * + * ## Links + * - https://github.com/MobilityData/gbfs + * - https://github.com/MobilityData/gbfs-json-schema/tree/master/v3.0 + */ export type GBFSReader = GBFSReaderV1 | GBFSReaderV2 | GBFSReaderV3; /** The versions of GBFS schemas this data could be */ export type GBFSTypess = GBFSV1 | GBFSV2 | GBFSV3; +// TODO: All features should be parsed as VectorGeometry + /** * Given a link to a GBFS feed, build the appropriate reader for the feed. * Examples: diff --git a/src/readers/geotiff/decoder.ts b/src/readers/geotiff/decoder.ts index 5cfc7c20..9d164e68 100644 --- a/src/readers/geotiff/decoder.ts +++ b/src/readers/geotiff/decoder.ts @@ -1,10 +1,10 @@ -import { jpegDecoder } from '../image'; import { decompressStream, lzwDecoder } from '../../util'; +import { imageDecoderBuffer, jpegDecoder } from '../image'; /** What to expect from the decoder */ export type Decoder = - | ((buffer: ArrayBuffer, tables?: number[]) => Promise) - | ((buffer: ArrayBuffer, tables?: number[]) => ArrayBuffer); + | ((buffer: ArrayBufferLike, tables?: number[]) => Promise) + | ((buffer: ArrayBufferLike, tables?: number[]) => ArrayBufferLike); /** * @param compression - the encoded compression value @@ -14,7 +14,7 @@ export function getDecoder(compression = 1): Decoder { if (compression === 1) return rawDecoder; else if (compression === 5) return lzwDecoder; else if (compression === 7) return jpegDecoder; - else if ([6, 50001].includes(compression)) return imageDecoder; + else if ([6, 50001].includes(compression)) return imageDecoderBuffer; else if ([8, 32946].includes(compression)) return deflateDecoder; else if (compression === 32773) return packbitsDecoder; throw new Error(`Unsupported compression: ${compression}`); @@ -25,7 +25,7 @@ export function getDecoder(compression = 1): Decoder { * @param buffer - inflated data * @returns - the decoded buffer */ -async function deflateDecoder(buffer: ArrayBuffer): Promise { +async function deflateDecoder(buffer: ArrayBufferLike): Promise { return (await decompressStream(new Uint8Array(buffer))).buffer; } @@ -34,33 +34,16 @@ async function deflateDecoder(buffer: ArrayBuffer): Promise { * @param buffer - the input buffer * @returns - the decoded buffer */ -function rawDecoder(buffer: ArrayBuffer): ArrayBuffer { +function rawDecoder(buffer: ArrayBufferLike): ArrayBufferLike { return buffer; } -/** - * Image decoder - * @param buffer - the input buffer - * @returns - the decoded buffer - */ -async function imageDecoder(buffer: ArrayBuffer): Promise { - const blob = new Blob([buffer as ArrayBuffer]); // e.g. { type: 'image/png' } - const imageBitmap = await createImageBitmap(blob); - // Create OffscreenCanvas and draw - const canvas = new OffscreenCanvas(imageBitmap.width, imageBitmap.height); - const ctx = canvas.getContext('2d'); - if (ctx === null) throw new Error('Could not get 2d context'); - ctx.drawImage(imageBitmap, 0, 0); - - const imageData = ctx.getImageData(0, 0, imageBitmap.width, imageBitmap.height); - return imageData.data.buffer; -} /** * Packbits decoder * @param buffer - an array of packed bits in a block * @returns the decoded array */ -function packbitsDecoder(buffer: ArrayBuffer): ArrayBuffer { +function packbitsDecoder(buffer: ArrayBufferLike): ArrayBufferLike { const dataView = new DataView(buffer); const out = []; diff --git a/src/readers/geotiff/image.ts b/src/readers/geotiff/image.ts index 253db6e4..498e5ea4 100644 --- a/src/readers/geotiff/image.ts +++ b/src/readers/geotiff/image.ts @@ -4,15 +4,10 @@ import { getDecoder } from './decoder'; import { buildSamples, convertColorSpace } from './color'; import { needsNormalization, normalizeArray, sampleSum, toArrayType } from './imageUtil'; -import type { Reader } from '..'; -import type { Transformer } from '../../proj4'; import type { ArrayTypes, Decoder, GridReader, ImageFileDirectory } from '.'; -import type { - Properties, - VectorMultiPoint, - VectorMultiPointGeometry, - VectorPoint, -} from '../../geometry'; +import type { ProjectionTransformDefinition, Transformer } from '../../proj4'; +import type { RGBA, Reader } from '..'; +import type { VectorMultiPoint, VectorMultiPointGeometry, VectorPoint } from '../../geometry'; /** Metadata for a GeoTIFF image */ export interface GeoTIFFMetadata { @@ -29,14 +24,6 @@ export interface VectorMultiPointResult { alpha: boolean; } -/** An RGBA color */ -export interface RGBA extends Properties { - r: number; - g: number; - b: number; - a: number; -} - /** Raster data */ export interface Raster { width: number; @@ -68,12 +55,16 @@ export class GeoTIFFImage { * @param imageDirectory - the image directory * @param littleEndian - true if little endian false if big endian * @param gridStore - the grid readers to utilize if needed + * @param definitions - an array of projection definitions for the transformer if needed + * @param epsgCodes - a record of EPSG codes to use for the transformer if needed */ constructor( reader: Reader, imageDirectory: ImageFileDirectory, littleEndian: boolean, gridStore: GridReader[], + definitions: ProjectionTransformDefinition[] = [], + epsgCodes: Record = {}, ) { this.#reader = reader; this.#imageDirectory = imageDirectory; @@ -81,7 +72,12 @@ export class GeoTIFFImage { if (imageDirectory.StripOffsets === undefined) this.#isTiled = true; if (imageDirectory.PlanarConfiguration !== undefined) this.#planarConfiguration = imageDirectory.PlanarConfiguration; - this.#transformer = buildTransform(this.#imageDirectory.geoKeyDirectory, gridStore); + this.#transformer = buildTransform( + this.#imageDirectory.geoKeyDirectory, + gridStore, + definitions, + epsgCodes, + ); } /** @@ -358,7 +354,7 @@ export class GeoTIFFImage { const maxYTile = Math.ceil(height / tileHeight); for (let yTile = 0; yTile < maxYTile; ++yTile) { for (let xTile = 0; xTile < maxXTile; ++xTile) { - let data: ArrayBuffer | undefined; + let data: ArrayBufferLike | undefined; if (this.#planarConfiguration === 1) { data = await this.getTileOrStrip(xTile, yTile, 0, decodeFn); } @@ -527,7 +523,7 @@ export class GeoTIFFImage { y: number, sample: number, decodeFn: Decoder, - ): Promise { + ): Promise { const { TileOffsets, TileByteCounts, StripOffsets, StripByteCounts } = this.#imageDirectory; const numTilesPerRow = Math.ceil(this.width / this.tileWidth); const numTilesPerCol = Math.ceil(this.height / this.tileHeight); @@ -566,7 +562,7 @@ export class GeoTIFFImage { * @param data - the raw data * @returns - the data with the predictor applied */ - maybeApplyPredictor(data: ArrayBuffer): ArrayBuffer { + maybeApplyPredictor(data: ArrayBufferLike): ArrayBufferLike { const predictor = this.#imageDirectory.Predictor ?? 1; if (predictor === 1) { return data; diff --git a/src/readers/geotiff/imageUtil.ts b/src/readers/geotiff/imageUtil.ts index ed8f167d..7a3f4e01 100644 --- a/src/readers/geotiff/imageUtil.ts +++ b/src/readers/geotiff/imageUtil.ts @@ -1,14 +1,14 @@ /** Types of outputs */ export type ArrayTypes = - | Uint8ClampedArray - | Uint8Array - | Uint16Array - | Uint32Array - | Int8Array - | Int16Array - | Int32Array - | Float32Array - | Float64Array; + | Uint8ClampedArray + | Uint8Array + | Uint16Array + | Uint32Array + | Int8Array + | Int16Array + | Int32Array + | Float32Array + | Float64Array; /** Types of output constructors */ export type ArrayTypesConstructors = | Uint8ClampedArrayConstructor @@ -130,14 +130,14 @@ export function needsNormalization(format: number, bitsPerSample: number): boole * @returns - the normalized array */ export function normalizeArray( - inBuffer: ArrayBuffer, + inBuffer: ArrayBufferLike, format: number, planarConfiguration: number, samplesPerPixel: number, bitsPerSample: number, tileWidth: number, tileHeight: number, -): ArrayBuffer { +): ArrayBufferLike { // const inByteArray = new Uint8Array(inBuffer); const view = new DataView(inBuffer); const outSize = diff --git a/src/readers/geotiff/index.ts b/src/readers/geotiff/index.ts index 86d7fc51..4a3a5355 100644 --- a/src/readers/geotiff/index.ts +++ b/src/readers/geotiff/index.ts @@ -3,8 +3,9 @@ import { GeoTIFFHeaderReader } from './header'; import { GeoTIFFImage } from './image'; import { toReader } from '..'; -import type { FeatureIterator, Reader, ReaderInputs } from '..'; -import type { GeoTIFFMetadata, RGBA } from './image'; +import type { GeoTIFFMetadata } from './image'; +import type { ProjectionTransformDefinition } from '../../proj4'; +import type { FeatureIterator, RGBA, Reader, ReaderInputs } from '..'; import type { Properties, VectorFeature, VectorMultiPointGeometry } from '../../geometry'; export * from './color'; @@ -22,12 +23,33 @@ export interface GridReader { } /** - * GeoTIFF Reader + * # GeoTIFF Reader + * + * ## Description + * This class reads a GeoTIFF file and returns a list of GeoTIFF images. + * Implements the {@link FeatureIterator} interface. + * + * ## Usage + * ```ts + * import { ALL_DEFINITIONS, EPSG_CODES, GeoTIFFReader } from 's2-tools'; + * import { FileReader } from 's2-tools/file'; + * + * const fileReader = new FileReader(`${__dirname}/fixtures/utm.tif`); + * const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); + * ``` */ export class GeoTIFFReader extends GeoTIFFHeaderReader implements FeatureIterator { gridStore: GridReader[] = []; - /** @param input - the geotiff input to parse data from */ - constructor(input: ReaderInputs) { + /** + * @param input - the geotiff input to parse data from + * @param definitions - an array of projection definitions for the transformer if needed + * @param epsgCodes - a record of EPSG codes to use for the transformer if needed + */ + constructor( + input: ReaderInputs, + private definitions: ProjectionTransformDefinition[] = [], + private epsgCodes: Record = {}, + ) { const reader = toReader(input); super(reader); } @@ -54,6 +76,8 @@ export class GeoTIFFReader extends GeoTIFFHeaderReader implements FeatureIterato this.imageDirectories[index], this.littleEndian, this.gridStore, + this.definitions, + this.epsgCodes, ); } diff --git a/src/readers/geotiff/predictor.ts b/src/readers/geotiff/predictor.ts index 74653df3..c1cf1666 100644 --- a/src/readers/geotiff/predictor.ts +++ b/src/readers/geotiff/predictor.ts @@ -58,13 +58,13 @@ function decodeRowFloatingPoint( * @returns - the modified block */ export function applyPredictor( - block: ArrayBuffer, + block: ArrayBufferLike, predictor: number, width: number, height: number, bitsPerSample: number[], planarConfiguration: number, -): ArrayBuffer { +): ArrayBufferLike { if (predictor === 0 || predictor === 1) { return block; } diff --git a/src/readers/geotiff/proj.ts b/src/readers/geotiff/proj.ts index 22cc8c2f..93723837 100644 --- a/src/readers/geotiff/proj.ts +++ b/src/readers/geotiff/proj.ts @@ -7,28 +7,30 @@ import { Transformer, US_FT_TO_M, US_MOD_FT_TO_M, - injectAllDefinitions, - injectAllEPSGCodes, } from '../../proj4'; import type { DatumParams } from '..'; -import type { ProjectionParams } from '../../proj4'; import type { GeoKeyDirectory, GridReader } from '.'; +import type { ProjectionParams, ProjectionTransformDefinition } from '../../proj4'; /** * Builds the projection transformer for a GeoTIFF image * @param geoKeys - the geo-keys pulled from the image metadata * @param gridStore - the grid readers + * @param definitions - an array of projection definitions for the transformer if needed + * @param epsgCodes - a record of EPSG codes to use for the transformer if needed * @returns - the projection transformer */ export function buildTransform( geoKeys?: GeoKeyDirectory, gridStore: GridReader[] = [], + definitions: ProjectionTransformDefinition[] = [], + epsgCodes: Record = {}, ): Transformer { const params = buildParams(geoKeys); const transformer = new Transformer(); - injectAllDefinitions(transformer); - injectAllEPSGCodes(transformer); + for (const proj of definitions) transformer.insertDefinition(proj); + for (const [key, value] of Object.entries(epsgCodes)) transformer.insertEPSGCode(key, value); for (const { key, reader } of gridStore) transformer.addGridFromReader(key, reader); if (geoKeys === undefined) return transformer; if (params !== undefined) transformer.setSource(params); diff --git a/src/readers/grib2/index.ts b/src/readers/grib2/index.ts index fb1e4cfd..cf02e7a8 100644 --- a/src/readers/grib2/index.ts +++ b/src/readers/grib2/index.ts @@ -35,10 +35,10 @@ export type Grib2GFSProduct = | 'sfluxgrb' | 'goesimpgrb2.0p25'; -// // TODO: Support GFS Wave -// // model: 'atmos' | 'wave', - /** + * Fetch GFS data. + * You can find some data to reference what's available [here](https://nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/). + * An example of what variable data means can be found [here](https://www.nco.ncep.noaa.gov/pmb/products/gfs/gfs.t00z.pgrb2.0p50.f000.shtml). * @param source - The source of the data, `aws` | `ftpprd` | `nomads` | `google` | `azure` | or a user provided url * @param product - which product to fetch * @param year - The year to fetch given a 4 digit year @@ -73,6 +73,7 @@ export async function fetchGFSAtmos( } /** + * Get the link to download GFS data * @param source - The source of the data, `aws` | `ftpprd` | `nomads` | `google` | `azure` | or a user provided url * @param product - which product to fetch * @param year - The year to fetch given a 4 digit year @@ -168,10 +169,32 @@ export function parseIDX(data: string, filters: string[], offsetPosition = 1): S } /** - * Reader for GRIB2 - * @param data Buffer containing entire GRIB file contents - * @param reader - * @returns Parsed GRIB file object + * # GRIB2 Reader + * + * ## Description + * + * This class reads a GRIB2 file and returns a list of GRIB2 products. + * Implements the {@link FeatureIterator} interface. + * + * ## Usage + * + * ### The recommended way to parse grib files is to filter out what you want: + * ```ts + * // pull .idx file FIRST and filter the ones you want + * const filters = [':DZDT:0.01 mb:', ':TMP:0.4 mb:', ':ABSV:0.4 mb:anl:']; + * const idxs = await parsedIDXFromURL(`${link}.idx`, filters); + * // now bulid the reader + * const gribReader = await GRIB2Reader.fromIDX(link, idxs); + * + * for await (const feature of gribReader) { + * console.log(feature); + * } + * ``` + * + * ### Parsing the entire grib file: + * ``` + * const gribReader = new GRIB2Reader(link); + * ``` */ export class GRIB2Reader implements FeatureIterator { packets: Grib2Sections[] = []; diff --git a/src/readers/gtfs/realtime/index.ts b/src/readers/gtfs/realtime/index.ts index cb2ee06f..40455c28 100644 --- a/src/readers/gtfs/realtime/index.ts +++ b/src/readers/gtfs/realtime/index.ts @@ -13,7 +13,9 @@ export * from './util'; export * from './vehiclePosition'; /** - * A GTFS Realtime message. + * # GTFS Realtime message. + * + * ## Description * The input is a Uint8Array that has encoded protobuffer messages. * @see {@link Protobuf}. * @@ -27,14 +29,16 @@ export * from './vehiclePosition'; * https://github.com/google/transit/tree/master/gtfs-realtime for field * semantic cardinality. * - * Example: + * ## Usage * * ```ts - * import { GTFSRealtime } from 's2-tools'; + * import { GTFSRealtimeReader } from 's2-tools'; * - * const vectorTile = new GTFSRealtime(data); - * const { landuse } = vectorTile.layers; - * const firstFeature = landuse.features(0); + * const gtfsRealtimeReader = new GTFSRealtimeReader(data); + * const { header, entities } = gtfsRealtimeReader; + * for (const entity of entities) { + * console.log(entity); + * } * ``` */ export class GTFSRealtimeReader { @@ -44,7 +48,7 @@ export class GTFSRealtimeReader { * @param data - the input data to parse * @param end - the size of the data, leave blank to parse the entire data */ - constructor(data: Uint8Array, end = 0) { + constructor(data: Uint8Array, end = 0) { const pbf = new Protobuf(data); pbf.readFields(this.#readMessage, this, end); } diff --git a/src/readers/gtfs/schedule/index.ts b/src/readers/gtfs/schedule/index.ts index 4227b596..44e16940 100644 --- a/src/readers/gtfs/schedule/index.ts +++ b/src/readers/gtfs/schedule/index.ts @@ -94,7 +94,18 @@ export interface GTFSLocationsProperties extends Properties { } /** + * # GTFS Schedule Reader + * + * ## Description * Schedule class that pulls in all of the GTFS schedule files and parses them into a single object + * implements the {@link FeatureIterator} interface. + * + * ## Usage + * ```ts + * import { buildGTFSSchedule } from 's2-tools'; + * + * const schedule = await buildGTFSSchedule(gzipData); + * ``` */ export class GTFSScheduleReader implements FeatureIterator { agencies!: Record; @@ -178,6 +189,7 @@ export class GTFSScheduleReader implements FeatureIterator { /** * TODO: Add proeprties from other files like "color" + * TODO: All features should be parsed as VectorGeometry * Yields all of the shapes * @yields an iterator that contains shapes, stops, location data, and routes */ @@ -215,10 +227,11 @@ export class GTFSScheduleReader implements FeatureIterator { } /** + * Builds a GTFSScheduleReader from a gzip folder * @param gzipData - the gzip folder to parse * @returns - a Schedule class */ -export async function buildGTFSSchedule(gzipData: ArrayBuffer): Promise { +export async function buildGTFSSchedule(gzipData: ArrayBufferLike): Promise { const pieces: Piece[] = []; for (const item of iterItems(new Uint8Array(gzipData))) { diff --git a/src/readers/image/decoder.ts b/src/readers/image/decoder.ts new file mode 100644 index 00000000..74a952b6 --- /dev/null +++ b/src/readers/image/decoder.ts @@ -0,0 +1,49 @@ +/** Image Decoder Options */ +export interface DecodeOptions { + x?: number; + y?: number; + width?: number; + height?: number; + modulo?: number; +} + +/** + * Image decoder + * @param buffer - the input buffer + * @param options - user defined options + * @returns - the decoded buffer + */ +export async function imageDecoder( + buffer: ArrayBufferLike | Uint8Array | Buffer, + options?: DecodeOptions, +): Promise { + const blob = new Blob([buffer as ArrayBuffer]); // e.g. { type: 'image/png' } + const imageBitmap = await createImageBitmap(blob); + let { x = 0, y = 0, width = imageBitmap.width, height = imageBitmap.height } = options ?? {}; + const { modulo = 1 } = options ?? {}; + // If modulo exists, shift x and y by modulo's diff + const diff = imageBitmap.width % modulo; + if (diff !== 0) { + x = y = Math.min(diff / 2); + width = height = imageBitmap.width - diff; + } + // Create OffscreenCanvas and draw + const canvas = new OffscreenCanvas(imageBitmap.width, imageBitmap.height); + const ctx = canvas.getContext('2d'); + if (ctx === null) throw new Error('Could not get 2d context'); + ctx.drawImage(imageBitmap, 0, 0); + + return ctx.getImageData(x, y, width, height); +} + +/** + * Image decoder + * @param buffer - the input buffer + * @returns - the decoded buffer + */ +export async function imageDecoderBuffer( + buffer: ArrayBufferLike | Uint8Array | Buffer, +): Promise { + const imageData = await imageDecoder(buffer); + return imageData.data.buffer; +} diff --git a/src/readers/image/index.ts b/src/readers/image/index.ts index ef7b0ef6..4fa230d1 100644 --- a/src/readers/image/index.ts +++ b/src/readers/image/index.ts @@ -1,4 +1,15 @@ -export * from './jpeg2000'; +import type { Properties } from '../..'; + +export * from './decoder'; export * from './jpeg'; +export * from './jpeg2000'; export * from './lanczos'; export * from './util'; + +/** An RGBA color */ +export interface RGBA extends Properties { + r: number; + g: number; + b: number; + a: number; +} diff --git a/src/readers/image/jpeg.ts b/src/readers/image/jpeg.ts index 8843c35a..da5ae3c0 100644 --- a/src/readers/image/jpeg.ts +++ b/src/readers/image/jpeg.ts @@ -47,7 +47,7 @@ export interface JPEGComponent { quantizationIdx: number; blocksPerLine: number; blocksPerColumn: number; - blocks: Int32Array[][]; + blocks: Int32Array[][]; huffmanTableDC: HuffmanNode[]; huffmanTableAC: HuffmanNode[]; quantizationTable: Int32Array; @@ -98,7 +98,7 @@ export interface JFIF { /** The result of an individual parse */ export interface ParseResult { - data: Uint8Array; + data: Uint8Array; outComponents: OutComponent[]; ready: boolean; } @@ -107,8 +107,8 @@ export interface ParseResult { export interface Image { width: number; height: number; - exifBuffer: Uint8Array | null; - data: Uint8Array; + exifBuffer: Uint8Array | null; + data: Uint8Array; comments?: string[]; } @@ -119,8 +119,8 @@ export interface Image { * @param jpegTables - The JPEG tables (if provided) * @returns - The decoded image */ -export function decode( - jpegData: ArrayBuffer, +export function decodeJpegData( + jpegData: ArrayBufferLike, userOpts?: JPEGOptions, jpegTables?: number[], ): Image { @@ -143,8 +143,8 @@ export function decode( * @param jpegTables - The JPEG tables (if provided) * @returns - The decoded image as a buffer */ -export function jpegDecoder(buffer: ArrayBuffer, jpegTables?: number[]): ArrayBuffer { - const { data } = decode(buffer, { skipMutation: true }, jpegTables); +export function jpegDecoder(buffer: ArrayBufferLike, jpegTables?: number[]): ArrayBufferLike { + const { data } = decodeJpegData(buffer, { skipMutation: true }, jpegTables); return data.buffer; } @@ -169,7 +169,7 @@ export class JpegStreamReader { comments: string[] = []; adobe: Adobe | null = null; jfif: JFIF | null = null; - exifBuffer: Uint8Array | null = null; + exifBuffer: Uint8Array | null = null; frames: Frame[] = []; dctZigZag = new Int32Array([ 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, @@ -227,7 +227,7 @@ export class JpegStreamReader { * Parse the data into the frames * @param data - The individual block of JPEG data to parse */ - parse(data: Uint8Array): void { + parse(data: Uint8Array): void { const maxResolutionInPixels = this.maxResolutionInMP * 1000 * 1000; let offset = 0; /** @@ -241,7 +241,7 @@ export class JpegStreamReader { /** * @returns - The next block as a Uint8Array */ - function readDataBlock(): Uint8Array { + function readDataBlock(): Uint8Array { const length = readUint16(); const array = data.subarray(offset, offset + length - 2); offset += array.length; @@ -866,10 +866,7 @@ interface Code { * @param values - array of values * @returns - the Huffman table */ -function buildHuffmanTable( - codeLengths: Uint8Array, - values: Uint8Array, -): HuffmanNode[] { +function buildHuffmanTable(codeLengths: Uint8Array, values: Uint8Array): HuffmanNode[] { let k = 0; const code: Code[] = []; let length = 16; @@ -923,7 +920,7 @@ function buildHuffmanTable( * @returns - the decoded scan size */ function decodeScan( - data: Uint8Array, + data: Uint8Array, offset: number, frame: Frame, components: JPEGComponent[], @@ -1260,10 +1257,7 @@ function decodeScan( * @param reader - the jpeg stream reader * @returns - the component data */ -function buildComponentData( - component: JPEGComponent, - reader: JpegStreamReader, -): Uint8Array[] { +function buildComponentData(component: JPEGComponent, reader: JpegStreamReader): Uint8Array[] { const lines = []; const blocksPerLine = component.blocksPerLine; const blocksPerColumn = component.blocksPerColumn; @@ -1282,11 +1276,7 @@ function buildComponentData( * @param dataOut - the 8x8 block * @param dataIn - the 8x8 block */ - function quantizeAndInverse( - zz: Int32Array, - dataOut: Uint8Array, - dataIn: Int32Array, - ): void { + function quantizeAndInverse(zz: Int32Array, dataOut: Uint8Array, dataIn: Int32Array): void { const qt = component.quantizationTable; let v0, v1, v2, v3, v4, v5, v6, v7, t; const p = dataIn; diff --git a/src/readers/image/jpeg2000/index.ts b/src/readers/image/jpeg2000.ts similarity index 99% rename from src/readers/image/jpeg2000/index.ts rename to src/readers/image/jpeg2000.ts index fa5d054e..46325a0d 100644 --- a/src/readers/image/jpeg2000/index.ts +++ b/src/readers/image/jpeg2000.ts @@ -1,5 +1,5 @@ // https://github.com/runk/jpeg2000/tree/main -import type { Reader } from '../..'; +import type { Reader } from '..'; /** Image and tile size */ interface SIZ { @@ -20,7 +20,7 @@ interface ComponentTile { top: number; width: number; height: number; - items: Uint8ClampedArray; + items: Uint8ClampedArray; } /** Size and resolution container */ @@ -146,7 +146,7 @@ interface Tile { interface Level { width: number; height: number; - items: number[] | Uint8Array | Float32Array; + items: number[] | Uint8Array | Float32Array; index?: number; } @@ -259,7 +259,7 @@ interface TileTransform { top: number; width: number; height: number; - items: number[] | Uint8Array | Float32Array; + items: number[] | Uint8Array | Float32Array; } /** Subpacket Quantization default container */ @@ -398,7 +398,7 @@ function defaultPrecinctParameters(): PrecinctParameters { } /** - * Jpeg2000 image + * Jpeg2000 image decoder * @returns - the Jpeg2000 image */ export class JpxImage { @@ -2324,12 +2324,12 @@ const RUNLENGTH_CONTEXT = 18; * Section D. Coefficient bit modeling */ class BitModel { - neighborsSignificance: Uint8Array; - coefficentsSign: Uint8Array; - contextLabelTable: Uint8Array; - coefficentsMagnitude: Uint8Array | Uint16Array | Uint32Array; - processingFlags: Uint8Array; - bitsDecoded: Uint8Array; + neighborsSignificance: Uint8Array; + coefficentsSign: Uint8Array; + contextLabelTable: Uint8Array; + coefficentsMagnitude: Uint8Array | Uint16Array | Uint32Array; + processingFlags: Uint8Array; + bitsDecoded: Uint8Array; contexts = new Int8Array(0); decoder!: ArithmeticDecoder; diff --git a/src/readers/image/util.ts b/src/readers/image/util.ts index 55596154..0a3aba75 100644 --- a/src/readers/image/util.ts +++ b/src/readers/image/util.ts @@ -188,8 +188,8 @@ export function copyImage( export function createImage( width: number, height: number, - data?: Uint8ClampedArray, - fill: number[] | Uint8ClampedArray = [0, 0, 0, 0], + data?: Uint8ClampedArray, + fill: number[] | Uint8ClampedArray = [0, 0, 0, 0], channels = 4, ): ImageData { width = Math.floor(width); diff --git a/src/readers/index.ts b/src/readers/index.ts index 707ec919..220adc65 100644 --- a/src/readers/index.ts +++ b/src/readers/index.ts @@ -16,6 +16,7 @@ export * from './wkt'; export * from './xml'; export * from './fetch'; export * from './nadgrid'; +export * from './tile'; /** Reader interface. Implemented to read data from either a buffer or a filesystem */ export interface Reader { @@ -34,10 +35,10 @@ export interface Reader { getUint32: (byteOffset: number, littleEndian?: boolean) => number; getUint8: (byteOffset: number) => number; // Methods - slice: (begin?: number, end?: number) => DataView; + slice: (begin?: number, end?: number) => DataView; setStringEncoding: (encoding: string) => void; parseString: (byteOffset: number, byteLength: number) => string; - getRange: (offset: number, length: number) => Promise>; + getRange: (offset: number, length: number) => Promise; } /** Feature iteration interface. Implemented by readers to iterate over features */ @@ -53,30 +54,34 @@ export interface FeatureIterator< export type ReaderInputs = | Reader | BufferReader - | Buffer - | ArrayBuffer - | Uint8Array - | Uint8ClampedArray - | Uint16Array - | Uint32Array - | Int8Array - | Int16Array - | Int32Array - | DataView; + | Buffer + | ArrayBufferLike + | Uint8Array + | Uint8ClampedArray + | Uint16Array + | Uint32Array + | Int8Array + | Int16Array + | Int32Array + | Float32Array + | Float64Array + | DataView; /** + * Convenience function that ensures the input is a usable reader * @param input - the input data * @returns - a BufferReader */ export function toReader(input: ReaderInputs): Reader { if (input instanceof BufferReader) return input; else if ('buffer' in input) return new BufferReader(input.buffer); - else if (input instanceof ArrayBuffer) return new BufferReader(input); + else if (input instanceof ArrayBuffer || input instanceof SharedArrayBuffer) + return new BufferReader(input); else return input; } /** A buffer reader is an extension of a DataView with some extra methods */ -export class BufferReader extends DataView implements Reader { +export class BufferReader extends DataView implements Reader { textDecoder = new TextDecoder('utf-8'); /** @@ -84,16 +89,17 @@ export class BufferReader extends DataView implements Reader { * @param byteOffset - offset in the buffer * @param byteLength - length of the buffer */ - constructor(buffer: ArrayBuffer, byteOffset?: number, byteLength?: number) { + constructor(buffer: ArrayBufferLike, byteOffset?: number, byteLength?: number) { super(buffer, byteOffset, byteLength); } /** + * Get a slice of the buffer * @param begin - beginning of the slice * @param end - end of the slice. If not provided, the end of the data is used * @returns - a DataView of the slice */ - slice(begin?: number, end?: number): DataView { + slice(begin?: number, end?: number): DataView { return new DataView( this.buffer.slice(this.byteOffset + (begin ?? 0), this.byteOffset + (end ?? this.byteLength)), ); @@ -108,6 +114,7 @@ export class BufferReader extends DataView implements Reader { } /** + * Reads a string from the buffer * @param byteOffset - Start of the string * @param byteLength - Length of the string * @returns - The string @@ -115,16 +122,17 @@ export class BufferReader extends DataView implements Reader { parseString(byteOffset: number, byteLength: number): string { const { textDecoder } = this; const data = this.slice(byteOffset, byteOffset + byteLength).buffer; - const out = textDecoder.decode(data, { stream: true }) + textDecoder.decode(); + const out = textDecoder.decode(data as ArrayBuffer, { stream: true }) + textDecoder.decode(); return out.replace(/\0/g, '').trim(); } /** + * Reads a range from the buffer * @param offset - the offset of the range * @param length - the length of the range * @returns - the ranged buffer */ - async getRange(offset: number, length: number): Promise> { + async getRange(offset: number, length: number): Promise { return await new Uint8Array(this.buffer).slice(offset, offset + length); } } diff --git a/src/readers/json/index.ts b/src/readers/json/index.ts index dbcb765a..635f0b20 100644 --- a/src/readers/json/index.ts +++ b/src/readers/json/index.ts @@ -3,7 +3,27 @@ import { toReader } from '..'; import type { FeatureIterator, Reader, ReaderInputs } from '..'; import type { Features, JSONCollection, MValue, Properties } from '../../geometry'; -/** Standard Buffer Reader for (Geo|S2)JSON */ +/** + * # JSON Buffer Reader + * + * ## Description + * Standard Buffer Reader for (Geo|S2)JSON + * implements the {@link FeatureIterator} interface + * + * ## Usage + * ```ts + * import { BufferJSONReader } from 's2-tools'; + * + * const reader = new BufferJSONReader('{ type: 'FeatureCollection', features: [...] }'); + * // OR + * const reader = new BufferJSONReader({ type: 'FeatureCollection', features: [...] }); + * + * // read the features + * for await (const feature of reader) { + * console.log(feature); + * } + * ``` + */ export class BufferJSONReader< M = Record, D extends MValue = MValue, @@ -29,9 +49,7 @@ export class BufferJSONReader< const { type } = this.data; if (type === 'FeatureCollection') { - for (const feature of this.data.features) { - yield feature; - } + for (const feature of this.data.features) yield feature; } else if (type === 'Feature') { yield this.data; } else if (type === 'VectorFeature') { @@ -46,7 +64,25 @@ export class BufferJSONReader< } } -/** Parse (Geo|S2)JSON from a file that is in a newline-delimited format */ +/** + * # NewLine Delimited JSON Reader + * + * ## Description + * Parse (Geo|S2)JSON from a file that is in a newline-delimited format + * Implements the {@link FeatureIterator} interface + * + * ## Usage + * ```ts + * import { NewLineDelimitedJSONReader } from 's2-tools'; + * import { FileReader } from 's2-tools/file'; + * + * const reader = new NewLineDelimitedJSONReader(new FileReader('./data.geojsonld')); + * // read the features + * for await (const feature of reader) { + * console.log(feature); + * } + * ``` + */ export class NewLineDelimitedJSONReader< M = Record, D extends MValue = MValue, @@ -94,7 +130,25 @@ const RIGHT_BRACE = 0x7d; const BACKSLASH = 0x5c; const STRING = 0x22; -/** A File Reader is designed to read millions of JSON objects if necessary. */ +/** + * # JSON Reader + * + * ## Description + * Parse (Geo|S2)JSON. Can handle millions of features. + * Implements the {@link FeatureIterator} interface + * + * ## Usage + * ```ts + * import { JSONReader } from 's2-tools'; + * import { FileReader } from 's2-tools/file'; + * + * const reader = new JSONReader(new FileReader('./data.geojsonld')); + * // read the features + * for await (const feature of reader) { + * console.log(feature); + * } + * ``` + */ export class JSONReader< M = Record, D extends MValue = MValue, @@ -130,16 +184,16 @@ export class JSONReader< async *[Symbol.asyncIterator](): AsyncGenerator> { if (this.#length <= this.#chunkSize) { const reader = new BufferJSONReader(this.reader.parseString(0, this.#length)); - for await (const feature of reader) yield feature; + yield* reader; return; } // buffer the first chunk this.#buffer = new Uint8Array(this.reader.slice(0, this.#chunkSize).buffer); // find out starting position - const set = this.setStartPosition(); + const set = this.#setStartPosition(); if (!set) throw Error('File is not geojson or s2json'); while (true) { - const feature = this.nextValue(); + const feature = this.#nextValue(); if (feature !== undefined) yield feature; else break; } @@ -151,7 +205,7 @@ export class JSONReader< * This is a modified Knuth–Morris–Pratt algorithm * @returns - true if the start position was found */ - setStartPosition(): boolean { + #setStartPosition(): boolean { const features = Buffer.from('"features":'); const featuresSize = features.length; @@ -180,7 +234,7 @@ export class JSONReader< this.#buffer = new Uint8Array( this.reader.slice(this.#offset, this.#offset + this.#chunkSize).buffer, ); - return this.setStartPosition(); + return this.#setStartPosition(); } else { return false; } @@ -193,7 +247,7 @@ export class JSONReader< * out of the buffer, but we still have file left to read, just read into the buffer and continue on * @returns - the feature or nothing if we hit the end of the file */ - nextValue(): undefined | Features { + #nextValue(): undefined | Features { // get started while (this.#pos < this.#chunkSize) { if (this.#buffer[this.#pos] === BACKSLASH) { @@ -257,7 +311,7 @@ export class JSONReader< this.#buffer = new Uint8Array( this.reader.slice(this.#offset, this.#offset + this.#chunkSize).buffer, ); - return this.nextValue(); + return this.#nextValue(); } else { return; } // end of file diff --git a/src/readers/mmap.ts b/src/readers/mmap.ts index 52d2af8c..1c0c8fb4 100644 --- a/src/readers/mmap.ts +++ b/src/readers/mmap.ts @@ -2,7 +2,19 @@ import { mmap } from 'bun'; import type { Reader } from '.'; -/** Reads data from a file */ +/** + * # MMap Reader + * + * ## Description + * Reads data from a file implementing the {@link Reader} interface + * + * ## Usage + * ```ts + * import { MMapReader } from 's2-tools/mmap'; + * + * const reader = new MMapReader('./BETA2007.gsb'); + * ``` + */ export class MMapReader implements Reader { #buffer: Uint8Array; byteOffset: number = 0; @@ -132,7 +144,7 @@ export class MMapReader implements Reader { * @param end - End of the slice. If not provided, the end of the data is used * @returns - The data as a DataView */ - slice(begin?: number, end?: number): DataView { + slice(begin?: number, end?: number): DataView { if (begin === undefined) begin = 0; if (end === undefined) end = this.byteLength; if (begin < 0 || end > this.byteLength || begin >= end) { @@ -153,6 +165,7 @@ export class MMapReader implements Reader { } /** + * Reads a string from the buffer * @param byteOffset - Start of the string * @param byteLength - Length of the string * @returns - The string @@ -160,16 +173,17 @@ export class MMapReader implements Reader { parseString(byteOffset: number, byteLength: number): string { const { textDecoder } = this; const data = this.slice(byteOffset, byteOffset + byteLength).buffer; - const out = textDecoder.decode(data, { stream: true }) + textDecoder.decode(); + const out = textDecoder.decode(data as ArrayBuffer, { stream: true }) + textDecoder.decode(); return out.replace(/\0/g, '').trim(); } /** + * Reads a range from the buffer * @param offset - the offset of the range * @param length - the length of the range * @returns - the ranged buffer */ - async getRange(offset: number, length: number): Promise> { + async getRange(offset: number, length: number): Promise { return await this.#buffer.slice(offset, offset + length); } } diff --git a/src/readers/nadgrid.ts b/src/readers/nadgrid.ts index 2c2427cd..30ab1001 100644 --- a/src/readers/nadgrid.ts +++ b/src/readers/nadgrid.ts @@ -3,12 +3,6 @@ import { toReader } from '.'; import type { FeatureCollection, VectorFeature, VectorMultiPoint, VectorPoint } from '../geometry'; import type { FeatureIterator, Reader, ReaderInputs } from '.'; -/** - * Resources for details of NTv2 file formats: - * - https://web.archive.org/web/20140127204822if_/http://www.mgs.gov.on.ca:80/stdprodconsume/groups/content/@mgs/@iandit/documents/resourcelist/stel02_047447.pdf - * - http://mimaka.com/help/gs/html/004_NTV2%20Data%20Format.htm - */ - /** Seconds to degrees (S / 3_600) */ const SEC2DEG = 0.00000484813681109536; @@ -22,14 +16,31 @@ export interface NadSubGrid { } /** A grid wrapper around a parsed .gsb file */ -export interface GridDefinition { +export interface NadGridDefinition { name: string; mandatory: boolean; grid?: NadGridReader; isNull: boolean; } -/** Store Grids from a NTv2 file (.gsb) */ +/** + * # NAD Grid V2 Reader + * + * ## Description + * Store Grids from a NTv2 file (.gsb) + * + * ## Usage + * ```ts + * import { NadGridReader } from 's2-tools'; + * import { MMapReader } from 's2-tools/mmap'; + * + * const store = new NadGridStore(); + * + * store.addGridFromReader('BETA2007.gsb', new MMapReader(`${__dirname}/fixtures/BETA2007.gsb`)); + * + * const grid = store.getGrid('BETA2007.gsb'); + * ``` + */ export class NadGridStore { grids = new Map(); @@ -65,8 +76,8 @@ export class NadGridStore { * @param keys - complex string of grid keys to test against * @returns - an array of grid definitions */ - getGridsFromString(keys?: string): GridDefinition[] { - const res: GridDefinition[] = []; + getGridsFromString(keys?: string): NadGridDefinition[] { + const res: NadGridDefinition[] = []; if (keys === undefined) return res; for (const grid of keys.split(',')) { const g = this.getGridFromString(grid); @@ -80,7 +91,7 @@ export class NadGridStore { * @param name - a single grid name to test against * @returns - a grid definition */ - getGridFromString(name: string): undefined | GridDefinition { + getGridFromString(name: string): undefined | NadGridDefinition { if (name.length === 0) return undefined; const optional = name[0] === '@'; if (optional) name = name.slice(1); @@ -137,7 +148,32 @@ export interface NadGridMetadata { count: number; } -/** Load a binary NTv2 file (.gsb) */ +/** + * # NAD Grid Reader + * + * ## Description + * Loads/reads a binary NTv2 file (.gsb) implementing the {@link FeatureIterator} interface + * + * It should be noted that a proj4 Transformer usually uses this class internally. But if you want + * to manually parse a .gsb file, you can use this class directly. + * + * ## Usage + * + * ```ts + * import { NadGridReader } from 's2-tools' + * // mmap is a Bun exclusive feature, consider using `s2-tools/file`'s `FileReader` instead. + * import { MMapReader } from 's2-tools/mmap'; + * + * const reader = new NadGridReader('BETA2007.gsb', new MMapReader('./BETA2007.gsb')); + * + * // access all the vector features + * const data = await Array.fromAsync(reader); + * ``` + * + * ## Links + * - https://web.archive.org/web/20140127204822if_/http://www.mgs.gov.on.ca:80/stdprodconsume/groups/content/@mgs/@iandit/documents/resourcelist/stel02_047447.pdf + * - http://mimaka.com/help/gs/html/004_NTV2%20Data%20Format.htm + */ export class NadGridReader implements FeatureIterator { reader: Reader; #isLittleEndian = false; diff --git a/src/readers/netcdf/index.ts b/src/readers/netcdf/index.ts index 2f83042d..a435e123 100644 --- a/src/readers/netcdf/index.ts +++ b/src/readers/netcdf/index.ts @@ -102,9 +102,23 @@ export interface NetCDFReaderOptions { } /** - * Reads a NetCDF v3.x file + * # NetCDF v3.x Reader + * + * ## Description + * Read the NetCDF v3.x file format * [See specification](https://www.unidata.ucar.edu/software/netcdf/docs/file_format_specifications.html) - * @param data - ArrayBuffer or any Typed Array (including Node.js' Buffer from v4) with the data + * Implements the {@link FeatureIterator} interface + * + * ## Usage + * ```ts + * import { NetCDFReader } from 's2-tools'; + * import { FileReader } from 's2-tools/file'; + * + * const reader = new NetCDFReader(new FileReader('./data.nc')); + * for (const feature of reader) { + * console.log(feature); + * } + * ``` */ export class NetCDFReader< M = Record, diff --git a/src/readers/osm/blob.ts b/src/readers/osm/blob.ts index ad8b6f7d..2bdda163 100644 --- a/src/readers/osm/blob.ts +++ b/src/readers/osm/blob.ts @@ -40,7 +40,7 @@ export class BlobHeader { /** A Blob is a data block containing the actual data. */ export class Blob { raw_size = 0; - data: Uint8Array | Promise> = new Uint8Array(0); + data: Uint8Array | Promise = new Uint8Array(0); /** @param pbf - the Protobuf object to read from */ constructor(pbf: Protobuf) { diff --git a/src/readers/osm/index.ts b/src/readers/osm/index.ts index b5fdc155..61e4a922 100644 --- a/src/readers/osm/index.ts +++ b/src/readers/osm/index.ts @@ -25,9 +25,6 @@ export type * from './primitive'; export type * from './relation'; export type * from './way'; -// https://wiki.openstreetmap.org/wiki/PBF_Format#File_format -// https://github.com/openstreetmap/pbf/blob/master/OSM-binary.md - // TODO: Add threads for reading the blocks /** @@ -127,9 +124,31 @@ export interface OsmReaderOptions { } /** - * OSM Reader + * # OSM Reader + * + * ## Description * Parses OSM PBF files - * https://wiki.openstreetmap.org/wiki/PBF_Format + * Implements the {@link FeatureIterator} interface + * + * ## Usage + * ```ts + * import { OSMReader } from 's2-tools'; + * import { FileReader } from 's2-tools/file'; + * + * const reader = new OSMReader(new FileReader('./data.osm.pbf')); + * // pull out the header + * const header = reader.getHeader(); + * // read the features + * for (const feature of reader) { + * console.log(feature); + * } + * // close the reader when done + * reader.close(); + * ``` + * + * ## Links + * - https://wiki.openstreetmap.org/wiki/PBF_Format + * - https://github.com/openstreetmap/pbf/blob/master/OSM-binary.md */ export class OSMReader implements FeatureIterator { reader: Reader; @@ -243,7 +262,7 @@ export class OSMReader implements FeatureIterator { * Read the next blob * @returns - the next blob if it exists */ - #next(): undefined | DataView { + #next(): undefined | DataView { const { reader } = this; // if we've already read all the data, return null if (this.#offset >= reader.byteLength) return; @@ -268,7 +287,7 @@ export class OSMReader implements FeatureIterator { * @param data - the data to parse * @returns - the parsed primitive block */ - async #readBlob(data: DataView): Promise { + async #readBlob(data: DataView): Promise { // Blob data is PBF encoded and ?compressed, so we need to parse & decompress it first let pbf = new Protobuf(new Uint8Array(data.buffer)); const blob = new Blob(pbf); diff --git a/src/readers/pmtiles/pmtiles.ts b/src/readers/pmtiles/pmtiles.ts index 1cb69a6e..b9be8e7e 100644 --- a/src/readers/pmtiles/pmtiles.ts +++ b/src/readers/pmtiles/pmtiles.ts @@ -44,7 +44,7 @@ export type DecompressFunc = (buf: Uint8Array, compression: Compression) => Prom /** * Describe the type of tiles stored in the archive. - * 0 is unknown/other, 1 is "MVT" vector tiles. + * 0 is unknown/other, 1 is a vector tile spec. */ export enum TileType { /** unknown/other. */ @@ -91,6 +91,7 @@ export const HEADER_SIZE_BYTES = 127; export const ROOT_SIZE = 16_384; /** + * Rotate a point by n degrees. * @param n - the rotation size * @param xy - the point * @param rx - the x rotation @@ -109,6 +110,7 @@ function rotate(n: number, xy: Point, rx: number, ry: number): void { } /** + * Get the tile ID on the given level. * @param zoom - the zoom level * @param pos - the tile position * @returns - the tile @@ -253,6 +255,7 @@ export function bytesToHeader(bytes: Uint8Array): Header { } /** + * Deserialize a directory from a Uint8Array. * @param buffer - the buffer to deserialize * @returns - the deserialized entries */ @@ -285,6 +288,7 @@ export function deserializeDir(buffer: Uint8Array): Entry[] { } /** + * Get a 64-bit number from a DataView * @param dv - a DataView * @param offset - the offset in the DataView * @returns - the decoded 64-bit number diff --git a/src/readers/pmtiles/reader.ts b/src/readers/pmtiles/reader.ts index 5efce131..5c223d57 100644 --- a/src/readers/pmtiles/reader.ts +++ b/src/readers/pmtiles/reader.ts @@ -1,5 +1,5 @@ import { Cache as DirCache } from '../../dataStructures/cache'; -import { concatUint8Arrays } from '../../util'; +import { decompressStream } from '../../util'; import { Compression, bytesToHeader, deserializeDir, findTile, zxyToTileID } from './pmtiles'; import { FetchReader, toReader } from '..'; import { S2_HEADER_SIZE_BYTES, S2_ROOT_SIZE, s2BytesToHeader } from './s2pmtiles'; @@ -9,6 +9,12 @@ import type { Face, Metadata } from 's2-tilejson'; import type { Reader, ReaderInputs } from '..'; import type { S2Entries, S2Header } from './s2pmtiles'; +/** A description of where a tile can be found in the archive. Both offset and length are in bytes */ +export interface S2PMTilesTileEntry { + offset: number; + length: number; +} + /** The File reader is to be used by bun/node/deno on the local filesystem. */ export class S2PMTilesReader { #header: Header | S2Header | undefined; @@ -40,6 +46,7 @@ export class S2PMTilesReader { } /** + * Get the metadata for the archive * @returns - the header of the archive along with the root directory, * including information such as tile type, min/max zoom, bounds, and summary statistics. */ @@ -59,7 +66,7 @@ export class S2PMTilesReader { header.jsonMetadataOffset + header.jsonMetadataLength, ); this.#metadata = JSON.parse( - this.#arrayBufferToString(await decompress(jsonMetadata, header.internalCompression)), + this.#decoder.decode(await decompress(jsonMetadata, header.internalCompression)), ); // root directory data @@ -96,18 +103,37 @@ export class S2PMTilesReader { } } - /** @returns - the header of the archive */ + /** + * Get the header of the archive + * @returns - the header of the archive + */ async getHeader(): Promise
{ return await this.#getMetadata(); } - /** @returns - the metadata of the archive */ + /** + * Get the metadata of the archive + * @returns - the metadata of the archive + */ async getMetadata(): Promise { await this.#getMetadata(); // ensure loaded first return this.#metadata; } /** + * Check if an S2 tile exists in the archive + * @param face - the Open S2 projection face + * @param zoom - the zoom level of the tile + * @param x - the x coordinate of the tile + * @param y - the y coordinate of the tile + * @returns - true if the tile exists in the archive + */ + async hasTileS2(face: Face, zoom: number, x: number, y: number): Promise { + return (await this.#getTileEntry(face, zoom, x, y)) !== undefined; + } + + /** + * Get the bytes of the tile at the given (face, zoom, x, y) coordinates * @param face - the Open S2 projection face * @param zoom - the zoom level of the tile * @param x - the x coordinate of the tile @@ -119,6 +145,18 @@ export class S2PMTilesReader { } /** + * Check if a tile exists in the archive + * @param zoom - the zoom level of the tile + * @param x - the x coordinate of the tile + * @param y - the y coordinate of the tile + * @returns - true if the tile exists in the archive + */ + async hasTile(zoom: number, x: number, y: number): Promise { + return (await this.#getTileEntry(-1, zoom, x, y)) !== undefined; + } + + /** + * Get the bytes of the tile at the given (zoom, x, y) coordinates * @param zoom - the zoom level of the tile * @param x - the x coordinate of the tile * @param y - the y coordinate of the tile @@ -129,6 +167,7 @@ export class S2PMTilesReader { } /** + * Get the bytes of the tile at the given (zoom, x, y) coordinates * @param face - the Open S2 projection face * @param zoom - the zoom level of the tile * @param x - the x coordinate of the tile @@ -141,6 +180,28 @@ export class S2PMTilesReader { x: number, y: number, ): Promise { + const { tileCompression } = await this.#getMetadata(); + const entry = await this.#getTileEntry(face, zoom, x, y); + if (entry === undefined) return undefined; + const { offset, length } = entry; + const entryData = await this.#reader.getRange(offset, length); + return await decompress(entryData, tileCompression); + } + + /** + * Find the tile entry relative to the root directory + * @param face - the Open S2 projection face + * @param zoom - the zoom level of the tile + * @param x - the x coordinate of the tile + * @param y - the y coordinate of the tile + * @returns - the position and length of bytes for the tile. Undefined if it does not exist + */ + async #getTileEntry( + face: number, + zoom: number, + x: number, + y: number, + ): Promise { const header = await this.#getMetadata(); const tileID = zxyToTileID(zoom, x, y); const { minZoom, maxZoom, rootDirectoryOffset, rootDirectoryLength, tileDataOffset } = header; @@ -155,11 +216,7 @@ export class S2PMTilesReader { const entry = findTile(directory, tileID); if (entry !== null) { if (entry.runLength > 0) { - const entryData = await this.#reader.getRange( - tileDataOffset + entry.offset, - entry.length, - ); - return await decompress(entryData, header.tileCompression); + return { offset: tileDataOffset + entry.offset, length: entry.length }; } dO = header.leafDirectoryOffset + entry.offset; dL = entry.length; @@ -169,6 +226,7 @@ export class S2PMTilesReader { } /** + * Get the directory at the given offset * @param offset - the offset of the directory * @param length - the length of the directory * @param face - -1 for WM root, 0-5 for S2 @@ -193,17 +251,10 @@ export class S2PMTilesReader { return directory; } - - /** - * @param buffer - the buffer to convert - * @returns - the string result - */ - #arrayBufferToString(buffer: Uint8Array): string { - return this.#decoder.decode(buffer); - } } /** + * Decompress the data * @param data - the data to decompress * @param compression - the compression type * @returns - the decompressed data @@ -211,7 +262,7 @@ export class S2PMTilesReader { async function decompress(data: Uint8Array, compression: Compression): Promise { switch (compression) { case Compression.Gzip: - return await decompressGzip(data); + return await decompressStream(data); case Compression.Brotli: throw new Error('Brotli decompression not implemented'); case Compression.Zstd: @@ -221,19 +272,3 @@ async function decompress(data: Uint8Array, compression: Compression): Promise { - // Convert the bytes to a stream. - const stream = new Blob([compressedBytes]).stream(); - // Create a decompressed stream. - const decompressedStream = stream.pipeThrough(new DecompressionStream('gzip')); - // Read all the bytes from this stream. - const chunks = []; - for await (const chunk of decompressedStream) chunks.push(chunk); - - return await concatUint8Arrays(chunks); -} diff --git a/src/readers/pmtiles/varint.ts b/src/readers/pmtiles/varint.ts index e5431bbf..5febac68 100644 --- a/src/readers/pmtiles/varint.ts +++ b/src/readers/pmtiles/varint.ts @@ -5,6 +5,7 @@ export interface VarintBufPos { } /** + * Decode a 64 bit number * @param low - the low 32 bits of the number * @param high - the high 32 bits of the number * @returns - the decoded number @@ -14,6 +15,7 @@ function toNum(low: number, high: number): number { } /** + * Read a varint * @param bufPos - the buffer with it's position * @returns - the decoded number */ @@ -38,6 +40,7 @@ export function readVarint(bufPos: VarintBufPos): number { } /** + * Read the remainder of a varint * @param low - the low 32 bits of the number * @param bufPos - the buffer with it's position * @returns - the decoded remainder diff --git a/src/readers/protobuf/index.ts b/src/readers/protobuf/index.ts index 4adce1ad..f8bc818a 100644 --- a/src/readers/protobuf/index.ts +++ b/src/readers/protobuf/index.ts @@ -20,25 +20,31 @@ export interface Tag { } /** + * # Protobuffer + * + * ## Description * Create a new PBF instance and either read or write to it. * Follows the early Protobuf spec supporting various types of encoding * including messages (which are usually representative of class objects). * - * Reading: + * ## Usage + * + * ### Reading: * ```ts * const data = fs.readFileSync(path); * const pbf = new Pbf(data); * ``` * - * Writing: + * ### Writing: * ```ts * const pbf = new Pbf(); * pbf.writeVarintField(1, 1); * // ... + * const result = pbf.commit(); * ``` */ export class Pbf { - buf: Uint8Array; + buf: Uint8Array; pos: number; length: number; type: number; @@ -51,7 +57,7 @@ export class Pbf { * @param buf - an optional Uint8Array to use for reading. otherwise defaults to an empty * Uint8Array for writing */ - constructor(buf: Uint8Array = new Uint8Array(0)) { + constructor(buf: Uint8Array = new Uint8Array(0)) { this.buf = buf; this.pos = 0; this.type = 0; @@ -292,7 +298,7 @@ export class Pbf { * The bytes themselves are presumed to be u8s and therefore don't need to be decoded * @returns - the decoded byte array */ - readBytes(): Uint8Array { + readBytes(): Uint8Array { const end = this.readVarint() + this.pos; const buffer = this.buf.subarray(this.pos, end); this.pos = end; @@ -863,6 +869,7 @@ export class Pbf { } /** + * Read a varint from the buffer * @param l - the low 32 bits of the number * @param s - the signedness * @param p - the protobuf @@ -896,6 +903,7 @@ function readVarintRemainder(l: number, s: boolean, p: Pbf): number { } /** + * Read the end of the packed array * @param pbf - the protobuf * @returns - the end of the packed array */ @@ -904,6 +912,7 @@ function readPackedEnd(pbf: Pbf): number { } /** + * Decode a varint * @param low - the low 32 bits of the number * @param high - the high 32 bits of the number * @param isSigned - whether the number is signed @@ -918,6 +927,7 @@ function toNum(low: number, high: number, isSigned: boolean): number { } /** + * Write a varint * @param val - the number * @param pbf - the protobuf */ @@ -948,6 +958,7 @@ function writeBigVarint(val: number, pbf: Pbf): void { } /** + * Write the low 32 bits of a varint * @param low - lower 32 bits * @param _high - unused "high" bits * @param pbf - the Protobuf class @@ -965,6 +976,7 @@ function writeBigVarintLow(low: number, _high: number, pbf: Pbf): void { } /** + * Write the high 32 bits of a varint * @param high - the high 32 bits * @param pbf - the Protobuf class */ @@ -985,6 +997,7 @@ function writeBigVarintHigh(high: number, pbf: Pbf): void { } /** + * Make room for extra length * @param startPos - the start position * @param len - the length to make room for * @param pbf - the Protobuf class @@ -1007,6 +1020,7 @@ function makeRoomForExtraLength(startPos: number, len: number, pbf: Pbf): void { } /** + * Write a packed varint * @param arr - the array of numbers to write * @param pbf - the Protobuf class */ @@ -1014,6 +1028,7 @@ function writePackedVarint(arr: number[], pbf: Pbf): void { for (let i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); } /** + * Write a packed signed varint * @param arr - the array of numbers to write * @param pbf - the Protobuf class */ @@ -1021,6 +1036,7 @@ function writePackedSVarint(arr: number[], pbf: Pbf): void { for (let i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); } /** + * Write a packed float * @param arr - the array of numbers to write * @param pbf - the Protobuf class */ @@ -1028,6 +1044,7 @@ function writePackedFloat(arr: number[], pbf: Pbf): void { for (let i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); } /** + * Write a packed double * @param arr - the array of numbers to write * @param pbf - the Protobuf class */ @@ -1035,6 +1052,7 @@ function writePackedDouble(arr: number[], pbf: Pbf): void { for (let i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); } /** + * Write a packed boolean * @param arr - the array of numbers to write * @param pbf - the Protobuf class */ @@ -1042,6 +1060,7 @@ function writePackedBoolean(arr: (number | boolean)[], pbf: Pbf): void { for (let i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); } /** + * Write a packed fixed32 * @param arr - the array of numbers to write * @param pbf - the Protobuf class */ @@ -1049,6 +1068,7 @@ function writePackedFixed32(arr: number[], pbf: Pbf): void { for (let i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); } /** + * Write a packed sfixed32 * @param arr - the array of numbers to write * @param pbf - the Protobuf class */ @@ -1056,6 +1076,7 @@ function writePackedSFixed32(arr: number[], pbf: Pbf): void { for (let i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); } /** + * Write a packed fixed64 * @param arr - the array of numbers to write * @param pbf - the Protobuf class */ @@ -1063,6 +1084,7 @@ function writePackedFixed64(arr: number[], pbf: Pbf): void { for (let i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); } /** + * Write a packed sfixed64 * @param arr - the array of numbers to write * @param pbf - the Protobuf class */ @@ -1073,6 +1095,7 @@ function writePackedSFixed64(arr: number[], pbf: Pbf): void { // Buffer code below from https://github.com/feross/buffer, MIT-licensed /** + * Read in a 32-bit unsigned integer from the buffer. There are no compression advantages * @param buf - the buffer of bytes to read * @param pos - the position in the buffer to read from * @returns - the unsigned 32-bit number @@ -1082,6 +1105,7 @@ function readUInt32(buf: Uint8Array, pos: number): number { } /** + * Write a 32-bit unsigned integer to the buffer * @param buf - the buffer of bytes to write * @param val - the unsigned 32-bit number * @param pos - the position in the buffer to write @@ -1094,6 +1118,7 @@ function writeInt32(buf: Uint8Array, val: number, pos: number): void { } /** + * Read in a 32-bit signed integer from the buffer * @param buf - the buffer of bytes to read * @param pos - the position in the buffer to read from * @returns - the signed 32-bit number diff --git a/src/readers/shapefile/dbf.ts b/src/readers/shapefile/dbf.ts index f9d6c816..fc6240d0 100644 --- a/src/readers/shapefile/dbf.ts +++ b/src/readers/shapefile/dbf.ts @@ -27,7 +27,7 @@ export interface DBFRow { decimal: number; } -/** A DBF file class to parse the data from a DBF */ +/** A DBF data class to parse the data from a DBF */ export class DataBaseFile { reader: Reader; #header!: DBFHeader; @@ -53,6 +53,7 @@ export class DataBaseFile { } /** + * Get the properties for the given index * @param index - the index of the properties data we want * @returns - the properties for the given index */ @@ -135,6 +136,7 @@ export class DataBaseFile { } /** + * Parse the value at the given offset * @param offset - offset of the value * @param len - length of the value * @param type - the type of the value diff --git a/src/readers/shapefile/file.ts b/src/readers/shapefile/file.ts index d1f588d5..6581b731 100644 --- a/src/readers/shapefile/file.ts +++ b/src/readers/shapefile/file.ts @@ -2,7 +2,7 @@ import { DataBaseFile } from './dbf'; import { FileReader } from '../file'; import { ShapeFileReader } from './shp'; import { Transformer } from '../../proj4'; -import { fromGzip } from '.'; +import { shapefileFromGzip } from '.'; import { exists, readFile } from 'fs/promises'; import type { ProjectionTransformDefinition } from '../../proj4'; @@ -30,19 +30,20 @@ export interface Definition { /** * Assumes the input is pointing to a shapefile or name without the extension. - * The algorithm will find the rest of the paths if they exist. + * The algorithm will find the rest of the paths if they exist. May also be a gzipped folder. * @param input - the path to the .shp file or name without the extension * @param defs - optional array of ProjectionTransformDefinitions to insert + * @param epsgCodes - a record of EPSG codes to use for the transformer if needed * @returns - a Shapefile */ export async function shapefileFromPath( input: string, defs?: ProjectionTransformDefinition[], + epsgCodes?: Record, ): Promise { if (input.endsWith('.zip')) { const gzipData = await readFile(input); - // need to ass `as ArrayBuffer` to avoid typescript error via github actions - return fromGzip(gzipData.buffer as ArrayBuffer); + return shapefileFromGzip(gzipData.buffer); } const path = input.replace('.shp', ''); const shp = `${path}.shp`; @@ -56,18 +57,21 @@ export async function shapefileFromPath( prj: (await exists(prj)) ? prj : undefined, cpg: (await exists(cpg)) ? cpg : undefined, }; - return shapefileFromDefinition(definition, defs); + + return shapefileFromDefinition(definition, defs, epsgCodes); } /** * Build a Shapefile from a Definition * @param def - a description of the data to parse * @param defs - optional array of ProjectionTransformDefinitions to insert + * @param epsgCodes - a record of EPSG codes to use for the transformer if needed * @returns - a Shapefile */ export async function shapefileFromDefinition( def: Definition, - defs?: ProjectionTransformDefinition[], + defs: ProjectionTransformDefinition[] = [], + epsgCodes: Record = {}, ): Promise { const { shp, dbf, prj, cpg } = def; const encoding = cpg !== undefined ? await readFile(cpg, { encoding: 'utf8' }) : 'utf8'; @@ -76,8 +80,9 @@ export async function shapefileFromDefinition( const dbfReader = dbf !== undefined ? new FileReader(dbf) : undefined; const databaseFile = dbfReader !== undefined ? new DataBaseFile(dbfReader, encoding) : undefined; - if (transform !== undefined && defs !== undefined) { + if (transform !== undefined) { for (const def of defs) transform.insertDefinition(def); + for (const [key, value] of Object.entries(epsgCodes)) transform.insertEPSGCode(key, value); } return new ShapeFileReader(new FileReader(shp), databaseFile, transform); diff --git a/src/readers/shapefile/index.ts b/src/readers/shapefile/index.ts index 43d790b3..8f72abd0 100644 --- a/src/readers/shapefile/index.ts +++ b/src/readers/shapefile/index.ts @@ -13,16 +13,18 @@ export * from './shp'; * Assumes the input is pointing to shapefile data. * @param input - raw buffer of gzipped data (folder of shp, dbf, prj, and/or cpg) * @param defs - optional array of ProjectionTransformDefinitions to insert + * @param epsgCodes - a record of EPSG codes to use for the transformer if needed * @returns - a Shapefile */ -export async function fromGzip( - input: ArrayBuffer, +export async function shapefileFromGzip( + input: ArrayBufferLike, defs?: ProjectionTransformDefinition[], + epsgCodes?: Record, ): Promise { let encoding = 'utf8'; let transform: Transformer | undefined = undefined; let dbfReader: DataBaseFile | undefined = undefined; - let shpData: Uint8Array | undefined = undefined; + let shpData: Uint8Array | undefined = undefined; for (const item of iterItems(new Uint8Array(input))) { if (item.filename.endsWith('cpg')) { encoding = new TextDecoder('utf8').decode(await item.read()); @@ -37,6 +39,9 @@ export async function fromGzip( if (defs !== undefined) { for (const def of defs) transform.insertDefinition(def); } + if (epsgCodes !== undefined) { + for (const [key, value] of Object.entries(epsgCodes)) transform.insertEPSGCode(key, value); + } } } if (shpData === undefined) throw new Error('Shapefile not found'); @@ -48,9 +53,9 @@ export async function fromGzip( * @param url - the url to the shapefile * @returns - a Shapefile */ -export async function fromURL(url: string): Promise { +export async function shapefileFromURL(url: string): Promise { const data = await fetchShapefile(url); - if (url.endsWith('.zip')) return fromGzip(data); + if (url.endsWith('.zip')) return shapefileFromGzip(data); return new ShapeFileReader(new BufferReader(data)); } @@ -59,7 +64,7 @@ export async function fromURL(url: string): Promise { * @param url - the url to the shapefile * @returns - raw data of a shapefile OR a gzipped folder that may include the dbf, prj, and/or cpg */ -async function fetchShapefile(url: string): Promise { +async function fetchShapefile(url: string): Promise { return await fetch(url) .then(async (res) => { if (!res.ok) throw new Error(`Failed to fetch data from ${url}`); diff --git a/src/readers/shapefile/mmap.ts b/src/readers/shapefile/mmap.ts index c8dca1e2..fe4c7176 100644 --- a/src/readers/shapefile/mmap.ts +++ b/src/readers/shapefile/mmap.ts @@ -2,7 +2,7 @@ import { DataBaseFile } from './dbf'; import { MMapReader } from '../mmap'; import { ShapeFileReader } from './shp'; import { Transformer } from '../../proj4'; -import { fromGzip } from '.'; +import { shapefileFromGzip } from '.'; import { exists, readFile } from 'fs/promises'; export * from './dbf'; @@ -35,8 +35,7 @@ export interface Definition { export async function shapefileFromPath(input: string) { if (input.endsWith('.zip')) { const gzipData = await readFile(input); - // need to ass `as ArrayBuffer` to avoid typescript error via github actions - return fromGzip(gzipData.buffer as ArrayBuffer); + return shapefileFromGzip(gzipData.buffer); } const path = input.replace('.shp', ''); const shp = `${path}.shp`; diff --git a/src/readers/shapefile/shp.ts b/src/readers/shapefile/shp.ts index 774bf58d..de885425 100644 --- a/src/readers/shapefile/shp.ts +++ b/src/readers/shapefile/shp.ts @@ -40,7 +40,34 @@ export interface SHPRow { data: DataView; } -/** The Shapefile Reader */ +/** + * # The Shapefile Reader + * + * ## Description + * Reads data from a shapefile implementing the {@link FeatureIterator} interface + * + * NOTE: It's recommended to not parse the shapefile directly but instead: + * - `import { shapefileFromURL } from 's2-tools';` + * - `import { shapefileFromPath } from 's2-tools/file';` + * + * This ensures the other files paired with the shapefile are loaded to properly handle the + * projection and properties data. + * + * ## Usage + * ```ts + * import { ShapeFileReader, DataBaseFile, Transformer } from 's2-tools'; + * import { FileReader } from 's2-tools/file'; + * + * const transform = new Transformer(); + * const dbf = new DataBaseFile(new FileReader('./data.dbf'), 'utf-8'); + * const reader = new ShapeFileReader(new FileReader('./data.shp'), dbf, transform); + * + * // read all the features + * for await (const feature of reader) { + * console.log(feature); + * } + * ``` + */ export class ShapeFileReader< M = Record, D extends MValue = MValue, @@ -136,6 +163,7 @@ export class ShapeFileReader< } /** + * Get a row * @param offset - offset of the row * @returns - the row if it exists */ @@ -153,6 +181,7 @@ export class ShapeFileReader< } /** + * Parse a row * @param rowOffset - the row to get and parse * @param index - the index of the feature * @returns - the parsed feature @@ -173,6 +202,7 @@ export class ShapeFileReader< } /** + * Parse a shape geometry * @param type - the shape type * @param data - the shape data to parse * @returns - the parsed geometry if its valid @@ -194,6 +224,7 @@ export class ShapeFileReader< } /** + * Parse a point * @param data - the raw data to decode * @param offset - the offset of the point to decode * @param offset3D - if provided, the offset of the Z value @@ -209,6 +240,7 @@ export class ShapeFileReader< } /** + * Parse a multi-point * @param data - the raw data to decode * @param is3D - is the shape a 3D shape * @returns - the decoded point or multi-point @@ -253,6 +285,7 @@ export class ShapeFileReader< } /** + * Parse a multi-line * @param data - the raw data to decode * @param isPoly - is the shape a polygon or line(s) * @param is3D - is the shape a 3D shape diff --git a/src/readers/tile/file.ts b/src/readers/tile/file.ts new file mode 100644 index 00000000..af134675 --- /dev/null +++ b/src/readers/tile/file.ts @@ -0,0 +1,187 @@ +import { imageDecoder } from '../image'; +import { toMetadata } from 's2-tilejson'; +import { RasterS2TileReader, RasterTileReader } from '.'; +import { readFile, readdir, stat } from 'fs/promises'; + +import type { ElevationConverter, ElevationPoint, S2TileMetadata, TileMetadata } from '.'; +import type { + Face, + FeatureIterator, + Properties, + RGBA, + S2Feature, + S2PMTilesReader, + VectorFeature, +} from '../..'; +import type { Metadata, Metadatas } from 's2-tilejson'; + +// TODO: Support timestamps + +/** + * # Raster Tiles File Reader + * + * ## Description + * Read an entire archive of raster tiles, where the max zoom data is iterated upon + * + * Supports reading either RGB(A) data and/or RGB(A) encoded elevation data. + * + * ## Usage + * ```ts + * import { convertTerrariumElevationData } from 's2-tools'; + * import { RasterTilesFileReader } from 's2-tools/file'; + * + * // creates a reader for a tile set treating the max zoom as 3 instead of the metadata's max zoom + * const reader = new RasterTilesFileReader('./raster-tiles-top-level-folder', 3); + * // example of reading in an elevation dataset + * const reader2 = new RasterTilesFileReader('./terrariumData', -1, convertTerrariumElevationData); + * + * // grab the metadata + * const metadata = await reader.getMetadata(); + * + * // grab a WM tile + * const tile1 = await reader.getTile(0, 0, 0); + * // or if it's an S2 tile spec + * const tile2 = await reader.getTileS2(0, 0, 0, 0); + * + * // grab all the max zoom tiles: + * for await (const tile of reader) { + * console.log(tile); + * } + * ``` + */ +export class RasterTilesFileReader + implements FeatureIterator +{ + metadata?: Metadata; + /** + * @param input - the file path or S2PMTilesReader to read from + * @param threshold - if non-zero its the max zoom to read all tiles in the FeatureIterator + * @param converter - the elevation converter + */ + constructor( + readonly input: string | S2PMTilesReader, + readonly threshold = -1, + readonly converter?: ElevationConverter, + ) {} + + /** + * Get the metadata of the archive + * @returns - the metadata + */ + async getMetadata(): Promise { + if (this.metadata !== undefined) return this.metadata; + if (typeof this.input === 'string') { + const file = await readFile(`${this.input}/metadata.json`, { encoding: 'utf-8' }); + this.metadata = toMetadata(JSON.parse(file) as Metadatas); + } else { + this.metadata = await this.input.getMetadata(); + } + return this.metadata; + } + + /** + * Grab the tile at the given zoom-x-y coordinates + * @param zoom - the zoom level of the tile + * @param x - the x coordinate of the tile + * @param y - the y coordinate of the tile + * @returns - the tile + */ + async getTile(zoom: number, x: number, y: number): Promise | undefined> { + const { extension, scheme } = await this.getMetadata(); + const isTMS = scheme === 'tms'; + const data = + typeof this.input === 'string' + ? await readFile(`${this.input}/${zoom}/${x}/${y}.${extension}`) + : await this.input.getTile(zoom, x, y); + if (data === undefined) return undefined; + const imageData = await imageDecoder(data, { modulo: 256 }); + return new RasterTileReader(zoom, x, y, imageData, isTMS, this.converter); + } + + /** + * Grab the tile at the given (face, zoom, x, y) coordinates + * @param face - the Open S2 projection face + * @param zoom - the zoom level of the tile + * @param x - the x coordinate of the tile + * @param y - the y coordinate of the tile + * @returns - the tile + */ + async getTileS2( + face: Face, + zoom: number, + x: number, + y: number, + ): Promise | undefined> { + const { extension } = await this.getMetadata(); + const data = + typeof this.input === 'string' + ? await readFile(`${this.input}/${face}/${zoom}/${x}/${y}.${extension}`) + : await this.input.getTileS2(face, zoom, x, y); + if (data === undefined) return undefined; + const imageData = await imageDecoder(data, { modulo: 256 }); + return new RasterS2TileReader(face, zoom, x, y, imageData, this.converter); + } + + /** + * Return true if the tile exists + * @param zoom - the zoom level of the tile + * @param x - the x coordinate of the tile + * @param y - the y coordinate of the tile + * @returns - true if the tile exists + */ + async hasTile(zoom: number, x: number, y: number): Promise { + const { extension } = await this.getMetadata(); + if (typeof this.input === 'string') { + const stats = await stat(`${this.input}/${zoom}/${x}/${y}.${extension}`); + return stats.isFile(); + } else { + return await this.input.hasTile(zoom, x, y); + } + } + + /** + * Return true if the tile exists + * @param face - the Open S2 projection face + * @param zoom - the zoom level of the tile + * @param x - the x coordinate of the tile + * @param y - the y coordinate of the tile + * @returns - true if the tile exists + */ + async hasTileS2(face: Face, zoom: number, x: number, y: number): Promise { + const { extension } = await this.getMetadata(); + if (typeof this.input === 'string') { + const stats = await stat(`${this.input}/${face}/${zoom}/${x}/${y}.${extension}`); + return stats.isFile(); + } else { + return await this.input.hasTileS2(face, zoom, x, y); + } + } + + /** + * Iterate over all tiles in the archive + * @yields - the each of the tile's pixel RGBA data as lon-lat or S2 s-t coordinates with the RGBA as m-values + */ + async *[Symbol.asyncIterator](): AsyncGenerator< + S2Feature | VectorFeature + > { + // iterate down from min zoom. Upon reaching maxzoom store all pixels + const { scheme, maxzoom } = await this.getMetadata(); + const zoom = this.threshold >= 0 ? this.threshold : maxzoom; + const isS2 = scheme === 'fzxy' || scheme === 'tfzxy'; + for (const face of (isS2 ? [0, 1, 2, 3, 4, 5] : [0]) as Face[]) { + const xPath = isS2 ? `${this.input}/${face}/${zoom}` : `${this.input}/${zoom}`; + for (const x of await readdir(xPath)) { + const yPath = `${xPath}/${x}`; + const xNumber = Number(x); + for (const y of await readdir(yPath)) { + const yNumber = Number(y.split('.')[0]); + const tile = isS2 + ? await this.getTileS2(face, zoom, xNumber, yNumber) + : await this.getTile(zoom, xNumber, yNumber); + if (tile === undefined) continue; + yield* tile; + } + } + } + } +} diff --git a/src/readers/tile/index.ts b/src/readers/tile/index.ts new file mode 100644 index 00000000..0873a15f --- /dev/null +++ b/src/readers/tile/index.ts @@ -0,0 +1,388 @@ +import { bboxST } from '../../geometry/s2/coords'; +import { imageDecoder } from '../image'; +import { toMetadata } from 's2-tilejson'; +import { xyzToBBOX } from '../../geometry/wm/coords'; + +import type { + Face, + FeatureIterator, + Properties, + RGBA, + S2Feature, + S2PMTilesReader, + VectorFeature, + VectorPoint, +} from '../..'; +import type { Metadata, Metadatas } from 's2-tilejson'; + +// TODO: Support timestamps + +/** Elevation point used by elevation readers */ +export interface ElevationPoint extends Properties { + elev: number; +} + +/** Tile's metadata */ +export interface TileMetadata { + zoom: number; + x: number; + y: number; +} + +/** S2 Tile's metadata */ +export interface S2TileMetadata { + face: Face; + zoom: number; + x: number; + y: number; +} + +/** Elevation converter */ +export type ElevationConverter = (r: number, g: number, b: number, a?: number) => number; + +/** + * @param r - red + * @param g - green + * @param b - blue + * @returns - elevation + */ +export function convertTerrariumElevationData(r: number, g: number, b: number): number { + return r * 256.0 + g + b / 256.0 - 32768.0; +} + +/** + * @param r - red + * @param g - green + * @param b - blue + * @returns - elevation + */ +export function convertMapboxElevationData(r: number, g: number, b: number): number { + return -10000 + (r * 256 * 256 + g * 256 + b) * 0.1; +} + +/** + * # Raster Tiles Reader + * + * ## Description + * Read an entire archive of raster tiles, where the max zoom data is iterated upon + * + * Supports reading either RGB(A) data and/or RGB(A) encoded elevation data. + * + * NOTE: Consider using the RasterTilesFileReader from `s2-tools/file` instead for local access. + * + * ## Usage + * ```ts + * import { RasterTilesReader, convertTerrariumElevationData } from 's2-tools'; + * + * // creates a reader for a tile set treating the max zoom as 3 instead of the metadata's max zoom + * const reader = new RasterTilesReader('https://example.com/satellite-data', 3); + * // example of reading in an elevation dataset + * const reader2 = new RasterTilesReader('https://example.com/terrariumData', -1, convertTerrariumElevationData); + * + * // grab the metadata + * const metadata = await reader.getMetadata(); + * + * // grab a WM tile + * const tile1 = await reader.getTile(0, 0, 0); + * // or if it's an S2 tile spec + * const tile2 = await reader.getTileS2(0, 0, 0, 0); + * + * // grab all the max zoom tiles: + * for await (const tile of reader) { + * console.log(tile); + * } + * ``` + */ +export class RasterTilesReader + implements FeatureIterator +{ + metadata?: Metadata; + /** + * @param input - the URL path or S2PMTilesReader to read from + * @param threshold - if non-zero its the max zoom to read all tiles in the FeatureIterator + * @param converter - the elevation converter + */ + constructor( + readonly input: string | S2PMTilesReader, + readonly threshold = -1, + readonly converter?: ElevationConverter, + ) {} + + /** + * Get the metadata of the archive + * @returns - the metadata + */ + async getMetadata(): Promise { + if (this.metadata !== undefined) return this.metadata; + if (typeof this.input === 'string') { + const meta = await fetch(`${this.input}/metadata.json`).then( + async (res) => (await res.json()) as Metadatas, + ); + this.metadata = toMetadata(meta); + } else { + this.metadata = await this.input.getMetadata(); + } + return this.metadata; + } + + /** + * Grab the tile at the given zoom-x-y coordinates + * @param zoom - the zoom level of the tile + * @param x - the x coordinate of the tile + * @param y - the y coordinate of the tile + * @returns - the tile + */ + async getTile(zoom: number, x: number, y: number): Promise | undefined> { + const { extension, scheme } = await this.getMetadata(); + const isTMS = scheme === 'tms'; + const data = + typeof this.input === 'string' + ? await fetch(`${this.input}/${zoom}/${x}/${y}.${extension}`).then( + async (res) => await res.arrayBuffer(), + ) + : await this.input.getTile(zoom, x, y); + if (data === undefined) return undefined; + const imageData = await imageDecoder(data, { modulo: 256 }); + return new RasterTileReader(zoom, x, y, imageData, isTMS, this.converter); + } + + /** + * Grab the tile at the given (face, zoom, x, y) coordinates + * @param face - the Open S2 projection face + * @param zoom - the zoom level of the tile + * @param x - the x coordinate of the tile + * @param y - the y coordinate of the tile + * @returns - the tile + */ + async getTileS2( + face: Face, + zoom: number, + x: number, + y: number, + ): Promise | undefined> { + const { extension } = await this.getMetadata(); + const data = + typeof this.input === 'string' + ? await fetch(`${this.input}/${face}/${zoom}/${x}/${y}.${extension}`).then( + async (res) => await res.arrayBuffer(), + ) + : await this.input.getTileS2(face, zoom, x, y); + if (data === undefined) return undefined; + const imageData = await imageDecoder(data, { modulo: 256 }); + return new RasterS2TileReader(face, zoom, x, y, imageData, this.converter); + } + + /** + * Return true if the tile exists + * @param zoom - the zoom level of the tile + * @param x - the x coordinate of the tile + * @param y - the y coordinate of the tile + * @returns - true if the tile exists + */ + async hasTile(zoom: number, x: number, y: number): Promise { + const { extension } = await this.getMetadata(); + if (typeof this.input === 'string') { + const response = await fetch(`${this.input}/${zoom}/${x}/${y}.${extension}`, { + method: 'HEAD', + }); + return response.ok; + } else { + return await this.input.hasTile(zoom, x, y); + } + } + + /** + * Return true if the tile exists + * @param face - the Open S2 projection face + * @param zoom - the zoom level of the tile + * @param x - the x coordinate of the tile + * @param y - the y coordinate of the tile + * @returns - true if the tile exists + */ + async hasTileS2(face: Face, zoom: number, x: number, y: number): Promise { + const { extension } = await this.getMetadata(); + if (typeof this.input === 'string') { + const response = await fetch(`${this.input}/${face}/${zoom}/${x}/${y}.${extension}`, { + method: 'HEAD', + }); + return response.ok; + } else { + return await this.input.hasTileS2(face, zoom, x, y); + } + } + + /** + * Iterate over all tiles in the archive + * @yields - the each of the tile's pixel RGBA data as lon-lat or S2 s-t coordinates with the RGBA as m-values + */ + async *[Symbol.asyncIterator](): AsyncGenerator< + S2Feature | VectorFeature + > { + // iterate down from min zoom. Upon reaching maxzoom store all pixels + const { scheme, minzoom, maxzoom } = await this.getMetadata(); + const threshold = this.threshold >= 0 ? this.threshold : maxzoom; + const isS2 = scheme === 'fzxy' || scheme === 'tfzxy'; + for (const face of (isS2 ? [0, 1, 2, 3, 4, 5] : [0]) as Face[]) { + const stack: [zoom: number, x: number, y: number][] = [[0, 0, 0]]; + while (stack.length > 0) { + const [zoom, x, y] = stack.pop()!; + // if zoom not reached yet, push children and continue + const hasTile = isS2 + ? await this.hasTileS2(face, zoom, x, y) + : await this.hasTile(zoom, x, y); + if (zoom < minzoom || (zoom !== threshold && hasTile)) { + stack.push( + [zoom + 1, x * 2, y * 2], + [zoom + 1, x * 2 + 1, y * 2], + [zoom + 1, x * 2, y * 2 + 1], + [zoom + 1, x * 2 + 1, y * 2 + 1], + ); + continue; + } else if (zoom === threshold) { + const tile = isS2 + ? await this.getTileS2(face, zoom, x, y) + : await this.getTile(zoom, x, y); + if (tile === undefined) continue; + yield* tile; + } + } + } + } +} + +/** + * Raster Tile Reader + */ +export class RasterTileReader + implements FeatureIterator +{ + /** + * @param zoom - the zoom level of the tile + * @param x - the x coordinate of the tile + * @param y - the y coordinate of the tile + * @param image - the raw RGB(A) image data + * @param tmsStyle - if true, the y is inverted + * @param converter - the elevation converter (if provided its not an RGBA image but rather elevation data) + */ + constructor( + readonly zoom: number, + readonly x: number, + readonly y: number, + readonly image: ImageData, + readonly tmsStyle = false, + readonly converter?: ElevationConverter, + ) {} + + /** + * Iterate over all tiles in the archive + * @yields - the each of the tile's pixel RGBA data as lon-lat coordinates with the RGBA as m-values + */ + async *[Symbol.asyncIterator](): AsyncGenerator> { + const { zoom, x, y, image, tmsStyle } = this; + const { width: tileSize, data } = image; + const channels = data.length / (tileSize * tileSize); + // Get the bounding box of the tile in lon-lat + const [west, south, east, north] = xyzToBBOX(x, y, zoom, tmsStyle, 'WGS84', tileSize); + const lonStep = (east - west) / tileSize; + const latStep = (north - south) / tileSize; + const coordinates: VectorPoint[] = []; + + for (let py = 1; py <= tileSize; py++) { + const lat = north - (py - 0.5) * latStep; // Center of the row + for (let px = 1; px <= tileSize; px++) { + const lon = west + (px - 0.5) * lonStep; // Center of the column + const index = ((py - 1) * tileSize + (px - 1)) * channels; + const m: RGBA | ElevationPoint = + this.converter !== undefined + ? { elev: this.converter(data[index], data[index + 1], data[index + 2]) } + : { + r: data[index], + g: data[index + 1], + b: data[index + 2], + a: channels === 4 ? data[index + 3] : 255, + }; + coordinates.push({ x: lon, y: lat, m: m as unknown as T }); + } + } + + yield { + type: 'VectorFeature', + geometry: { + type: 'MultiPoint', + coordinates, + is3D: false, + }, + properties: {}, + metadata: { zoom, x, y }, + }; + } +} + +/** + * S2 Raster Tile Reader + */ +export class RasterS2TileReader + implements FeatureIterator +{ + /** + * @param face - the Open S2 projection face + * @param zoom - the zoom level of the tile + * @param x - the x coordinate of the tile + * @param y - the y coordinate of the tile + * @param image - the raw image RGB(A) data + * @param converter - the elevation converter (if provided its not an RGBA image but rather elevation data) + */ + constructor( + readonly face: Face, + readonly zoom: number, + readonly x: number, + readonly y: number, + readonly image: ImageData, + readonly converter?: ElevationConverter, + ) {} + + /** + * Iterate over all tiles in the archive + * @yields - the each of the tile's pixel RGBA data as S2 s-t coordinates with the RGBA as m-values + */ + async *[Symbol.asyncIterator](): AsyncGenerator> { + const { face, zoom, x, y, image } = this; + const { width: tileSize, data } = image; + const channels = data.length / (tileSize * tileSize); + // Get the bounding box of the tile in s-t space + const [west, south, east, north] = bboxST(x, y, zoom); + const lonStep = (east - west) / tileSize; + const latStep = (north - south) / tileSize; + const coordinates: VectorPoint[] = []; + + for (let py = 1; py <= tileSize; py++) { + const lat = north - (py - 0.5) * latStep; // Center of the row + for (let px = 1; px <= tileSize; px++) { + const lon = west + (px - 0.5) * lonStep; // Center of the column + const index = ((py - 1) * tileSize + (px - 1)) * channels; + const m: RGBA | ElevationPoint = + this.converter !== undefined + ? { elev: this.converter(data[index], data[index + 1], data[index + 2]) } + : { + r: data[index], + g: data[index + 1], + b: data[index + 2], + a: channels === 4 ? data[index + 3] : 255, + }; + coordinates.push({ x: lon, y: lat, m: m as unknown as T }); + } + } + + yield { + type: 'S2Feature', + face, + geometry: { + type: 'MultiPoint', + coordinates, + is3D: false, + }, + properties: {}, + metadata: { face, zoom, x, y }, + }; + } +} diff --git a/src/readers/wkt/geometry.ts b/src/readers/wkt/geometry.ts index 8804bff2..8850ef72 100644 --- a/src/readers/wkt/geometry.ts +++ b/src/readers/wkt/geometry.ts @@ -131,7 +131,6 @@ function parseWKTArray(wktStr: string): WKTArray { return res.length > 0 ? (res[0] as WKTArray) : res; } -// always return the endBracketIndex if we hit it /** * Parse a WKT array. * always return the endBracketIndex if we hit it diff --git a/src/readers/wkt/projection.ts b/src/readers/wkt/projection.ts index d620904e..4364742e 100644 --- a/src/readers/wkt/projection.ts +++ b/src/readers/wkt/projection.ts @@ -416,6 +416,7 @@ function updateProj(wkt: WKTCRS): void { wkt.b = wkt.a; } /** + * Converts input data to meters * @param input - meters pre-conversion * @returns - meters */ diff --git a/src/readers/xml/parsing.ts b/src/readers/xml/parsing.ts index 83e70347..c27e1df5 100644 --- a/src/readers/xml/parsing.ts +++ b/src/readers/xml/parsing.ts @@ -14,31 +14,33 @@ export interface XMLTag { end: number; } /** A Step is a name and an index */ -export interface Step { +export interface XMLStep { name: string; index?: number | undefined | null; } /** A Path is an array of Steps or Strings */ -export type Path = Array | ReadonlyArray; +export type XMLPath = Array | ReadonlyArray; /** + * Count the number of times a substring appears in a string * @param string - the string * @param substring - the substring * @returns the number of times the substring appears in the string */ -export function countSubstring(string: string, substring: string): number { +export function xmlCountSubstring(string: string, substring: string): number { const pattern = new RegExp(substring, 'g'); const match = string.match(pattern); return match !== null ? match.length : 0; } /** + * Find the first tag with the given name * @param xml - the xml string * @param tagName - the tag name * @param options - user defined options * @returns the first tag with the given name */ -export function findTagByName( +export function xmlFindTagByName( xml: string, tagName: string, options?: XMLOptions, @@ -50,13 +52,13 @@ export function findTagByName( if (debug) console.info('[xml-utils] starting findTagByName with', tagName, ' and ', options); - const start = indexOfMatch(xml, `<${tagName}[ \n>/]`, startIndex); + const start = xmlIndexOfMatch(xml, `<${tagName}[ \n>/]`, startIndex); if (debug) console.info('[xml-utils] start:', start); if (start === -1) return undefined; const afterStart = xml.slice(start + tagName.length); - let relativeEnd = indexOfMatchEnd(afterStart, '^[^<]*[ /]>', 0); + let relativeEnd = xmlIndexOfMatchEnd(afterStart, '^[^<]*[ /]>', 0); const selfClosing = relativeEnd !== -1 && afterStart[relativeEnd - 1] === '/'; if (debug) console.info('[xml-utils] selfClosing:', selfClosing); @@ -68,17 +70,17 @@ export function findTagByName( let openings = 1; let closings = 0; while ( - (relativeEnd = indexOfMatchEnd(afterStart, '[ /]' + tagName + '>', startIndex)) !== -1 + (relativeEnd = xmlIndexOfMatchEnd(afterStart, '[ /]' + tagName + '>', startIndex)) !== -1 ) { const clip = afterStart.substring(startIndex, relativeEnd + 1); - openings += countSubstring(clip, '<' + tagName + '[ \n\t>]'); - closings += countSubstring(clip, ''); + openings += xmlCountSubstring(clip, '<' + tagName + '[ \n\t>]'); + closings += xmlCountSubstring(clip, ''); // we can't have more openings than closings if (closings >= openings) break; startIndex = relativeEnd; } } else { - relativeEnd = indexOfMatchEnd(afterStart, '[ /]' + tagName + '>', 0); + relativeEnd = xmlIndexOfMatchEnd(afterStart, '[ /]' + tagName + '>', 0); } } @@ -100,31 +102,37 @@ export function findTagByName( } /** + * Find the first tag with the given path * @param xml - the xml string * @param path - the path * @param options - user defined options * @returns the first tag with the given path */ -export function findTagByPath(xml: string, path: Path, options?: XMLOptions): XMLTag | undefined { +export function xmlFindTagByPath( + xml: string, + path: XMLPath, + options?: XMLOptions, +): XMLTag | undefined { const debug = options?.debug ?? false; - const found = findTagsByPath(xml, path, { debug, returnOnFirst: true }); + const found = xmlFindTagsByPath(xml, path, { debug, returnOnFirst: true }); if (Array.isArray(found) && found.length === 1) return found[0]; else return undefined; } /** + * Find all tags with the given name * @param xml - the xml string * @param tagName - the tag name * @param options - user defined options * @returns all tags with the given name */ -export function findTagsByName(xml: string, tagName: string, options?: XMLOptions): XMLTag[] { +export function xmlFindTagsByName(xml: string, tagName: string, options?: XMLOptions): XMLTag[] { const tags = []; const debug = options?.debug ?? false; const nested = options?.nested ?? true; let startIndex = options?.startIndex ?? 0; while (true) { - const tag = findTagByName(xml, tagName, { debug, startIndex }); + const tag = xmlFindTagByName(xml, tagName, { debug, startIndex }); if (tag === undefined) break; if (nested) { startIndex = tag.start + 1 + tagName.length; @@ -138,12 +146,13 @@ export function findTagsByName(xml: string, tagName: string, options?: XMLOption } /** + * Find all tags with the given path * @param xml - the xml string * @param path - the path * @param options - user defined options * @returns all tags with the given path */ -export function findTagsByPath(xml: string, path: Path, options?: XMLOptions): XMLTag[] { +export function xmlFindTagsByPath(xml: string, path: XMLPath, options?: XMLOptions): XMLTag[] { const debug = options?.debug ?? false; if (debug) console.info('[xml-utils] starting findTagsByPath with: ', xml.substring(0, 500)); const returnOnFirst = options?.returnOnFirst ?? false; @@ -151,7 +160,7 @@ export function findTagsByPath(xml: string, path: Path, options?: XMLOptions): X if (Array.isArray(path) === false) throw new Error('[xml-utils] path should be an array'); const path0 = typeof path[0] === 'string' ? { name: path[0] } : path[0]; - let tags = findTagsByName(xml, path0.name, { debug, nested: false }); + let tags = xmlFindTagsByName(xml, path0.name, { debug, nested: false }); if (typeof tags !== 'undefined' && typeof path0.index === 'number') { if (typeof tags[path0.index] === 'undefined') { tags = []; @@ -164,15 +173,15 @@ export function findTagsByPath(xml: string, path: Path, options?: XMLOptions): X path = path.slice(1); for (let pathIndex = 0; pathIndex < path.length; pathIndex++) { - const part: { name: string } | Step = + const part: { name: string } | XMLStep = typeof path[pathIndex] === 'string' ? { name: path[pathIndex] as string } - : (path[pathIndex] as Step); + : (path[pathIndex] as XMLStep); if (debug) console.info('part.name:', part.name); let allSubTags: XMLTag[] = []; for (let tagIndex = 0; tagIndex < tags.length; tagIndex++) { const tag = tags[tagIndex]; - const subTags = findTagsByName(tag.outer, part.name, { + const subTags = xmlFindTagsByName(tag.outer, part.name, { debug, startIndex: 1, }); @@ -200,12 +209,13 @@ export function findTagsByPath(xml: string, path: Path, options?: XMLOptions): X } /** + * Get the value of an attribute * @param tag - the tag * @param attributeName - the attribute name * @param options - user defined options * @returns the attribute value */ -export function getAttribute( +export function xmlGetAttribute( tag: string | XMLTag, attributeName: string, options?: XMLOptions, @@ -232,12 +242,13 @@ export function getAttribute( } /** + * Find the index of the last match * @param xml - the xml string * @param pattern - the pattern * @param startIndex - the start index * @returns the index of the last match */ -export function indexOfMatchEnd(xml: string, pattern: string, startIndex: number): number { +export function xmlIndexOfMatchEnd(xml: string, pattern: string, startIndex: number): number { const re = new RegExp(pattern); const match = re.exec(xml.slice(startIndex)); if (match !== null) return startIndex + match.index + match[0].length - 1; @@ -245,12 +256,13 @@ export function indexOfMatchEnd(xml: string, pattern: string, startIndex: number } /** + * Find the index of the first match * @param xml - the xml string * @param pattern - the pattern * @param startIndex - the start index * @returns the index of the first match */ -export function indexOfMatch(xml: string, pattern: string, startIndex: number): number { +export function xmlIndexOfMatch(xml: string, pattern: string, startIndex: number): number { const re = new RegExp(pattern); const match = re.exec(xml.slice(startIndex)); if (match !== null) return startIndex + match.index; @@ -258,23 +270,25 @@ export function indexOfMatch(xml: string, pattern: string, startIndex: number): } /** + * Remove comments * @param xml - the xml string * @returns the xml without comments */ -export function removeComments(xml: string): string { +export function xmlRemoveComments(xml: string): string { return xml.replace(//g, ''); } /** + * Remove tags * @param xml - the xml string * @param tagName - the tag name * @param options - user defined options * @returns the xml without the given tag */ -export function removeTagsByName(xml: string, tagName: string, options?: XMLOptions) { +export function xmlRemoveTagsByName(xml: string, tagName: string, options?: XMLOptions) { const debug = options?.debug ?? false; while (true) { - const tag = findTagByName(xml, tagName, { debug }); + const tag = xmlFindTagByName(xml, tagName, { debug }); if (tag === undefined) break; xml = xml.substring(0, tag.start) + xml.substring(tag.end); if (debug) console.info('[xml-utils] removed:', tag); diff --git a/src/space/gpu/index.ts b/src/space/gpu/index.ts index 7153e17d..784f7e2c 100644 --- a/src/space/gpu/index.ts +++ b/src/space/gpu/index.ts @@ -4,7 +4,26 @@ import { earthRadius, j2, j3oj2, pi, twoPi, vkmpersec, x2o3, xke } from '../util import type { Satellite } from '../sat'; /** + * # SGP4GPU + * + * ## Description + * A GPU implementation of the SGP4 algorithm. * Note: After creating the class you must call `await bfGPU.init()` + * + * ## Usage + * ```ts + * const bfGPU = new SGP4GPU(device); + * await bfGPU.init(); + * const gpuBufferOut = bfGPU.prepareData({ ... }) + * ... + * bfGPU.run(passEncoder) + * passEncoder.end() + * bfGPU.createReadDistBuffer(gpuBufferOut) + * device.queue.submit([commandEncoder.finish()]) + * await gpuReadBufferDist.mapAsync(GPUMapMode.READ) + * const resultDist = gpuReadBufferDist.getMappedRange() + * const resultAB = new Float32Array(resultDist) + * ``` */ export class SGP4GPU { #device: GPUDevice; diff --git a/src/space/index.ts b/src/space/index.ts index 808ca851..dbff9353 100644 --- a/src/space/index.ts +++ b/src/space/index.ts @@ -1,4 +1,5 @@ // export * from './gpu'; +export * from './planets'; export * from './propagation'; export * from './util'; export * from './sat'; diff --git a/src/geometry/planets/earth.ts b/src/space/planets/earth.ts similarity index 100% rename from src/geometry/planets/earth.ts rename to src/space/planets/earth.ts diff --git a/src/geometry/planets/index.ts b/src/space/planets/index.ts similarity index 76% rename from src/geometry/planets/index.ts rename to src/space/planets/index.ts index a453eab4..e387113e 100644 --- a/src/geometry/planets/index.ts +++ b/src/space/planets/index.ts @@ -1,5 +1,7 @@ // https://nssdc.gsfc.nasa.gov/planetary/factsheet/ +// TODO: Support finding positional data https://aa.quae.nl/en/reken/hemelpositie.html + export * from './earth'; export * from './jupiter'; export * from './mars'; diff --git a/src/geometry/planets/jupiter.ts b/src/space/planets/jupiter.ts similarity index 100% rename from src/geometry/planets/jupiter.ts rename to src/space/planets/jupiter.ts diff --git a/src/geometry/planets/mars.ts b/src/space/planets/mars.ts similarity index 52% rename from src/geometry/planets/mars.ts rename to src/space/planets/mars.ts index 96873ad4..b5581a91 100644 --- a/src/geometry/planets/mars.ts +++ b/src/space/planets/mars.ts @@ -6,3 +6,13 @@ export const MARS_RADIUS_EQUATORIAL = 3_396_200; export const MARS_RADIUS_POLAR = 3_376_200; /** The average circumference of Mars in meters. */ export const MARS_CIRCUMFERENCE = 21_296_856.59868521; // 2.0 * Math.PI * MARS_RADIUS; +/** + * The altitude of the highest known point on Mars in meters. + * https://geology.com/articles/highest-point-on-mars.shtml + */ +export const MARS_HIGHEST_ALTITUDE = 21_229.0; +/** + * The altitude of the lowest known point on Mars in meters. + * https://en.wikipedia.org/wiki/Hellas_Planitia + */ +export const MARS_LOWEST_ALTITUDE = -7_152.0; diff --git a/src/space/planets/mercury.ts b/src/space/planets/mercury.ts new file mode 100644 index 00000000..33d037e9 --- /dev/null +++ b/src/space/planets/mercury.ts @@ -0,0 +1,18 @@ +/** Mercury's radius in meters */ +export const MERCURY_RADIUS = 2_439_700; +/** Mercury's equitorial radius in meters */ +export const MERCURY_RADIUS_EQUATORIAL = 2_440_500; +/** Mercury's polar radius in meters */ +export const MERCURY_RADIUS_POLAR = 2_438_300; +/** The average circumference of Jupiter in meters. */ +export const MERCURY_CIRCUMFERENCE = 15_329_087.193926036; // 2.0 * Math.PI * MERCURY_RADIUS; +/** + * The altitude of the highest known point on Mercury in meters. + * https://www.usgs.gov/news/national-news-release/first-global-topographic-map-mercury-released + */ +export const MERCURY_HIGHEST_ALTITUDE = 4_480.0; +/** + * The altitude of the lowest known point on Mercury in meters. + * https://www.usgs.gov/news/national-news-release/first-global-topographic-map-mercury-released + */ +export const MERCURY_LOWEST_ALTITUDE = -5_380.0; diff --git a/src/space/planets/moon.ts b/src/space/planets/moon.ts new file mode 100644 index 00000000..f2646c80 --- /dev/null +++ b/src/space/planets/moon.ts @@ -0,0 +1,36 @@ +/** Moon's radius in meters */ +export const MOON_RADIUS = 1_737_400; +/** Moon's equitorial radius in meters */ +export const MOON_RADIUS_EQUATORIAL = 1_738_100; +/** Moon's polar radius in meters */ +export const MOON_RADIUS_POLAR = 1_736_000; +/** The average circumference of the Moon in meters. */ +export const MOON_CIRCUMFERENCE = 10_916_406.152693814; // 2.0 * Math.PI * MOON_RADIUS; +/** + * The altitude of the highest known point on the Moon in meters. + * https://www.lroc.asu.edu/images/249 + */ +export const MOON_HIGHEST_ALTITUDE = 10_786.0; +/** + * The altitude of the lowest known point on the Moon in meters. + * https://en.wikipedia.org/wiki/Antoniadi_%28lunar_crater%29 + */ +export const MOON_LOWEST_ALTITUDE = -9_178.0; + +// Sources: + +// Imagery +// North Pole: +// https://pds.lroc.asu.edu/data/LRO-L-LROC-5-RDR-V1.0/LROLRC_2001/DATA/BDR/NAC_POLE/NAC_POLE_NORTH/ +// https://wms.lroc.asu.edu/lroc/view_rdr_product/WAC_GLOBAL_P900N0000_100M +// South Pole: +// https://pds.lroc.asu.edu/data/LRO-L-LROC-5-RDR-V1.0/LROLRC_2001/DATA/BDR/NAC_POLE/NAC_POLE_SOUTH/ +// https://wms.lroc.asu.edu/lroc/view_rdr_product/WAC_GLOBAL_P900S0000_100M +// Global Mosaic: +// https://astrogeology.usgs.gov/search/map/moon_lro_lroc_wac_global_morphology_mosaic_100m + +// Terrain +// 60deg to 90deg (60m, 30m, 20m, 10m, 5m resolutions): +// https://pds-geosciences.wustl.edu/lro/lro-l-lola-3-rdr-v1/lrolol_1xxx/data/lola_gdr/polar/jp2/ +// 60s to 60n: +// https://astrogeology.usgs.gov/search/map/moon_lro_lola_selene_kaguya_tc_dem_merge_60n60s_59m diff --git a/src/geometry/planets/neptune.ts b/src/space/planets/neptune.ts similarity index 100% rename from src/geometry/planets/neptune.ts rename to src/space/planets/neptune.ts diff --git a/src/geometry/planets/pluto.ts b/src/space/planets/pluto.ts similarity index 50% rename from src/geometry/planets/pluto.ts rename to src/space/planets/pluto.ts index 309509af..8a0221c7 100644 --- a/src/geometry/planets/pluto.ts +++ b/src/space/planets/pluto.ts @@ -1,4 +1,4 @@ -// NOTE: Pluto is a planet. +// NOTE: Pluto is a planet. All else if fake news. /** Pluto's radius in meters */ export const PLUTO_RADIUS = 1_188_000; @@ -8,3 +8,13 @@ export const PLUTO_RADIUS_EQUATORIAL = 1_188_000; export const PLUTO_RADIUS_POLAR = 1_188_000; /** The average circumference of Pluto in meters. */ export const PLUTO_CIRCUMFERENCE = 7_464_424.1449293485; // 2.0 * Math.PI * PLUTO_RADIUS; +/** + * The altitude of the highest known point on Pluto in meters. + * https://en.wikipedia.org/wiki/Tenzing_Montes + */ +export const PLUTO_HIGHEST_ALTITUDE = 6_200.0; +/** + * The altitude of the lowest known point on Pluto in meters. + * https://www.lpi.usra.edu/features/070918/pluto/ + */ +export const PLUTO_LOWEST_ALTITUDE = -3_500.0; diff --git a/src/geometry/planets/saturn.ts b/src/space/planets/saturn.ts similarity index 100% rename from src/geometry/planets/saturn.ts rename to src/space/planets/saturn.ts diff --git a/src/geometry/planets/venus.ts b/src/space/planets/venus.ts similarity index 52% rename from src/geometry/planets/venus.ts rename to src/space/planets/venus.ts index 546002af..ebdf44ff 100644 --- a/src/geometry/planets/venus.ts +++ b/src/space/planets/venus.ts @@ -6,3 +6,13 @@ export const VENUS_RADIUS_EQUATORIAL = 6_051_800; export const VENUS_RADIUS_POLAR = 6_051_800; /** The average circumference of Venus in meters. */ export const VENUS_CIRCUMFERENCE = 38_024_580.84198942; // 2.0 * Math.PI * VENUS_RADIUS; +/** + * The altitude of the highest known point on Venus in meters. + * https://en.wikipedia.org/wiki/Maxwell_Montes + */ +export const VENUS_HIGHEST_ALTITUDE = 11_000.0; +/** + * The altitude of the lowest known point on Venus in meters. + * https://en.wikipedia.org/wiki/List_of_Solar_System_extremes + */ +export const VENUS_LOWEST_ALTITUDE = -3_000.0; diff --git a/src/space/sat.ts b/src/space/sat.ts index 3536cef0..002c40d0 100644 --- a/src/space/sat.ts +++ b/src/space/sat.ts @@ -70,7 +70,7 @@ export interface TLEDataCelestrak { } /** - * Satellite Orbit Class + * # Satellite Orbit Class * * Input TLE example * STARLINK-1007 diff --git a/src/tools/delaunator.ts b/src/tools/delaunator.ts index 08dad260..61e42c2d 100644 --- a/src/tools/delaunator.ts +++ b/src/tools/delaunator.ts @@ -2,7 +2,29 @@ import { incirclefast, orient2d } from '../geometry/predicates'; import type { Point, VectorPoint } from '../geometry'; -/** An incredibly fast and robust Typescript library for Delaunay triangulation of 2D points. */ +/** + * # Delaunator + * + * ## Description + * An incredibly fast and robust Typescript library for Delaunay triangulation of 2D points. + * + * ## Usage + * ```ts + * import { Delaunator } from 's2-tools' + * import type { Point, VectorPoint } from 's2-tools' + * + * // its recommended to stereotypically use `fromPoints` to construct a Delaunator + * const points: Point[] = [...] + * const delaunator = Delaunator.fromPoints(points) + * + * // or you can construct from vector points with `fromVectorPoints` + * const points: VectorPoint[] = [...] + * const delaunator = Delaunator.fromVectorPoints(points) + * + * // you can now use the triangulation + * const { triangles } = delaunator + * ``` + */ export class Delaunator { edgeStack = new Array(512); coords: number[]; diff --git a/src/tools/interpolation/README.md b/src/tools/interpolation/README.md new file mode 100644 index 00000000..6fb40d84 --- /dev/null +++ b/src/tools/interpolation/README.md @@ -0,0 +1,9 @@ +# Interpolation + +## TODO + +- [ ] Kriging +- [ ] IDW +- [ ] Bilinear + + diff --git a/src/tools/orthodrome.ts b/src/tools/orthodrome.ts index c50e2cac..60f2eaf7 100644 --- a/src/tools/orthodrome.ts +++ b/src/tools/orthodrome.ts @@ -3,8 +3,22 @@ import { degToRad, radToDeg } from '../geometry'; import type { VectorPoint } from '../geometry'; /** + * # Orthodrome + * + * ## Description * Represents an orthodrome, which is the shortest path between two points on a sphere. * [Learn more here](http://www.movable-type.co.uk/scripts/latlong.html) + * + * ## Usage + * ```ts + * import { Orthodrome } from 's2-tools' + * + * // starting at lon-lat (-60, -40) and ending at (20, 10) + * const orthodrome = new Orthodrome(-60, -40, 20, 10); + * // { x: -39.13793657428956, y: -33.72852197561652 } + * const intermediatePoint = orthodrome.intermediatePoint(0.2); + * // Distance in KM: 1.5514126949321814 + * const distance = orthodrome.distanceTo(); */ export class Orthodrome { /** start longitude */ @@ -67,6 +81,7 @@ export class Orthodrome { } /** + * Finds the distance between the two points in kilometers * projected normalized (0->1) * @returns - total distance between the two points */ diff --git a/src/tools/polylabel.ts b/src/tools/polylabel.ts index 921be1da..ca093115 100644 --- a/src/tools/polylabel.ts +++ b/src/tools/polylabel.ts @@ -1,5 +1,5 @@ import { PriorityQueue } from '../dataStructures/priorityQueue'; -import { Properties, VectorPoint, VectorPolygon } from '../geometry'; +import { Properties, VectorMultiPolygon, VectorPoint, VectorPolygon } from '../geometry'; /** The metadata inserted into the Vector Feature */ export interface PolyLabelMetadata extends Properties { @@ -7,6 +7,44 @@ export interface PolyLabelMetadata extends Properties { } /** + * # Polylabels + * + * ## Description + * Find the labels for a collection of vector polygons + * + * ## Usage + * ```ts + * import { polylabels } from 's2-tools' + * import type { VectorMultiPolygon } from 's2-tools' + * + * const vectorGeometry: VectorMultiPolygon = []; + * const polylabelHighPrecision = polylabels(vectorGeometry, 1); + * ``` + * @param polygons - A collection of vector polygons to find the labels for + * @param precision - the precision of the label + * @returns - the labels + */ +export function polylabels( + polygons: VectorMultiPolygon, + precision = 1.0, +): VectorPoint[] { + return polygons.map((polygon) => polylabel(polygon, precision)); +} + +/** + * # Polylabel + * + * ## Description + * Find the label for a vector polygon + * + * ## Usage + * ```ts + * import { polylabel } from 's2-tools' + * import type { VectorPolygon } from 's2-tools' + * + * const vectorGeometry: VectorPolygon = []; + * const polylabelHighPrecision = polylabel(vectorGeometry, 1); + * ``` * @param polygon - the vector polygon to find the label for * @param precision - the precision of the label * @returns - the label @@ -45,6 +83,7 @@ export function polylabel(polygon: VectorPolygon, precision = 1.0): VectorPoint< if (bboxCell.d > bestCell.d) bestCell = bboxCell; /** + * add a cell to the queue * @param x - the cell x coordinate * @param y - the cell y coordinate * @param h - the cell height @@ -101,6 +140,7 @@ interface PolyLabelCell { } /** + * build a cell * @param x - the cell x coordinate * @param y - the cell y coordinate * @param h - half the cell size diff --git a/src/util/gzip.ts b/src/util/gzip.ts index df0164b6..abd54901 100644 --- a/src/util/gzip.ts +++ b/src/util/gzip.ts @@ -2,16 +2,31 @@ import { concatUint8Arrays } from '.'; import type { Format } from '..'; +/** + * A Browser compatible Gzip compression function + * @param bytes - the data to decompress + * @param format - the format of the data. Defaults to 'gzip' + * @returns - the decompressed data + */ +export async function compressStream(bytes: Uint8Array, format?: Format): Promise { + // Convert the string to a byte stream. + const stream = new Blob([bytes]).stream(); + // Create a compressed stream. + const compressedStream = stream.pipeThrough(new CompressionStream(format ?? 'gzip')); + // Read all the bytes from this stream. + const chunks = []; + for await (const chunk of compressedStream) chunks.push(chunk); + + return await concatUint8Arrays(chunks); +} + /** * A Browser compatible Gzip decompression function * @param bytes - the data to decompress * @param format - the format of the data. Defaults to 'gzip' * @returns - the decompressed data */ -export async function decompressStream( - bytes: Uint8Array, - format?: Format, -): Promise> { +export async function decompressStream(bytes: Uint8Array, format?: Format): Promise { if (format === undefined) format = bytes[0] === 0x1f && bytes[1] === 0x8b ? 'gzip' : 'deflate'; // Convert the bytes to a stream. const stream = new Blob([bytes]).stream(); @@ -26,6 +41,7 @@ export async function decompressStream( } /** + * Find the end of the central directory * @param raw - the raw data * @returns - the end of the central directory */ @@ -51,14 +67,15 @@ function findEndCentralDirectory(raw: Uint8Array): number { export interface ZipItem { filename: string; comment: string; - read: () => Promise> | Uint8Array; + read: () => Promise | Uint8Array; } /** + * Iterate over the items in a zip file * @param raw - the raw data to read * @yields - {@link ZipItem} */ -export function* iterItems(raw: Uint8Array): Generator { +export function* iterItems(raw: Uint8Array): Generator { const d = new TextDecoder(); let at = findEndCentralDirectory(raw); if (at === -1) { @@ -70,7 +87,7 @@ export function* iterItems(raw: Uint8Array): Generator => + const subarrayMove = (startBy: number, endBy: number): Uint8Array => raw.subarray((at += startBy), (at += endBy)); const dataView = new DataView(raw.buffer, raw.byteOffset); // we don't need byteLength, could be a longer buffer :shrug: diff --git a/src/util/index.ts b/src/util/index.ts index 34e4dadd..d66af53e 100644 --- a/src/util/index.ts +++ b/src/util/index.ts @@ -9,7 +9,7 @@ export type Format = 'deflate' | 'deflate-raw' | 'gzip'; * @param base64 - base64 encoded string * @returns converted ArrayBuffer of the string data */ -export function base64ToArrayBuffer(base64: string): ArrayBuffer { +export function base64ToArrayBuffer(base64: string): ArrayBufferLike { const binaryString = atob(base64); const len = binaryString.length; const bytes = new Uint8Array(len); @@ -22,9 +22,7 @@ export function base64ToArrayBuffer(base64: string): ArrayBuffer { * @param uint8arrays - the Uint8Arrays to concatenate * @returns - the concatenated Uint8Array */ -export async function concatUint8Arrays( - uint8arrays: Uint8Array[], -): Promise> { +export async function concatUint8Arrays(uint8arrays: Uint8Array[]): Promise { const blob = new Blob(uint8arrays); const buffer = await blob.arrayBuffer(); return new Uint8Array(buffer); diff --git a/src/util/lzw.ts b/src/util/lzw.ts index 4344a126..917991b4 100644 --- a/src/util/lzw.ts +++ b/src/util/lzw.ts @@ -54,7 +54,7 @@ function appendReversed(dest: number[], source: number[]): number[] { * @param input - The LZW data * @returns - The decompressed data */ -function decompress(input: ArrayBuffer): Uint8Array { +function decompress(input: ArrayBufferLike): Uint8Array { const dictionaryIndex = new Uint16Array(4093); const dictionaryChar = new Uint8Array(4093); for (let i = 0; i <= 257; i++) { @@ -68,7 +68,7 @@ function decompress(input: ArrayBuffer): Uint8Array { /** * Initializes the dictionary */ - function initDictionary() { + function initDictionary(): void { dictionaryLength = 258; byteLength = MIN_BITS; } @@ -164,6 +164,6 @@ function decompress(input: ArrayBuffer): Uint8Array { * @param buffer - The LZW data * @returns - The decompressed data */ -export function lzwDecoder(buffer: ArrayBuffer): ArrayBuffer { +export function lzwDecoder(buffer: ArrayBufferLike): ArrayBufferLike { return decompress(buffer).buffer; } diff --git a/src/util/polyfills/dataview.ts b/src/util/polyfills/dataview.ts index f30e5d45..f4a8bfd7 100644 --- a/src/util/polyfills/dataview.ts +++ b/src/util/polyfills/dataview.ts @@ -39,6 +39,7 @@ declare global { } /** + * Converts a 32-bit floating point number to a 16-bit floating point number * @param value - the float 32 value * @returns - the float 16 value */ @@ -66,6 +67,7 @@ function float32ToFloat16(value: number): number { } /** + * Converts a 16-bit floating point number to a 32-bit floating point number * @param hbits - float 16 bits * @returns - float32 */ diff --git a/src/util/polyfills/image.ts b/src/util/polyfills/image.ts index 6554cb01..755b76a5 100644 --- a/src/util/polyfills/image.ts +++ b/src/util/polyfills/image.ts @@ -13,7 +13,7 @@ declare global { /** Declare the ImageData class globally */ interface ImageData { - readonly data: Uint8ClampedArray; + readonly data: Uint8ClampedArray; readonly width: number; readonly height: number; } @@ -100,7 +100,7 @@ class OffscreenCanvasPolyfill { /** An offscreen canvas rendering context polyfill */ class OffscreenCanvasRenderingContext2D { - data: Uint8ClampedArray; + data = new Uint8ClampedArray(); /** * @param width - the canvas width * @param height - the canvas height @@ -108,9 +108,7 @@ class OffscreenCanvasRenderingContext2D { constructor( public width: number, public height: number, - ) { - this.data = new Uint8ClampedArray(width * height * 4); - } + ) {} /** * Draw an ImageBitmap onto the canvas at position (dx, dy). @@ -121,21 +119,23 @@ class OffscreenCanvasRenderingContext2D { */ drawImage(image: ImageBitmap, dx: number, dy: number): void { const { width: imgWidth, height: imgHeight, data: imgData } = image; + const channels = imgData.length / (imgWidth * imgHeight); + this.data = new Uint8ClampedArray(imgWidth * imgHeight * channels); for (let y = 0; y < imgHeight; y++) { for (let x = 0; x < imgWidth; x++) { - const imgIndex = (y * imgWidth + x) * 4; // Index in the image data (RGBA) + const imgIndex = (y * imgWidth + x) * channels; // Index in the image data (RGBA) const canvasX = dx + x; const canvasY = dy + y; if (canvasX >= 0 && canvasX < this.width && canvasY >= 0 && canvasY < this.height) { - const canvasIndex = (canvasY * this.width + canvasX) * 4; // Index in the canvas data + const canvasIndex = (canvasY * this.width + canvasX) * channels; // Index in the canvas data // Copy RGBA values from the image to the canvas this.data[canvasIndex] = imgData[imgIndex]; // R this.data[canvasIndex + 1] = imgData[imgIndex + 1]; // G this.data[canvasIndex + 2] = imgData[imgIndex + 2]; // B - this.data[canvasIndex + 3] = imgData[imgIndex + 3]; // A + if (channels === 4) this.data[canvasIndex + 3] = imgData[imgIndex + 3]; // A } } } @@ -150,7 +150,8 @@ class OffscreenCanvasRenderingContext2D { * @returns the ImageData */ getImageData(x: number, y: number, width: number, height: number): ImageData { - const size = width * height * 4; + const channels = this.data.length / (this.width * this.height); + const size = width * height * channels; if (this.data.length === size) return { data: this.data.slice(0, size), width, height }; const imageData = new Uint8ClampedArray(size); @@ -158,14 +159,14 @@ class OffscreenCanvasRenderingContext2D { for (let col = 0; col < width; col++) { const canvasX = x + col; const canvasY = y + row; - const canvasIndex = (canvasY * this.width + canvasX) * 4; - const imageDataIndex = (row * width + col) * 4; + const canvasIndex = (canvasY * this.width + canvasX) * channels; + const imageDataIndex = (row * width + col) * channels; // Copy RGBA values from the canvas to the imageData imageData[imageDataIndex] = this.data[canvasIndex]; // R imageData[imageDataIndex + 1] = this.data[canvasIndex + 1]; // G imageData[imageDataIndex + 2] = this.data[canvasIndex + 2]; // B - imageData[imageDataIndex + 3] = this.data[canvasIndex + 3]; // A + if (channels === 4) imageData[imageDataIndex + 3] = this.data[canvasIndex + 3]; // A } } diff --git a/src/writers/index.ts b/src/writers/index.ts index 10e4369b..9060195c 100644 --- a/src/writers/index.ts +++ b/src/writers/index.ts @@ -4,23 +4,17 @@ export * from './pmtiles'; /** The defacto interface for all writers. */ export interface Writer { - write(data: Uint8Array, offset: number): Promise; - append(data: Uint8Array): Promise; - appendSync(data: Uint8Array): void; + write(data: Uint8Array, offset: number): Promise; + append(data: Uint8Array): Promise; + appendSync(data: Uint8Array): void; appendString(string: string): Promise; appendStringSync(string: string): void; } /** A base interface for all tile stores. */ export interface TileWriter { - writeTileXYZ(zoom: number, x: number, y: number, data: Uint8Array): Promise; - writeTileS2( - face: Face, - zoom: number, - x: number, - y: number, - data: Uint8Array, - ): Promise; + writeTileWM(zoom: number, x: number, y: number, data: Uint8Array): Promise; + writeTileS2(face: Face, zoom: number, x: number, y: number, data: Uint8Array): Promise; commit(metadata: Metadata): Promise; } @@ -33,7 +27,7 @@ export class BufferWriter implements Writer { * Append data to the buffer * @param data - the data to append */ - async append(data: Uint8Array): Promise { + async append(data: Uint8Array): Promise { for (let i = 0; i < data.byteLength; i++) this.#buffer.push(data[i]); await true; } @@ -43,14 +37,14 @@ export class BufferWriter implements Writer { * @param string - the string to append */ async appendString(string: string): Promise { - await this.append(this.#textEncoder.encode(string) as Uint8Array); + await this.append(this.#textEncoder.encode(string) as Uint8Array); } /** * Append data to the buffer synchronously * @param data - the data to append */ - appendSync(data: Uint8Array): void { + appendSync(data: Uint8Array): void { for (let i = 0; i < data.byteLength; i++) this.#buffer.push(data[i]); } @@ -59,7 +53,7 @@ export class BufferWriter implements Writer { * @param string - the string to append */ appendStringSync(string: string): void { - this.appendSync(this.#textEncoder.encode(string) as Uint8Array); + this.appendSync(this.#textEncoder.encode(string) as Uint8Array); } /** @@ -67,7 +61,7 @@ export class BufferWriter implements Writer { * @param data - the data to write * @param offset - where in the buffer to start */ - async write(data: Uint8Array, offset: number): Promise { + async write(data: Uint8Array, offset: number): Promise { for (let i = 0; i < data.byteLength; i++) { this.#buffer[offset + i] = data[i]; } @@ -75,7 +69,7 @@ export class BufferWriter implements Writer { } /** @returns - the buffer */ - commit(): Uint8Array { + commit(): Uint8Array { return new Uint8Array(this.#buffer); } } diff --git a/src/writers/pmtiles/pmtiles.ts b/src/writers/pmtiles/pmtiles.ts index bb032982..0da00275 100644 --- a/src/writers/pmtiles/pmtiles.ts +++ b/src/writers/pmtiles/pmtiles.ts @@ -4,10 +4,11 @@ import { writeVarint } from './varint'; import type { Entry, Header } from '../../readers/pmtiles'; /** + * Create raw header bytes from a Header object. * @param header - the header object * @returns the raw header bytes */ -export function headerToBytes(header: Header): Uint8Array { +export function headerToBytes(header: Header): Uint8Array { const dv = new DataView(new ArrayBuffer(HEADER_SIZE_BYTES)); dv.setUint16(0, 0x4d50, true); dv.setUint8(7, header.specVersion); @@ -33,10 +34,11 @@ export function headerToBytes(header: Header): Uint8Array { } /** + * Serialize a directory of entires into a buffer * @param entries - the directory entries * @returns - the serialized directory */ -export function serializeDir(entries: Entry[]): Uint8Array { +export function serializeDir(entries: Entry[]): Uint8Array { const data = { buf: new Uint8Array(0), pos: 0 }; writeVarint(entries.length, data); diff --git a/src/writers/pmtiles/s2pmtiles.ts b/src/writers/pmtiles/s2pmtiles.ts index f47c003c..99539277 100644 --- a/src/writers/pmtiles/s2pmtiles.ts +++ b/src/writers/pmtiles/s2pmtiles.ts @@ -4,11 +4,12 @@ import { headerToBytes, setUint64 } from './pmtiles'; import type { S2Header } from '../../readers/pmtiles'; /** + * Create raw header bytes from an S2Header object. * @param header - the header object * @returns the raw header bytes */ -export function s2HeaderToBytes(header: S2Header): Uint8Array { - const defaultHeader: Uint8Array = headerToBytes(header); +export function s2HeaderToBytes(header: S2Header): Uint8Array { + const defaultHeader = headerToBytes(header); const base = new Uint8Array(S2_HEADER_SIZE_BYTES); base.set(defaultHeader, 0); const dv = new DataView(base.buffer); diff --git a/src/writers/pmtiles/writer.ts b/src/writers/pmtiles/writer.ts index c15c9c2f..ecd2ff72 100644 --- a/src/writers/pmtiles/writer.ts +++ b/src/writers/pmtiles/writer.ts @@ -1,4 +1,3 @@ -import { concatUint8Arrays } from '../../util'; import { s2HeaderToBytes } from './s2pmtiles'; import { Compression, @@ -7,13 +6,58 @@ import { S2_ROOT_SIZE, zxyToTileID, } from '../../readers/pmtiles'; +import { compressStream, concatUint8Arrays } from '../../util'; import { headerToBytes, serializeDir } from './pmtiles'; import type { Entry, Header, S2Entries, S2Header, TileType } from '../../readers/pmtiles'; import type { Face, Metadata } from 's2-tilejson'; import type { TileWriter, Writer } from '..'; -/** Write a PMTiles file. */ +/** + * # S2 PMTiles Writer + * + * ## About + * Writes data via the [S2-PMTiles specification](https://github.com/Open-S2/s2-pmtiles/blob/master/s2-pmtiles-spec/1.0.0/README.md). + * + * A Modified TypeScript implementation of the [PMTiles](https://github.com/protomaps/PMTiles) library. It is backwards compatible but + * offers support for the S2 Projection. + * + * ## Usage + * + * ### Browser Compatible + * ```typescript + * import { TileType, BufferWriter, S2PMTilesWriter, Compression } from 's2-tools'; + * + * import type { Metadata } from 's2-tools'; + * + * // Setup the writers + * const bufWriter = new BufferWriter(); + * const writer = new S2PMTilesWriter(bufWriter, TileType.Unknown, Compression.Gzip); + * // example data + * const txtEncoder = new TextEncoder(); + * const str = 'hello world'; + * const uint8 = txtEncoder.encode(str); + * const str2 = 'hello world 2'; + * const uint8_2 = txtEncoder.encode(str2); + * // write data in tile + * await writer.writeTileWM(0, 0, 0, uint8); + * await writer.writeTileWM(1, 0, 1, uint8); + * await writer.writeTileWM(5, 2, 9, uint8_2); + * // finish + * await writer.commit({ metadata: true } as unknown as Metadata); + * // Get the result Uint8Array + * const resultData = bufWriter.commit(); + * ``` + * + * ### Node/Deno/Bun using the filesystem + * ```typescript + * import { S2PMTilesWriter, TileType } from 's2-tools'; + * import { FileWriter } from 's2-tools/file'; + * + * const writer = new S2PMTilesWriter(new FileWriter('./output.pmtiles'), TileType.Pbf); + * // SAME AS ABOVE + * ``` + */ export class S2PMTilesWriter implements TileWriter { #tileEntries: Entry[] = []; #s2tileEntries: S2Entries = { 0: [], 1: [], 2: [], 3: [], 4: [], 5: [] }; @@ -42,12 +86,7 @@ export class S2PMTilesWriter implements TileWriter { * @param y - the tile Y coordinate * @param data - the tile data to store */ - async writeTileXYZ( - zoom: number, - x: number, - y: number, - data: Uint8Array, - ): Promise { + async writeTileWM(zoom: number, x: number, y: number, data: Uint8Array): Promise { this.#minZoom = Math.min(this.#minZoom, zoom); this.#maxZoom = Math.max(this.#maxZoom, zoom); const tileID = zxyToTileID(zoom, x, y); @@ -67,7 +106,7 @@ export class S2PMTilesWriter implements TileWriter { zoom: number, x: number, y: number, - data: Uint8Array, + data: Uint8Array, ): Promise { this.#minZoom = Math.min(this.#minZoom, zoom); this.#maxZoom = Math.max(this.#maxZoom, zoom); @@ -81,7 +120,7 @@ export class S2PMTilesWriter implements TileWriter { * @param data - the tile data * @param face - If it exists, then we are storing S2 data */ - async writeTile(tileID: number, data: Uint8Array, face?: Face): Promise { + async writeTile(tileID: number, data: Uint8Array, face?: Face): Promise { data = await compress(data, this.compression); const length = data.length; const tileEntries = face !== undefined ? this.#s2tileEntries[face] : this.#tileEntries; @@ -116,7 +155,11 @@ export class S2PMTilesWriter implements TileWriter { tileEntries.sort((a, b) => a.tileID - b.tileID); // build metadata const metaBuffer = Buffer.from(JSON.stringify(metadata)); - let metauint8 = new Uint8Array(metaBuffer.buffer, metaBuffer.byteOffset, metaBuffer.byteLength); + let metauint8: Uint8Array = new Uint8Array( + metaBuffer.buffer, + metaBuffer.byteOffset, + metaBuffer.byteLength, + ); metauint8 = await compress(metauint8, this.compression); // optimize directories @@ -186,7 +229,11 @@ export class S2PMTilesWriter implements TileWriter { tileEntries5.sort((a, b) => a.tileID - b.tileID); // build metadata const metaBuffer = Buffer.from(JSON.stringify(metadata)); - let metauint8 = new Uint8Array(metaBuffer.buffer, metaBuffer.byteOffset, metaBuffer.byteLength); + let metauint8: Uint8Array = new Uint8Array( + metaBuffer.buffer, + metaBuffer.byteOffset, + metaBuffer.byteLength, + ); metauint8 = await compress(metauint8, this.compression); // optimize directories @@ -320,14 +367,15 @@ export class S2PMTilesWriter implements TileWriter { /** The result of an optimized directory computation */ interface OptimizedDirectory { /** The root directory bytes */ - rootBytes: Uint8Array; + rootBytes: Uint8Array; /** The leaf directories bytes */ - leavesBytes: Uint8Array; + leavesBytes: Uint8Array; /** The number of leaf directories */ numLeaves: number; } /** + * Builds the root and leaf directories * @param entries - the tile entries * @param leafSize - the max leaf size * @param compression - the compression @@ -339,7 +387,7 @@ async function buildRootsLeaves( compression: Compression, ): Promise { const rootEntries: Entry[] = []; - let leavesBytes = new Uint8Array(0); + let leavesBytes: Uint8Array = new Uint8Array(0); let numLeaves = 0; let i = 0; @@ -364,6 +412,7 @@ async function buildRootsLeaves( } /** + * Optimizes the directories * @param entries - the tile entries * @param targetRootLength - the max leaf size * @param compression - the compression @@ -386,46 +435,14 @@ async function optimizeDirectories( } } -// /** -// * @param a - the first array -// * @param b - the second array -// * @returns - the combined array of the two starting with "a" -// */ -// function concatUint8Arrays(a: Uint8Array, b: Uint8Array): Uint8Array { -// const result = new Uint8Array(a.length + b.length); -// result.set(a, 0); -// result.set(b, a.length); -// return result; -// } - /** + * Compresses a Uint8Array if a compression method is specified * @param input - the input Uint8Array * @param compression - the compression * @returns - the compressed Uint8Array or the original if compression is None */ -async function compress( - input: Uint8Array, - compression: Compression, -): Promise> { +async function compress(input: Uint8Array, compression: Compression): Promise { if (compression === Compression.None) return input; - else if (compression === Compression.Gzip) return await compressGzip(input); + else if (compression === Compression.Gzip) return await compressStream(input); else throw new Error(`Unsupported compression: ${compression}`); } - -/** - * @param input - the input Uint8Array - * @returns - the compressed Uint8Array - */ -async function compressGzip(input: Uint8Array): Promise> { - // Convert the string to a byte stream. - const stream = new Blob([input]).stream(); - - // Create a compressed stream. - const compressedStream = stream.pipeThrough(new CompressionStream('gzip')); - - // Read all the bytes from this stream. - const chunks = []; - for await (const chunk of compressedStream) chunks.push(chunk); - - return await concatUint8Arrays(chunks); -} diff --git a/src/writers/tile.ts b/src/writers/tile.ts index df33c60c..e9b1c313 100644 --- a/src/writers/tile.ts +++ b/src/writers/tile.ts @@ -26,7 +26,7 @@ export class FileTileWriter implements TileWriter { * @param y - the tile Y coordinate * @param data - the tile data to store */ - async writeTileXYZ(zoom: number, x: number, y: number, data: Uint8Array): Promise { + async writeTileWM(zoom: number, x: number, y: number, data: Uint8Array): Promise { // if folders don't exist, create it const folders = `${this.path}/${zoom}/${x}`; if (!existsSync(folders)) await mkdir(folders, { recursive: true }); diff --git a/tests/geometry/s1/angle.test.ts b/tests/geometry/s1/angle.test.ts index c71cfa7a..05114bd9 100644 --- a/tests/geometry/s1/angle.test.ts +++ b/tests/geometry/s1/angle.test.ts @@ -3,7 +3,9 @@ import { e6, e7, fromDegrees, + fromKM, fromLonLat, + fromMeters, fromS2Points, normalize, toDegrees, @@ -47,6 +49,14 @@ test('fromDegrees', () => { expect(fromDegrees(360)).toBe(6.283185307179586); }); +test('fromKM', () => { + expect(fromKM(0)).toBe(0); + expect(fromKM(1)).toBe(0.00015696101377226163); + expect(fromKM(10)).toBe(0.0015696101377226162); + expect(fromKM(100)).toBe(0.015696101377226164); + expect(fromKM(1000)).toBe(0.15696101377226163); +}); + test('fromLonLat', () => { expect(fromLonLat([0, 0], [0, 0])).toBe(0); expect(fromLonLat([1, 0], [0, 0])).toBe(0.017453292519943295); @@ -54,6 +64,14 @@ test('fromLonLat', () => { expect(fromLonLat([45, 20], [60, 40])).toBe(0.4148806056779849); }); +test('fromMeters', () => { + expect(fromMeters(0)).toBe(0); + expect(fromMeters(1)).toBe(1.5696101377226164e-7); + expect(fromMeters(10)).toBe(0.0000015696101377226163); + expect(fromMeters(100)).toBe(0.000015696101377226163); + expect(fromMeters(1000)).toBe(0.00015696101377226163); +}); + test('fromS2Points', () => { expect(fromS2Points(pointFromLonLat(0, 0), pointFromLonLat(0, 0))).toBe(0); expect(fromS2Points(pointFromLonLat(1, 0), pointFromLonLat(0, 0))).toBe(0.017453292519943295); diff --git a/tests/geometry/s1/chordAngle.test.ts b/tests/geometry/s1/chordAngle.test.ts index eac675ca..dbfd8a84 100644 --- a/tests/geometry/s1/chordAngle.test.ts +++ b/tests/geometry/s1/chordAngle.test.ts @@ -5,7 +5,9 @@ import { chordAngleTan, fastUpperBoundFrom, fromAngle, + fromKM, fromLength2, + fromMeters, fromS2Points, isSpecial, negativeAngle, @@ -70,6 +72,12 @@ test('fromAngle', () => { expect(fromAngle(Infinity)).toEqual(Infinity); }); +test('fromKM', () => { + expect(fromKM(0)).toEqual(0); + expect(fromKM(6371.0088)).toEqual(0.9193953882637206); + expect(fromKM(6371008.8)).toEqual(4); +}); + test('fromLength2', () => { expect(fromLength2(0)).toEqual(0); expect(fromLength2(1)).toEqual(1); @@ -79,6 +87,12 @@ test('fromLength2', () => { expect(fromLength2(5)).toEqual(4); }); +test('fromMeters', () => { + expect(fromMeters(0)).toEqual(0); + expect(fromMeters(6371.0088)).toEqual(9.999999166666694e-7); + expect(fromMeters(6371008.8)).toEqual(0.9193953882637206); +}); + test('fromS2Points', () => { expect(fromS2Points([0, 0, 0], [0, 0, 0])).toEqual(0); expect(fromS2Points([0, 0, 0], [1, 0, 0])).toEqual(1); diff --git a/tests/geometry/clip.test.ts b/tests/geometry/tools/clip.test.ts similarity index 99% rename from tests/geometry/clip.test.ts rename to tests/geometry/tools/clip.test.ts index 3cf7e378..f18f1a9a 100644 --- a/tests/geometry/clip.test.ts +++ b/tests/geometry/tools/clip.test.ts @@ -1,6 +1,6 @@ -import { Tile } from '../../src/dataStructures'; -import { fromFace } from '../../src/geometry/id'; -import { clipLine, clipPoint, splitTile } from '../../src/geometry/tools/clip'; +import { Tile } from '../../../src/dataStructures'; +import { fromFace } from '../../../src/geometry/id'; +import { clipLine, clipPoint, splitTile } from '../../../src/geometry/tools/clip'; import { describe, expect, it, test } from 'bun:test'; import type { @@ -8,7 +8,7 @@ import type { VectorFeature, VectorLineString, VectorPointGeometry, -} from '../../src/geometry'; +} from '../../../src/geometry'; test('clipPoint', () => { const point: VectorPointGeometry = { diff --git a/tests/geometry/convert.test.ts b/tests/geometry/tools/convert.test.ts similarity index 99% rename from tests/geometry/convert.test.ts rename to tests/geometry/tools/convert.test.ts index ccddf58d..43e7558f 100644 --- a/tests/geometry/convert.test.ts +++ b/tests/geometry/tools/convert.test.ts @@ -1,4 +1,4 @@ -import { convert } from '../../src'; +import { convert } from '../../../src'; import { describe, expect, it } from 'bun:test'; import type { @@ -7,7 +7,7 @@ import type { S2Feature, S2FeatureCollection, VectorFeature, -} from '../../src/geometry'; +} from '../../../src/geometry'; // FeatureCollection | S2FeatureCollection | Feature | VectorFeature | S2Feature diff --git a/tests/geometry/tools/points.test.ts b/tests/geometry/tools/points.test.ts new file mode 100644 index 00000000..989e4409 --- /dev/null +++ b/tests/geometry/tools/points.test.ts @@ -0,0 +1,59 @@ +import { averageOfPoints, centerOfPoints } from '../../../src/geometry/tools/points'; +import { expect, test } from 'bun:test'; + +test('averageOfPoints', () => { + expect( + averageOfPoints([ + { x: 0, y: 0 }, + { x: 1, y: 1 }, + ]), + ).toEqual({ x: 0.5, y: 0.5 }); + expect( + averageOfPoints([ + { x: 0, y: 0, z: 0 }, + { x: 1, y: 1, z: 1 }, + ]), + ).toEqual({ x: 0.5, y: 0.5, z: 0.5 }); + expect(averageOfPoints([])).toEqual({ x: 0, y: 0 }); + expect( + averageOfPoints([ + { x: 0, y: 0, z: 0 }, + { x: 1, y: 1 }, + ]), + ).toEqual({ x: 0.5, y: 0.5, z: 0 }); + expect( + averageOfPoints([ + { x: 0, y: 0 }, + { x: 1, y: 1, z: 1 }, + ]), + ).toEqual({ x: 0.5, y: 0.5, z: 0.5 }); +}); + +test('centerOfPoints', () => { + expect( + centerOfPoints([ + { x: 0, y: 0 }, + { x: 1, y: 1 }, + ]), + ).toEqual({ x: 0.5, y: 0.5 }); + expect(centerOfPoints([{ x: 0, y: 0, z: 0 }])).toEqual({ x: 0, y: 0, z: 0 }); + expect( + centerOfPoints([ + { x: 0, y: 0, z: 0 }, + { x: 1, y: 1, z: 1 }, + ]), + ).toEqual({ x: 0.5, y: 0.5, z: 0.5 }); + expect( + centerOfPoints([ + { x: 0, y: 0 }, + { x: 1, y: 1, z: 1 }, + ]), + ).toEqual({ x: 0.5, y: 0.5, z: 1 }); + expect( + centerOfPoints([ + { x: 0, y: 0, z: 0 }, + { x: 1, y: 1 }, + ]), + ).toEqual({ x: 0.5, y: 0.5, z: 0 }); + expect(centerOfPoints([{ x: 0, y: 0 }])).toEqual({ x: 0, y: 0 }); +}); diff --git a/tests/geometry/tools/polys.test.ts b/tests/geometry/tools/polys.test.ts new file mode 100644 index 00000000..f33cdbbe --- /dev/null +++ b/tests/geometry/tools/polys.test.ts @@ -0,0 +1,71 @@ +import { expect, test } from 'bun:test'; +import { + pointInPolygon, + pointInPolygons, + polygonArea, + polygonsArea, +} from '../../../src/geometry/tools/polys'; + +test('pointInPolygon', () => { + const polygon = [ + [ + { x: 0, y: 0 }, + { x: 1, y: 0 }, + { x: 1, y: 1 }, + { x: 0, y: 1 }, + { x: 0, y: 0 }, + ], + ]; + expect(pointInPolygon({ x: 0, y: 0 }, polygon)).toEqual(true); + expect(pointInPolygon({ x: 0, y: 0 }, polygon, true)).toEqual(false); +}); + +test('pointInPolygons', () => { + const polygons = [ + [ + [ + { x: 0, y: 0 }, + { x: 1, y: 0 }, + { x: 1, y: 1 }, + { x: 0, y: 1 }, + { x: 0, y: 0 }, + ], + ], + ]; + expect(pointInPolygons({ x: 0, y: 0 }, polygons)).toEqual(true); + expect(pointInPolygons({ x: 0, y: 0 }, polygons, true)).toEqual(false); +}); + +test('polygonArea', () => { + const polygon = [ + [ + { x: 125, y: -15 }, + { x: 113, y: -22 }, + { x: 117, y: -37 }, + { x: 130, y: -33 }, + { x: 148, y: -39 }, + { x: 154, y: -27 }, + { x: 144, y: -15 }, + { x: 125, y: -15 }, + ], + ]; + expect(polygonArea(polygon)).toEqual(7748891609977.455); +}); + +test('polygonsArea', () => { + const polygons = [ + [ + [ + { x: 125, y: -15 }, + { x: 113, y: -22 }, + { x: 117, y: -37 }, + { x: 130, y: -33 }, + { x: 148, y: -39 }, + { x: 154, y: -27 }, + { x: 144, y: -15 }, + { x: 125, y: -15 }, + ], + ], + ]; + expect(polygonsArea(polygons)).toEqual(7748891609977.455); +}); diff --git a/tests/geometry/simplify.test.ts b/tests/geometry/tools/simplify.test.ts similarity index 98% rename from tests/geometry/simplify.test.ts rename to tests/geometry/tools/simplify.test.ts index 57e036f4..25df58d1 100644 --- a/tests/geometry/simplify.test.ts +++ b/tests/geometry/tools/simplify.test.ts @@ -1,4 +1,4 @@ -import { buildSqDists, simplify } from '../../src'; +import { buildSqDists, simplify } from '../../../src'; import { expect, test } from 'bun:test'; import type { @@ -6,7 +6,7 @@ import type { VectorMultiLineStringGeometry, VectorMultiPolygonGeometry, VectorPolygonGeometry, -} from '../../src/geometry'; +} from '../../../src/geometry'; const SIMPLIFY_MAXZOOM = 16; diff --git a/tests/proj4/mgrs.test.ts b/tests/proj4/mgrs.test.ts index b040d21c..d23474ae 100644 --- a/tests/proj4/mgrs.test.ts +++ b/tests/proj4/mgrs.test.ts @@ -1,9 +1,9 @@ import { describe, expect, it } from 'bun:test'; -import { forward, getLetterDesignator, inverse, toPoint } from '../../src/proj4/mgrs'; +import { mgrsForward, mgrsGetLetterDesignator, mgrsInverse, mgrsToPoint } from '../../src'; describe('First MGRS set', () => { const mgrsStr = '33UXP04'; - const point = toPoint(mgrsStr); + const point = mgrsToPoint(mgrsStr); if (point === undefined) throw new Error('Invalid MGRS string'); it('Longitude of point from MGRS correct.', () => { expect(point.x).toBeCloseTo(16.4145, 6); @@ -12,14 +12,14 @@ describe('First MGRS set', () => { expect(point.y).toBeCloseTo(48.24949, 6); }); it('MGRS reference with highest accuracy correct.', () => { - expect(forward(point)).toEqual('33UXP0500444997'); + expect(mgrsForward(point)).toEqual('33UXP0500444997'); }); it('MGRS reference with 1-digit accuracy correct.', () => { - expect(forward(point, 1)).toEqual(mgrsStr); + expect(mgrsForward(point, 1)).toEqual(mgrsStr); }); it('MGRS reference with 0-digit accuracy correct.', () => { - expect(forward(point, 0)).toEqual('33UXP'); - expect(inverse('33UXP')).toEqual([ + expect(mgrsForward(point, 0)).toEqual('33UXP'); + expect(mgrsInverse('33UXP')).toEqual([ 16.33659097483748, 47.84556125140087, 16.33659097483748, 47.84556125140087, ]); }); @@ -27,7 +27,7 @@ describe('First MGRS set', () => { describe('Second MGRS set', () => { const mgrsStr = '24XWT783908'; // near UTM zone border, so there are two ways to reference this - const point = toPoint(mgrsStr); + const point = mgrsToPoint(mgrsStr); if (point === undefined) throw new Error('Invalid MGRS string'); it('Longitude of point from MGRS correct.', () => { expect(point.x).toBeCloseTo(-32.66433, 5); @@ -36,16 +36,16 @@ describe('Second MGRS set', () => { expect(point.y).toBeCloseTo(83.62778, 5); }); it('MGRS reference with 3-digit accuracy correct.', () => { - expect(forward(point, 3)).toEqual('25XEN041865'); + expect(mgrsForward(point, 3)).toEqual('25XEN041865'); }); it('MGRS reference with 5-digit accuracy, northing all zeros', () => { - expect(forward({ x: 0, y: 0 }, 5)).toEqual('31NAA6602100000'); + expect(mgrsForward({ x: 0, y: 0 }, 5)).toEqual('31NAA6602100000'); }); it('MGRS reference with 5-digit accuracy, northing one digit', () => { - expect(forward({ x: 0, y: 0.00001 }, 5)).toEqual('31NAA6602100001'); + expect(mgrsForward({ x: 0, y: 0.00001 }, 5)).toEqual('31NAA6602100001'); }); it('MGRS reference with 0-digit accuracy correct.', () => { - expect(forward(point, 0)).toEqual('25XEN'); + expect(mgrsForward(point, 0)).toEqual('25XEN'); }); }); @@ -53,45 +53,45 @@ describe('third mgrs set', () => { const mgrsStr = '11SPA7234911844'; const point = { x: -115.0820944, y: 36.2361322 }; it('MGRS reference with highest accuracy correct.', () => { - expect(forward(point)).toEqual(mgrsStr); - expect(inverse(mgrsStr)).toEqual([ + expect(mgrsForward(point)).toEqual(mgrsStr); + expect(mgrsInverse(mgrsStr)).toEqual([ -115.08209766323476, 36.236123461597515, -115.08208632067898, 36.236132293763625, ]); }); it('MGRS reference with 0-digit accuracy correct.', () => { - expect(forward(point, 0)).toEqual('11SPA'); + expect(mgrsForward(point, 0)).toEqual('11SPA'); }); }); describe('lots of various forwards and backwards', () => { - let p = forward({ x: 0, y: 0 }); + let p = mgrsForward({ x: 0, y: 0 }); expect(p).toEqual('31NAA6602100000'); - expect(toPoint(p)).toEqual({ x: 5.100560029891454e-7, y: 0.0000045174155428847555 }); - p = forward({ x: -180, y: 0 }); + expect(mgrsToPoint(p)).toEqual({ x: 5.100560029891454e-7, y: 0.0000045174155428847555 }); + p = mgrsForward({ x: -180, y: 0 }); expect(p).toEqual('1NAA6602100000'); - expect(toPoint(p)).toEqual({ x: -179.999999489944, y: 0.0000045174155428847555 }); - p = forward({ x: 180, y: 0 }); + expect(mgrsToPoint(p)).toEqual({ x: -179.999999489944, y: 0.0000045174155428847555 }); + p = mgrsForward({ x: 180, y: 0 }); expect(p).toEqual('60NZF3397800000'); - expect(toPoint(p)).toEqual({ x: 179.999999489944, y: 0.0000045174155055519 }); - p = forward({ x: 0, y: 84 }); + expect(mgrsToPoint(p)).toEqual({ x: 179.999999489944, y: 0.0000045174155055519 }); + p = mgrsForward({ x: 0, y: 84 }); expect(p).toEqual('31XDP6500529005'); - expect(toPoint(p)).toEqual({ x: 0.000011844240836555997, y: 84.00000291206752 }); - p = forward({ x: 0, y: -80 }); + expect(mgrsToPoint(p)).toEqual({ x: 0.000011844240836555997, y: 84.00000291206752 }); + p = mgrsForward({ x: 0, y: -80 }); expect(p).toEqual('31CDM4186716915'); - expect(toPoint(p)).toEqual({ x: -0.00001347072431578944, y: -79.99999578854278 }); - p = forward({ x: 24, y: 73 }); + expect(mgrsToPoint(p)).toEqual({ x: -0.00001347072431578944, y: -79.99999578854278 }); + p = mgrsForward({ x: 24, y: 73 }); expect(p).toEqual('35XMB0213502930'); - expect(toPoint(p)).toEqual({ x: 23.99998502461724, y: 72.999999080815 }); - p = forward({ x: 34, y: 73 }); + expect(mgrsToPoint(p)).toEqual({ x: 23.99998502461724, y: 72.999999080815 }); + p = mgrsForward({ x: 34, y: 73 }); expect(p).toEqual('37XCB3700307286'); - expect(toPoint(p)).toEqual({ x: 34.000006934267915, y: 73.00000314488452 }); + expect(mgrsToPoint(p)).toEqual({ x: 34.000006934267915, y: 73.00000314488452 }); }); describe('build forward and toPoint at increments', () => { for (let x = -180; x <= 180; x += 5) { for (let y = -80; y <= 84; y += 4) { - const p = forward({ x, y }); - const q = toPoint(p); + const p = mgrsForward({ x, y }); + const q = mgrsToPoint(p); if (q === undefined) throw new Error(`failed to convert ${p} to point`); expect(q.x).toBeCloseTo(x, 3); expect(q.y).toBeCloseTo(y, 3); @@ -102,8 +102,8 @@ describe('build forward and toPoint at increments', () => { describe('data validation', () => { describe('toPoint function', () => { it('toPoint should return the same result whether or not spaces are included in the MGRS String', () => { - const { x: lon1, y: lat1 } = toPoint('4QFJ 12345 67890') ?? { x: -1, y: -1 }; - const { x: lon2, y: lat2 } = toPoint('4QFJ1234567890') ?? { x: 1, y: 1 }; + const { x: lon1, y: lat1 } = mgrsToPoint('4QFJ 12345 67890') ?? { x: -1, y: -1 }; + const { x: lon2, y: lat2 } = mgrsToPoint('4QFJ1234567890') ?? { x: 1, y: 1 }; expect(lat1).toEqual(lat2); expect(lon1).toEqual(lon2); }); @@ -111,24 +111,24 @@ describe('data validation', () => { describe('forward function', () => { it('forward throws an error when longitude is outside bounds', () => { expect(() => { - forward({ x: 200, y: 0 }); + mgrsForward({ x: 200, y: 0 }); }).toThrowError('forward received an invalid longitude of 200'); }); it('forward throws an error when latitude is outside bounds', () => { expect(() => { - forward({ x: 90, y: 180 }); + mgrsForward({ x: 90, y: 180 }); }).toThrowError('forward received an invalid latitude of 180'); }); it('forward throws an error when latitude is near the north pole', () => { expect(() => { - forward({ x: 45, y: 88 }); + mgrsForward({ x: 45, y: 88 }); }).toThrowError( 'forward received a latitude of 88, but this library does not support conversions of points in polar regions below 80°S and above 84°N', ); }); it('forward throws an error when latitude is near the south pole', () => { expect(() => { - forward({ x: 45, y: -88 }); + mgrsForward({ x: 45, y: -88 }); }).toThrowError( 'forward received a latitude of -88, but this library does not support conversions of points in polar regions below 80°S and above 84°N', ); @@ -137,7 +137,7 @@ describe('data validation', () => { describe('getLetterDesignator', () => { it('should return Z when latitude band is outside latitude handled by library', () => { const latitude = -83.3026329741; - const letter = getLetterDesignator(latitude); + const letter = mgrsGetLetterDesignator(latitude); expect(letter).toEqual('Z'); }); }); @@ -166,7 +166,7 @@ describe('test against all data from mgrsToGeo_WE.txt', async (): Promise // some polar regions are not supported: if (['A', 'B', 'Y', 'Z'].includes(mgrs[0])) return; it(`should match ${mgrs}`, () => { - expect(forward({ x: longitude, y: latitude })).toEqual(mgrs); + expect(mgrsForward({ x: longitude, y: latitude })).toEqual(mgrs); }); } }); diff --git a/tests/readers/csv/index.test.ts b/tests/readers/csv/index.test.ts index 2a96260e..8d583fd1 100644 --- a/tests/readers/csv/index.test.ts +++ b/tests/readers/csv/index.test.ts @@ -4,7 +4,7 @@ import { expect, test } from 'bun:test'; test('CSVReader - basic', async () => { const file = await Bun.file(`${__dirname}/fixtures/basic.csv`).arrayBuffer(); - const buffer = Buffer.from(file); + const buffer = Buffer.from(file) as Buffer; const reader = new BufferReader(buffer.buffer, 0, buffer.byteLength); const csvReader = new CSVReader(reader); const data = await Array.fromAsync(csvReader); diff --git a/tests/readers/geotiff/proj4.test.ts b/tests/readers/geotiff/proj4.test.ts index 0d0c81c8..d65d1cb3 100644 --- a/tests/readers/geotiff/proj4.test.ts +++ b/tests/readers/geotiff/proj4.test.ts @@ -1,15 +1,15 @@ import { FileReader } from '../../../src/file'; -import { GeoTIFFReader } from '../../../src/readers/geotiff'; +import { ALL_DEFINITIONS, EPSG_CODES, GeoTIFFReader } from '../../../src'; import { expect, test } from 'bun:test'; // import { fromArrayBuffer } from '../../../geotiff/src/geotiff'; import { fromArrayBuffer } from 'geotiff'; -import type { ArrayTypes } from '../../../src/readers/geotiff'; +import type { ArrayTypes } from '../../../src'; test('utm.tif test', async (): Promise => { const fileReader = new FileReader(`${__dirname}/fixtures/utm.tif`); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); const raster = await image.rasterData(); @@ -47,7 +47,7 @@ test('utm.tif test', async (): Promise => { test('pixel_is_point_wgs84.tif test', async (): Promise => { const fileReader = new FileReader(`${__dirname}/fixtures/projections/pixel_is_point_wgs84.tif`); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); const raster = await image.rasterData(); @@ -101,7 +101,7 @@ test('pixel_is_point_wgs84.tif test', async (): Promise => { test('albers_equal_area.tif test', async (): Promise => { // actual data const fileReader = new FileReader(`${__dirname}/fixtures/projections/albers_equal_area.tif`); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -143,7 +143,7 @@ test('albers_equal_area.tif test', async (): Promise => { test('mercator1sp.tif test', async (): Promise => { // actual data const fileReader = new FileReader(`${__dirname}/fixtures/projections/mercator1sp.tif`); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -186,7 +186,7 @@ test('byte.tif test', async (): Promise => { // actual data const fileReader = new FileReader(`${__dirname}/fixtures/projections/byte.tif`); // const ntv2 = new MMapReader(`${__dirname}/fixtures/ntv2_0.gsb`); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); // geotiffReader.addGridReader('NTv2_0.gsb', ntv2); const image = geotiffReader.getImage(); // compare data @@ -209,7 +209,7 @@ test('byte.tif test', async (): Promise => { test('byte_v11.tif test', async (): Promise => { // actual data const fileReader = new FileReader(`${__dirname}/fixtures/projections/byte_v11.tif`); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -231,7 +231,7 @@ test('byte_v11.tif test', async (): Promise => { test('cassini_soldner.tif test', async (): Promise => { // actual data const fileReader = new FileReader(`${__dirname}/fixtures/projections/cassini_soldner.tif`); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -253,7 +253,7 @@ test('cassini_soldner.tif test', async (): Promise => { test('epsg_27563_allgeokeys.tif test', async (): Promise => { // actual data const fileReader = new FileReader(`${__dirname}/fixtures/projections/epsg_27563_allgeokeys.tif`); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -285,7 +285,7 @@ test('epsg_27563_only_pcs_code.tif test', async (): Promise => { const fileReader = new FileReader( `${__dirname}/fixtures/projections/epsg_27563_only_pcs_code.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -317,7 +317,7 @@ test('equidistant_cylindrical.tif test', async (): Promise => { const fileReader = new FileReader( `${__dirname}/fixtures/projections/equidistant_cylindrical.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -341,7 +341,7 @@ test('GeogAngularUnitsGeoKey_9114.tif test', async (): Promise => { const fileReader = new FileReader( `${__dirname}/fixtures/projections/GeogAngularUnitsGeoKey_9114.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -364,7 +364,7 @@ test('GeogGeodeticDatumGeoKey.tif test', async (): Promise => { const fileReader = new FileReader( `${__dirname}/fixtures/projections/GeogGeodeticDatumGeoKey.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -385,7 +385,7 @@ test('GeogPrimeMeridianGeoKey.tif test', async (): Promise => { const fileReader = new FileReader( `${__dirname}/fixtures/projections/GeogPrimeMeridianGeoKey.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -406,7 +406,7 @@ test('hotine_oblique_mercator_variant_a.tif test', async (): Promise => { const fileReader = new FileReader( `${__dirname}/fixtures/projections/hotine_oblique_mercator_variant_a.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -430,7 +430,7 @@ test('hotine_oblique_mercator_variant_a.tif test', async (): Promise => { test('polyconic.tif test', async (): Promise => { // actual data const fileReader = new FileReader(`${__dirname}/fixtures/projections/polyconic.tif`); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -454,7 +454,7 @@ test('ProjectedCSTypeGeoKey_2046_transverse_mercator_south_oriented.tif test', a const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_2046_transverse_mercator_south_oriented.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -480,7 +480,7 @@ test('ProjectedCSTypeGeoKey_3032_polar_stereographic_variant_b.tif test', async const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_3032_polar_stereographic_variant_b.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -506,7 +506,7 @@ test('ProjectedCSTypeGeoKey_3035_lambert_azimuthal_equal_area.tif test', async ( const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_3035_lambert_azimuthal_equal_area.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -532,7 +532,7 @@ test('ProjectedCSTypeGeoKey_3083_albers_equal_area.tif test', async (): Promise< const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_3083_albers_equal_area.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -558,7 +558,7 @@ test('ProjectedCSTypeGeoKey_3410_lambert_cylindrical_equal_area.tif test', async const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_3410_lambert_cylindrical_equal_area.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -584,7 +584,7 @@ test('ProjectedCSTypeGeoKey_3812_lcc2sp.tif test', async (): Promise => { const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_3812_lcc2sp.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -610,7 +610,7 @@ test('ProjectedCSTypeGeoKey_3814_transverse_mercator.tif test', async (): Promis const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_3814_transverse_mercator.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -636,7 +636,7 @@ test('ProjectedCSTypeGeoKey_4087_equidistant_cylindrical.tif test', async (): Pr const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_4087_equidistant_cylindrical.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -662,7 +662,7 @@ test('ProjectedCSTypeGeoKey_5329_mercator1sp.tif test', async (): Promise const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_5329_mercator1sp.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -688,7 +688,7 @@ test('ProjectedCSTypeGeoKey_5456_lcc1sp.tif test', async (): Promise => { const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_5456_lcc1sp.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -714,7 +714,7 @@ test('ProjectedCSTypeGeoKey_5482_polar_stereographic_variant_a.tif test', async const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_5482_polar_stereographic_variant_a.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -740,7 +740,7 @@ test('ProjectedCSTypeGeoKey_5588_oblique_stereographic.tif test', async (): Prom const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_5588_oblique_stereographic.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -766,7 +766,7 @@ test('ProjectedCSTypeGeoKey_5641_mercator2sp.tif test', async (): Promise const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_5641_mercator2sp.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -792,7 +792,7 @@ test('ProjectedCSTypeGeoKey_6808_hotine_oblique_mercator_variant_a.tif test', as const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_6808_hotine_oblique_mercator_variant_a.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -820,7 +820,7 @@ test('ProjectedCSTypeGeoKey_8065_hotine_oblique_mercator_variant_b.tif test', as const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_8065_hotine_oblique_mercator_variant_b.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -847,7 +847,7 @@ test.skip('ProjectedCSTypeGeoKey_8441_oblique_mercator_laborde.tif test', async const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_8441_oblique_mercator_laborde.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -873,7 +873,7 @@ test('ProjectedCSTypeGeoKey_27200_new_zealand_mapping_grid.tif test', async (): const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_27200_new_zealand_mapping_grid.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -899,7 +899,7 @@ test('ProjectedCSTypeGeoKey_28191_cassini_soldner.tif test', async (): Promise = const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjectedCSTypeGeoKey_29101_polyconic.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -951,7 +951,7 @@ test('ProjLinearUnitsGeoKey_9036.tif test', async (): Promise => { const fileReader = new FileReader( `${__dirname}/fixtures/projections/ProjLinearUnitsGeoKey_9036.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -977,7 +977,7 @@ test('transverse_mercator_south_oriented.tif test', async (): Promise => { const fileReader = new FileReader( `${__dirname}/fixtures/projections/transverse_mercator_south_oriented.tif`, ); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( @@ -1001,7 +1001,7 @@ test('transverse_mercator_south_oriented.tif test', async (): Promise => { test('transverse_mercator.tif test', async (): Promise => { // actual data const fileReader = new FileReader(`${__dirname}/fixtures/projections/transverse_mercator.tif`); - const geotiffReader = new GeoTIFFReader(fileReader); + const geotiffReader = new GeoTIFFReader(fileReader, ALL_DEFINITIONS, EPSG_CODES); const image = geotiffReader.getImage(); // compare data const cmpTiff = await fromArrayBuffer( diff --git a/tests/readers/image/jpeg/index.test.ts b/tests/readers/image/jpeg/index.test.ts index 8db89aae..640ec0e1 100644 --- a/tests/readers/image/jpeg/index.test.ts +++ b/tests/readers/image/jpeg/index.test.ts @@ -1,4 +1,4 @@ -import { decode, jpegDecoder } from '../../../../src'; +import { decodeJpegData, jpegDecoder } from '../../../../src'; import { expect, test } from 'bun:test'; const SUPER_LARGE_JPEG_BASE64 = '/9j/wfFRBf//BdgC/9p/2P/E4d4='; @@ -15,7 +15,7 @@ const testFunc = process.env.FAST_TESTS_ONLY !== undefined ? test.skip : test; * @param name - the name of the fixture * @returns the contents of the fixture as an array buffer */ -async function fixture(name: string): Promise { +async function fixture(name: string): Promise { return await Bun.file(`${__dirname}/fixtures/${name}`).arrayBuffer(); } @@ -29,7 +29,7 @@ test('reads image with a bad e1 marker not preceeded by ff', async () => { test('decodes a JPEG', async () => { const jpegData = await fixture('grumpycat.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); expect(rawImageData.width).toEqual(320); expect(rawImageData.height).toEqual(180); const expected = new Uint8Array(await fixture('grumpycat.rgba')); @@ -38,30 +38,30 @@ test('decodes a JPEG', async () => { test('decodes a JPEG with fill bytes', async () => { const jpegData = await fixture('fillbytes.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); expect(rawImageData.width).toEqual(704); expect(rawImageData.height).toEqual(576); }); test('decodes a JPEG with RST intervals', async () => { const jpegData = await fixture('redbox-with-rst.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); const expected = await fixture('redbox.jpg'); - const rawExpectedImageData = decode(expected); + const rawExpectedImageData = decodeJpegData(expected); expect(rawImageData.data).toEqual(rawExpectedImageData.data); }); test('decodes a JPEG with trailing bytes', async () => { const jpegData = await fixture('redbox-with-trailing-bytes.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); const expected = await fixture('redbox.jpg'); - const rawExpectedImageData = decode(expected); + const rawExpectedImageData = decodeJpegData(expected); expect(rawImageData.data).toEqual(rawExpectedImageData.data); }); test('decodes a grayscale JPEG', async () => { const jpegData = await fixture('apsara.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); expect(rawImageData.width).toEqual(580); expect(rawImageData.height).toEqual(599); expect(rawImageData.comments).toEqual([ @@ -73,7 +73,7 @@ test('decodes a grayscale JPEG', async () => { testFunc('decodes a 32-bit TrueColor RGB image', async () => { const jpegData = await fixture('truecolor.jpg'); - const rawImageData = decode(jpegData, { colorTransform: false }); + const rawImageData = decodeJpegData(jpegData, { colorTransform: false }); expect(rawImageData.width).toEqual(1280); expect(rawImageData.height).toEqual(2000); const expected = new Uint8Array(await fixture('truecolor.rgba')); @@ -82,7 +82,7 @@ testFunc('decodes a 32-bit TrueColor RGB image', async () => { test('decodes a CMYK jpeg with correct colors', async () => { const jpegData = await fixture('tree-cmyk.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); expect(rawImageData.width).toEqual(400); expect(rawImageData.height).toEqual(250); const expected = new Uint8Array(await fixture('tree-cmyk.rgba')); @@ -91,7 +91,7 @@ test('decodes a CMYK jpeg with correct colors', async () => { test('decodes a CMYK jpeg with correct colors without transform', async () => { const jpegData = await fixture('tree-cmyk-notransform.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); expect(rawImageData.width).toEqual(400); expect(rawImageData.height).toEqual(250); const expected = new Uint8Array(await fixture('tree-cmyk-notransform.rgba')); @@ -100,7 +100,7 @@ test('decodes a CMYK jpeg with correct colors without transform', async () => { test('decodes an RGB jpeg with correct colors', async () => { const jpegData = await fixture('tree-rgb.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); expect(rawImageData.width).toEqual(400); expect(rawImageData.height).toEqual(250); const expected = new Uint8Array(await fixture('tree-rgb.rgba')); @@ -109,7 +109,7 @@ test('decodes an RGB jpeg with correct colors', async () => { test('decodes an progressive RGB jpeg with correct colors', async () => { const jpegData = await fixture('rgb.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); expect(rawImageData.width).toEqual(350); expect(rawImageData.height).toEqual(262); const expected = new Uint8Array(await fixture('rgb.rgba')); @@ -118,7 +118,7 @@ test('decodes an progressive RGB jpeg with correct colors', async () => { test('decodes a greyscale CMYK jpeg with correct colors', async () => { const jpegData = await fixture('cmyk-grey.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); expect(rawImageData.width).toEqual(300); expect(rawImageData.height).toEqual(389); const expected = new Uint8Array(await fixture('cmyk-grey.rgba')); @@ -127,14 +127,14 @@ test('decodes a greyscale CMYK jpeg with correct colors', async () => { test('decodes an adobe CMYK jpeg with correct colors', async () => { const jpegData = await fixture('cmyktest.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); expect(rawImageData.width).toEqual(300); expect(rawImageData.height).toEqual(111); const expected = new Uint8Array(await fixture('cmyktest.rgba')); expect(rawImageData.data).toEqual(expected); const jpegData2 = await fixture('plusshelf-drawing.jpg'); - const rawImageData2 = decode(jpegData2); + const rawImageData2 = decodeJpegData(jpegData2); expect(rawImageData2.width).toEqual(350); expect(rawImageData2.height).toEqual(233); const expected2 = new Uint8Array(await fixture('plusshelf-drawing.rgba')); @@ -143,14 +143,14 @@ test('decodes an adobe CMYK jpeg with correct colors', async () => { testFunc('decodes a unconventional table JPEG', async () => { const jpegData = await fixture('unconventional-table.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); expect(rawImageData.width).toEqual(1920); expect(rawImageData.height).toEqual(1200); }); test('decodes a progressive JPEG', async () => { const jpegData = await fixture('skater-progressive.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); expect(rawImageData.width).toEqual(256); expect(rawImageData.height).toEqual(256); const expected = new Uint8Array(await fixture('skater-progressive.rgba')); @@ -159,10 +159,10 @@ test('decodes a progressive JPEG', async () => { test('decodes a progressive JPEG the same as non-progressive', async () => { const jpegData = await fixture('skater.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); const otherJpegData = await fixture('skater-progressive.jpg'); - const otherRawImageData = decode(otherJpegData); + const otherRawImageData = decodeJpegData(otherJpegData); expect(rawImageData.width).toEqual(otherRawImageData.width); expect(rawImageData.height).toEqual(otherRawImageData.height); @@ -171,7 +171,7 @@ test('decodes a progressive JPEG the same as non-progressive', async () => { test('decodes a JPEG into a typed array', async () => { const jpegData = await fixture('grumpycat.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); expect(rawImageData.width).toEqual(320); expect(rawImageData.height).toEqual(180); const expected = await fixture('grumpycat.rgba'); @@ -181,7 +181,7 @@ test('decodes a JPEG into a typed array', async () => { test('decodes a JPEG from a typed array into a typed array', async () => { const jpegData = await fixture('grumpycat.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); expect(rawImageData.width).toEqual(320); expect(rawImageData.height).toEqual(180); const expected = await fixture('grumpycat.rgba'); @@ -191,7 +191,7 @@ test('decodes a JPEG from a typed array into a typed array', async () => { test('decodes a JPEG with options', async () => { const jpegData = await fixture('grumpycat.jpg'); - const rawImageData = decode(jpegData, { colorTransform: false }); + const rawImageData = decodeJpegData(jpegData, { colorTransform: false }); expect(rawImageData.width).toEqual(320); expect(rawImageData.height).toEqual(180); const expected = await fixture('grumpycat-nocolortrans.rgba'); @@ -201,7 +201,7 @@ test('decodes a JPEG with options', async () => { test('decodes a JPEG into RGB', async () => { const jpegData = await fixture('grumpycat.jpg'); - const rawImageData = decode(jpegData, { formatAsRGBA: false }); + const rawImageData = decodeJpegData(jpegData, { formatAsRGBA: false }); expect(rawImageData.width).toEqual(320); expect(rawImageData.height).toEqual(180); const expected = await fixture('grumpycat.rgb'); @@ -211,7 +211,7 @@ test('decodes a JPEG into RGB', async () => { test('decodes image with ffdc marker', async () => { const jpegData = await fixture('marker-ffdc.jpg'); - const imageData = decode(jpegData); + const imageData = decodeJpegData(jpegData); expect(imageData.height).toEqual(200); expect(imageData.width).toEqual(200); }); @@ -220,7 +220,7 @@ testFunc( 'decodes large images within memory limits', async () => { const jpegData = await fixture('black-6000x6000.jpg'); - const rawImageData = decode(jpegData); + const rawImageData = decodeJpegData(jpegData); expect(rawImageData.width).toEqual(6000); expect(rawImageData.height).toEqual(6000); }, @@ -229,24 +229,24 @@ testFunc( // See https://github.com/eugeneware/jpeg-js/issues/53 test('limits resolution exposure', () => { - expect(() => decode(SUPER_LARGE_RESOLUTION_JPEG_BUFFER.buffer)).toThrow( + expect(() => decodeJpegData(SUPER_LARGE_RESOLUTION_JPEG_BUFFER.buffer)).toThrow( 'maxResolutionInMP limit exceeded by 3405MP', ); }); test('limits memory exposure', async () => { - expect(() => decode(SUPER_LARGE_JPEG_BUFFER.buffer, { maxResolutionInMP: 500 })).toThrow( + expect(() => decodeJpegData(SUPER_LARGE_JPEG_BUFFER.buffer, { maxResolutionInMP: 500 })).toThrow( /maxMemoryUsageInMB limit exceeded by at least \d+MB/, ); // Make sure the limit resets each decode. const jpegData = await fixture('grumpycat.jpg'); - expect(() => decode(jpegData)).not.toThrow(); + expect(() => decodeJpegData(jpegData)).not.toThrow(); }, 30000); // See https://github.com/jpeg-js/jpeg-js/issues/105 test('errors out invalid sampling factors', () => { - expect(() => decode(Buffer.from('/9j/wfFR2AD/UdgA/9r/3g==', 'base64').buffer)).toThrow( + expect(() => decodeJpegData(Buffer.from('/9j/wfFR2AD/UdgA/9r/3g==', 'base64').buffer)).toThrow( 'marker was not found', ); }); diff --git a/tests/readers/shapefile/dbf.test.ts b/tests/readers/shapefile/dbf.test.ts index b909df87..f288d99b 100644 --- a/tests/readers/shapefile/dbf.test.ts +++ b/tests/readers/shapefile/dbf.test.ts @@ -1,5 +1,5 @@ -import { FileReader } from '../../../src/readers/file'; -import { MMapReader } from '../../../src/readers/mmap'; +import { FileReader } from '../../../src/file'; +import { MMapReader } from '../../../src/mmap'; import { BufferReader, DataBaseFile } from '../../../src'; import { expect, test } from 'bun:test'; diff --git a/tests/readers/shapefile/shp.test.ts b/tests/readers/shapefile/shp.test.ts index 34b39191..543c67dd 100644 --- a/tests/readers/shapefile/shp.test.ts +++ b/tests/readers/shapefile/shp.test.ts @@ -1,7 +1,13 @@ import { FileReader } from '../../../src/file'; import { MMapReader } from '../../../src/mmap'; import { buildServer } from '../../server'; -import { BufferReader, DataBaseFile, ShapeFileReader, fromGzip, fromURL } from '../../../src'; +import { + BufferReader, + DataBaseFile, + ShapeFileReader, + shapefileFromGzip, + shapefileFromURL, +} from '../../../src'; // import { fromPath } from '../../../src/readers/shapefile/file'; import { expect, test } from 'bun:test'; @@ -181,9 +187,9 @@ test('polylinez shp', async () => { }); }); -test('fromGzip', async () => { +test('shapefileFromGzip', async () => { const data = await Bun.file(`${__dirname}/fixtures/utf.zip`).arrayBuffer(); - const shp = await fromGzip(data); + const shp = await shapefileFromGzip(data); expect(shp.getHeader()).toEqual({ bbox: [-108.97956848144531, 41.244772343082076, -108.6328125, 41.253032440653186, 0, 0], @@ -221,10 +227,14 @@ test('fromGzip', async () => { }); }); -test('fromURL', async () => { +test('shapefileFromURL', async () => { const server = buildServer(); - const shp = await fromURL(`http://localhost:${server.port}/readers/shapefile/fixtures/utf.zip`); - const shp2 = await fromURL(`http://localhost:${server.port}/readers/shapefile/fixtures/utf.shp`); + const shp = await shapefileFromURL( + `http://localhost:${server.port}/readers/shapefile/fixtures/utf.zip`, + ); + const shp2 = await shapefileFromURL( + `http://localhost:${server.port}/readers/shapefile/fixtures/utf.shp`, + ); await server.stop(); expect(shp.getHeader()).toEqual({ diff --git a/tests/readers/tile/elevation.test.ts b/tests/readers/tile/elevation.test.ts new file mode 100644 index 00000000..734bafa8 --- /dev/null +++ b/tests/readers/tile/elevation.test.ts @@ -0,0 +1,189 @@ +import { buildServer } from '../../server'; +import { + RasterTilesReader, + convertMapboxElevationData, + convertTerrariumElevationData, +} from '../../../src'; +import { expect, test } from 'bun:test'; + +test('convertMapboxElevationData', () => { + expect(convertMapboxElevationData(0, 0, 0)).toBe(-10000); + expect(convertMapboxElevationData(255, 255, 255)).toBe(1667721.5); + expect(convertMapboxElevationData(0, 0, 255)).toBe(-9974.5); + expect(convertMapboxElevationData(255, 0, 0)).toBe(1661168); + expect(convertMapboxElevationData(0, 255, 0)).toBe(-3472); +}); + +test('convertTerrariumElevationData', () => { + expect(convertTerrariumElevationData(0, 0, 0)).toBe(-32768); + expect(convertTerrariumElevationData(255, 255, 255)).toBe(32767.99609375); + expect(convertTerrariumElevationData(0, 0, 255)).toBe(-32767.00390625); + expect(convertTerrariumElevationData(255, 0, 0)).toBe(32512); + expect(convertTerrariumElevationData(0, 255, 0)).toBe(-32513); +}); + +test('read in wm terrain', async () => { + const server = buildServer(); + const reader = new RasterTilesReader( + `http://localhost:${server.port}/readers/tile/fixtures/wm/terrain`, + 1, + convertMapboxElevationData, + ); + + const metadata = await reader.getMetadata(); + expect(metadata).toEqual({ + attributions: { '© Mapbox': 'https://www.mapbox.com/about/maps/' }, + // @ts-expect-error - ignore for testing + bounds: [-180, -85, 180, 85], + description: 'height = -10000 + ((R * 256 * 256 + G * 256 + B) * 0.1)', + encoding: 'none', + extension: 'webp', + maxzoom: 3, + minzoom: 0, + name: 'Terrain-DEM', + s2tilejson: '1.0.0', + scheme: 'xyz', + type: 'raster', + }); + + // has tile + expect(await reader.hasTile(0, 0, 0)).toEqual(true); + const tile = await reader.getTile(3, 6, 2); + expect(tile).toBeDefined(); + if (tile === undefined) throw Error('tile is undefined'); + const { image, zoom, x, y, tmsStyle } = tile; + expect(image.width).toEqual(512); + expect(image.height).toEqual(512); + expect(zoom).toEqual(3); + expect(x).toEqual(6); + expect(y).toEqual(2); + expect(tmsStyle).toEqual(false); + const tileData = await Array.fromAsync(tile); + // @ts-expect-error - for testing + expect(tileData[0].geometry.coordinates.slice(0, 5)).toEqual([ + { m: { elev: 344 }, x: 90.0439453125, y: 66.48832551891898 }, + { m: { elev: 276 }, x: 90.1318359375, y: 66.48832551891898 }, + { m: { elev: 348 }, x: 90.2197265625, y: 66.48832551891898 }, + { m: { elev: 374 }, x: 90.3076171875, y: 66.48832551891898 }, + { m: { elev: 526 }, x: 90.3955078125, y: 66.48832551891898 }, + ]); + + const tiles = await Array.fromAsync(reader); + expect(tiles.length).toEqual(4); + + await server.stop(); +}); + +test('read in wm terrain-v2', async () => { + const server = buildServer(); + const reader = new RasterTilesReader( + `http://localhost:${server.port}/readers/tile/fixtures/wm/terrain-v2`, + 1, + convertMapboxElevationData, + ); + + const metadata = await reader.getMetadata(); + expect(metadata).toEqual({ + attributions: { '© Mapbox': 'https://www.mapbox.com/about/maps/' }, + // @ts-expect-error - ignore for testing + bounds: [-180, -85, 180, 85], + description: 'height = -10000 + ((R * 256 * 256 + G * 256 + B) * 0.1)', + encoding: 'none', + extension: 'webp', + maxzoom: 3, + minzoom: 0, + format: 'webp', + name: 'Terrain-DEM', + s2tilejson: '1.0.0', + scheme: 'xyz', + type: 'raster', + }); + + // has tile + expect(await reader.hasTile(0, 0, 0)).toEqual(true); + const tile = await reader.getTile(3, 6, 2); + expect(tile).toBeDefined(); + if (tile === undefined) throw Error('tile is undefined'); + const { image, zoom, x, y, tmsStyle } = tile; + expect(image.width).toEqual(512); + expect(image.height).toEqual(512); + expect(zoom).toEqual(3); + expect(x).toEqual(6); + expect(y).toEqual(2); + expect(tmsStyle).toEqual(false); + const tileData = await Array.fromAsync(tile); + // @ts-expect-error - for testing + expect(tileData[0].geometry.coordinates.slice(0, 5)).toEqual([ + { m: { elev: 291.2000000000007 }, x: 90.0439453125, y: 66.48832551891898 }, + { m: { elev: 265.60000000000036 }, x: 90.1318359375, y: 66.48832551891898 }, + { m: { elev: 316.8000000000011 }, x: 90.2197265625, y: 66.48832551891898 }, + { m: { elev: 419.2000000000007 }, x: 90.3076171875, y: 66.48832551891898 }, + { m: { elev: 521.6000000000004 }, x: 90.3955078125, y: 66.48832551891898 }, + ]); + + const tiles = await Array.fromAsync(reader); + expect(tiles.length).toEqual(4); + + await server.stop(); +}); + +test('read in wm terrarium2x', async () => { + const server = buildServer(); + const reader = new RasterTilesReader( + `http://localhost:${server.port}/readers/tile/fixtures/wm/terrarium2x`, + 1, + convertTerrariumElevationData, + ); + + const metadata = await reader.getMetadata(); + expect(metadata).toEqual({ + attributions: { Terrarium: 'https://registry.opendata.aws/terrain-tiles/' }, + // @ts-expect-error - ignore for testing + bounds: [-180, -85, 180, 85], + description: 'height = (R * 256. + G + B / 256.) - 32768.', + encoding: 'none', + extension: 'webp', + maxzoom: 3, + minzoom: 0, + format: 'webp', + name: 'Terrain-DEM', + s2tilejson: '1.0.0', + scheme: 'xyz', + type: 'raster', + }); + + // has tile + expect(await reader.hasTile(0, 0, 0)).toEqual(true); + const tile = await reader.getTile(3, 6, 2); + expect(tile).toBeDefined(); + if (tile === undefined) throw Error('tile is undefined'); + const { image, zoom, x, y, tmsStyle } = tile; + expect(image.width).toEqual(512); + expect(image.height).toEqual(512); + expect(zoom).toEqual(3); + expect(x).toEqual(6); + expect(y).toEqual(2); + expect(tmsStyle).toEqual(false); + const tileData = await Array.fromAsync(tile); + // @ts-expect-error - for testing + expect(tileData[0].geometry.coordinates.slice(0, 5)).toEqual([ + { m: { elev: 346 }, x: 90.0439453125, y: 66.48832551891898 }, + { m: { elev: 280 }, x: 90.1318359375, y: 66.48832551891898 }, + { m: { elev: 392 }, x: 90.2197265625, y: 66.48832551891898 }, + { m: { elev: 520 }, x: 90.3076171875, y: 66.48832551891898 }, + { m: { elev: 549 }, x: 90.3955078125, y: 66.48832551891898 }, + ]); + // @ts-expect-error - for testing + expect(tileData[0].geometry.coordinates.slice(-5)).toEqual([ + { m: { elev: -3568 }, x: 134.6044921875, y: 41.004832993813 }, + { m: { elev: -3576 }, x: 134.6923828125, y: 41.004832993813 }, + { m: { elev: -3568 }, x: 134.7802734375, y: 41.004832993813 }, + { m: { elev: -3550 }, x: 134.8681640625, y: 41.004832993813 }, + { m: { elev: -3539 }, x: 134.9560546875, y: 41.004832993813 }, + ]); + + const tiles = await Array.fromAsync(reader); + expect(tiles.length).toEqual(4); + + await server.stop(); +}); diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/0/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/0/0/0.webp new file mode 100644 index 00000000..047fbb37 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/0/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/1/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/1/0/0.webp new file mode 100644 index 00000000..3265c879 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/1/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/1/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/1/0/1.webp new file mode 100644 index 00000000..8d40a333 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/1/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/1/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/1/1/0.webp new file mode 100644 index 00000000..639709d6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/1/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/1/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/1/1/1.webp new file mode 100644 index 00000000..4ddbdbe0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/1/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/2/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/2/0/0.webp new file mode 100644 index 00000000..c0d08938 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/2/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/2/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/2/0/1.webp new file mode 100644 index 00000000..59222045 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/2/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/2/0/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/2/0/2.webp new file mode 100644 index 00000000..63227dd3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/2/0/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/2/0/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/2/0/3.webp new file mode 100644 index 00000000..dafdb3be Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/2/0/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/2/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/2/1/0.webp new file mode 100644 index 00000000..03bde2f0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/2/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/2/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/2/1/1.webp new file mode 100644 index 00000000..791503a4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/2/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/2/1/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/2/1/2.webp new file mode 100644 index 00000000..2ab7b688 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/2/1/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/2/1/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/2/1/3.webp new file mode 100644 index 00000000..dd400051 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/2/1/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/2/2/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/2/2/0.webp new file mode 100644 index 00000000..118f6790 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/2/2/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/2/2/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/2/2/1.webp new file mode 100644 index 00000000..c3697956 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/2/2/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/2/2/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/2/2/2.webp new file mode 100644 index 00000000..0dfdea61 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/2/2/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/2/2/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/2/2/3.webp new file mode 100644 index 00000000..e99cd5dd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/2/2/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/2/3/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/2/3/0.webp new file mode 100644 index 00000000..4be6dd90 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/2/3/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/2/3/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/2/3/1.webp new file mode 100644 index 00000000..0552ee85 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/2/3/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/2/3/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/2/3/2.webp new file mode 100644 index 00000000..0af6f47b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/2/3/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/2/3/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/2/3/3.webp new file mode 100644 index 00000000..5ef092a2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/2/3/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/0.webp new file mode 100644 index 00000000..fc01496a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/1.webp new file mode 100644 index 00000000..9d359d37 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/2.webp new file mode 100644 index 00000000..cf228aa9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/3.webp new file mode 100644 index 00000000..b6d09c85 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/4.webp new file mode 100644 index 00000000..13595092 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/5.webp new file mode 100644 index 00000000..6516b216 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/6.webp new file mode 100644 index 00000000..21e5b71f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/7.webp new file mode 100644 index 00000000..0918e459 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/0/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/0.webp new file mode 100644 index 00000000..749f85b7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/1.webp new file mode 100644 index 00000000..11218c9f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/2.webp new file mode 100644 index 00000000..5f6f2d0f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/3.webp new file mode 100644 index 00000000..12dfc586 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/4.webp new file mode 100644 index 00000000..1743d6bb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/5.webp new file mode 100644 index 00000000..6fbf71dd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/6.webp new file mode 100644 index 00000000..1c791f33 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/7.webp new file mode 100644 index 00000000..f27215d3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/1/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/0.webp new file mode 100644 index 00000000..8c9f2b9a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/1.webp new file mode 100644 index 00000000..863c01f8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/2.webp new file mode 100644 index 00000000..0d69743e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/3.webp new file mode 100644 index 00000000..95f1a229 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/4.webp new file mode 100644 index 00000000..ab024c56 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/5.webp new file mode 100644 index 00000000..60f1b40c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/6.webp new file mode 100644 index 00000000..06015fac Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/7.webp new file mode 100644 index 00000000..b7b00494 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/2/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/0.webp new file mode 100644 index 00000000..534673fa Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/1.webp new file mode 100644 index 00000000..4dc1e7a0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/2.webp new file mode 100644 index 00000000..cac3e1a5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/3.webp new file mode 100644 index 00000000..02abaa08 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/4.webp new file mode 100644 index 00000000..c229d6b9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/5.webp new file mode 100644 index 00000000..8645ea18 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/6.webp new file mode 100644 index 00000000..a9db5bcf Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/7.webp new file mode 100644 index 00000000..5281cf7d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/3/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/0.webp new file mode 100644 index 00000000..1c2f3ad9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/1.webp new file mode 100644 index 00000000..e554b3e0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/2.webp new file mode 100644 index 00000000..bc09b495 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/3.webp new file mode 100644 index 00000000..5922283d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/4.webp new file mode 100644 index 00000000..1d853af6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/5.webp new file mode 100644 index 00000000..8de375ab Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/6.webp new file mode 100644 index 00000000..508095d8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/7.webp new file mode 100644 index 00000000..40c429c9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/4/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/0.webp new file mode 100644 index 00000000..8b9cd190 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/1.webp new file mode 100644 index 00000000..920a3385 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/2.webp new file mode 100644 index 00000000..6cddab81 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/3.webp new file mode 100644 index 00000000..bba62336 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/4.webp new file mode 100644 index 00000000..2d913c28 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/5.webp new file mode 100644 index 00000000..bfb54dea Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/6.webp new file mode 100644 index 00000000..5529a4e6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/7.webp new file mode 100644 index 00000000..51ee99d3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/5/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/0.webp new file mode 100644 index 00000000..71ec06c7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/1.webp new file mode 100644 index 00000000..5f7335c6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/2.webp new file mode 100644 index 00000000..1df9f35e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/3.webp new file mode 100644 index 00000000..458d6797 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/4.webp new file mode 100644 index 00000000..2e1ab934 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/5.webp new file mode 100644 index 00000000..4916b365 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/6.webp new file mode 100644 index 00000000..bc7f72c4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/7.webp new file mode 100644 index 00000000..4ccdfb2c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/6/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/0.webp new file mode 100644 index 00000000..59071457 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/1.webp new file mode 100644 index 00000000..bbe7d026 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/2.webp new file mode 100644 index 00000000..23f8c6fe Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/3.webp new file mode 100644 index 00000000..6201ee35 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/4.webp new file mode 100644 index 00000000..9c89047e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/5.webp new file mode 100644 index 00000000..fcb60512 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/6.webp new file mode 100644 index 00000000..75532f2e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/7.webp new file mode 100644 index 00000000..12bb7dc0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/0/3/7/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/0/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/0/0/0.webp new file mode 100644 index 00000000..7127dad9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/0/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/1/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/1/0/0.webp new file mode 100644 index 00000000..050abb78 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/1/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/1/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/1/0/1.webp new file mode 100644 index 00000000..42a61bec Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/1/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/1/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/1/1/0.webp new file mode 100644 index 00000000..adda912b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/1/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/1/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/1/1/1.webp new file mode 100644 index 00000000..c06a88db Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/1/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/2/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/2/0/0.webp new file mode 100644 index 00000000..1eea0786 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/2/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/2/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/2/0/1.webp new file mode 100644 index 00000000..cea2999f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/2/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/2/0/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/2/0/2.webp new file mode 100644 index 00000000..3d36c8d2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/2/0/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/2/0/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/2/0/3.webp new file mode 100644 index 00000000..9f3362fd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/2/0/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/2/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/2/1/0.webp new file mode 100644 index 00000000..00159d31 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/2/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/2/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/2/1/1.webp new file mode 100644 index 00000000..7e769199 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/2/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/2/1/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/2/1/2.webp new file mode 100644 index 00000000..905b49f4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/2/1/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/2/1/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/2/1/3.webp new file mode 100644 index 00000000..9961d87d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/2/1/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/2/2/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/2/2/0.webp new file mode 100644 index 00000000..2462a536 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/2/2/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/2/2/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/2/2/1.webp new file mode 100644 index 00000000..0c87eb4d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/2/2/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/2/2/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/2/2/2.webp new file mode 100644 index 00000000..3817bc01 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/2/2/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/2/2/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/2/2/3.webp new file mode 100644 index 00000000..30e8d038 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/2/2/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/2/3/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/2/3/0.webp new file mode 100644 index 00000000..4839f931 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/2/3/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/2/3/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/2/3/1.webp new file mode 100644 index 00000000..d079f4f3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/2/3/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/2/3/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/2/3/2.webp new file mode 100644 index 00000000..d3f8abef Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/2/3/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/2/3/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/2/3/3.webp new file mode 100644 index 00000000..c1cb3cae Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/2/3/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/0.webp new file mode 100644 index 00000000..43240f5e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/1.webp new file mode 100644 index 00000000..e7af4b20 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/2.webp new file mode 100644 index 00000000..629f5e16 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/3.webp new file mode 100644 index 00000000..4e1e093a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/4.webp new file mode 100644 index 00000000..ad70fabd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/5.webp new file mode 100644 index 00000000..01ddc018 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/6.webp new file mode 100644 index 00000000..a4f2a8b5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/7.webp new file mode 100644 index 00000000..52210e92 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/0/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/0.webp new file mode 100644 index 00000000..583cb937 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/1.webp new file mode 100644 index 00000000..ecdaf5ca Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/2.webp new file mode 100644 index 00000000..2c85ccd6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/3.webp new file mode 100644 index 00000000..61d0da35 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/4.webp new file mode 100644 index 00000000..ae65f01e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/5.webp new file mode 100644 index 00000000..29cd4e64 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/6.webp new file mode 100644 index 00000000..923e957d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/7.webp new file mode 100644 index 00000000..e423ea3b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/1/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/0.webp new file mode 100644 index 00000000..38b2364d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/1.webp new file mode 100644 index 00000000..04decb9d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/2.webp new file mode 100644 index 00000000..6a708fae Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/3.webp new file mode 100644 index 00000000..e597a059 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/4.webp new file mode 100644 index 00000000..cf4bf091 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/5.webp new file mode 100644 index 00000000..ac6604dd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/6.webp new file mode 100644 index 00000000..a009376e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/7.webp new file mode 100644 index 00000000..2348b124 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/2/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/0.webp new file mode 100644 index 00000000..481844ee Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/1.webp new file mode 100644 index 00000000..0610ad41 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/2.webp new file mode 100644 index 00000000..41fb9511 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/3.webp new file mode 100644 index 00000000..adfc9b57 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/4.webp new file mode 100644 index 00000000..ef9bd36c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/5.webp new file mode 100644 index 00000000..803bf56e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/6.webp new file mode 100644 index 00000000..17367620 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/7.webp new file mode 100644 index 00000000..20987f53 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/3/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/0.webp new file mode 100644 index 00000000..4f0866e6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/1.webp new file mode 100644 index 00000000..c1fb15a4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/2.webp new file mode 100644 index 00000000..0e24841b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/3.webp new file mode 100644 index 00000000..a300cc19 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/4.webp new file mode 100644 index 00000000..a4516a33 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/5.webp new file mode 100644 index 00000000..240b3bdf Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/6.webp new file mode 100644 index 00000000..e0755a45 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/7.webp new file mode 100644 index 00000000..015f6a53 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/4/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/0.webp new file mode 100644 index 00000000..f522b439 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/1.webp new file mode 100644 index 00000000..438ceb0e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/2.webp new file mode 100644 index 00000000..a3935714 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/3.webp new file mode 100644 index 00000000..eef86b81 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/4.webp new file mode 100644 index 00000000..b08c9ee5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/5.webp new file mode 100644 index 00000000..6ba00847 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/6.webp new file mode 100644 index 00000000..84a31f53 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/7.webp new file mode 100644 index 00000000..7cacf2c6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/5/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/0.webp new file mode 100644 index 00000000..2b93e8b7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/1.webp new file mode 100644 index 00000000..b88bbea5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/2.webp new file mode 100644 index 00000000..b2dc70de Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/3.webp new file mode 100644 index 00000000..8c2c8a58 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/4.webp new file mode 100644 index 00000000..d2f1048d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/5.webp new file mode 100644 index 00000000..2da6adfa Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/6.webp new file mode 100644 index 00000000..d9032538 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/7.webp new file mode 100644 index 00000000..ccecc75f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/6/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/0.webp new file mode 100644 index 00000000..9278b092 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/1.webp new file mode 100644 index 00000000..8ef3c934 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/2.webp new file mode 100644 index 00000000..2dcd6189 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/3.webp new file mode 100644 index 00000000..89dfd402 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/4.webp new file mode 100644 index 00000000..71a13828 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/5.webp new file mode 100644 index 00000000..a60f814b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/6.webp new file mode 100644 index 00000000..2cac9bd9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/7.webp new file mode 100644 index 00000000..ac721e82 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/1/3/7/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/0/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/0/0/0.webp new file mode 100644 index 00000000..aa931008 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/0/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/1/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/1/0/0.webp new file mode 100644 index 00000000..48114254 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/1/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/1/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/1/0/1.webp new file mode 100644 index 00000000..9fc5e6c5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/1/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/1/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/1/1/0.webp new file mode 100644 index 00000000..0795ad1a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/1/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/1/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/1/1/1.webp new file mode 100644 index 00000000..64d9728c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/1/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/2/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/2/0/0.webp new file mode 100644 index 00000000..c942c681 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/2/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/2/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/2/0/1.webp new file mode 100644 index 00000000..dc39dac5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/2/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/2/0/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/2/0/2.webp new file mode 100644 index 00000000..2be7fe28 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/2/0/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/2/0/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/2/0/3.webp new file mode 100644 index 00000000..ff146c4c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/2/0/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/2/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/2/1/0.webp new file mode 100644 index 00000000..a0aeadf4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/2/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/2/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/2/1/1.webp new file mode 100644 index 00000000..cbb274df Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/2/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/2/1/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/2/1/2.webp new file mode 100644 index 00000000..54d196cf Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/2/1/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/2/1/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/2/1/3.webp new file mode 100644 index 00000000..e176bcb5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/2/1/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/2/2/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/2/2/0.webp new file mode 100644 index 00000000..01233124 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/2/2/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/2/2/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/2/2/1.webp new file mode 100644 index 00000000..38d9c080 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/2/2/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/2/2/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/2/2/2.webp new file mode 100644 index 00000000..4a7dfcf1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/2/2/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/2/2/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/2/2/3.webp new file mode 100644 index 00000000..bc1bce34 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/2/2/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/2/3/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/2/3/0.webp new file mode 100644 index 00000000..3dcfc6fe Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/2/3/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/2/3/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/2/3/1.webp new file mode 100644 index 00000000..ce378c35 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/2/3/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/2/3/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/2/3/2.webp new file mode 100644 index 00000000..01eb38ea Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/2/3/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/2/3/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/2/3/3.webp new file mode 100644 index 00000000..ede64112 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/2/3/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/0.webp new file mode 100644 index 00000000..00922781 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/1.webp new file mode 100644 index 00000000..80e9a30d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/2.webp new file mode 100644 index 00000000..b23eff3b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/3.webp new file mode 100644 index 00000000..5822341e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/4.webp new file mode 100644 index 00000000..d1221f31 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/5.webp new file mode 100644 index 00000000..6e1c7f7a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/6.webp new file mode 100644 index 00000000..239622ce Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/7.webp new file mode 100644 index 00000000..3af40ec8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/0/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/0.webp new file mode 100644 index 00000000..7e5c7f70 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/1.webp new file mode 100644 index 00000000..91b88552 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/2.webp new file mode 100644 index 00000000..365a6ed7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/3.webp new file mode 100644 index 00000000..51298725 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/4.webp new file mode 100644 index 00000000..0a5211a5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/5.webp new file mode 100644 index 00000000..0c018034 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/6.webp new file mode 100644 index 00000000..4517d0e7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/7.webp new file mode 100644 index 00000000..88214fb9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/1/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/0.webp new file mode 100644 index 00000000..91b23535 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/1.webp new file mode 100644 index 00000000..bf8a81f3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/2.webp new file mode 100644 index 00000000..3652703a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/3.webp new file mode 100644 index 00000000..aa68b879 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/4.webp new file mode 100644 index 00000000..c7b375f1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/5.webp new file mode 100644 index 00000000..cadf1ad3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/6.webp new file mode 100644 index 00000000..5dd25052 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/7.webp new file mode 100644 index 00000000..08cd9e6c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/2/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/0.webp new file mode 100644 index 00000000..64d588a6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/1.webp new file mode 100644 index 00000000..8d85f8d6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/2.webp new file mode 100644 index 00000000..71c8fbdc Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/3.webp new file mode 100644 index 00000000..9d08c4de Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/4.webp new file mode 100644 index 00000000..8a30a544 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/5.webp new file mode 100644 index 00000000..22a70171 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/6.webp new file mode 100644 index 00000000..99e7e848 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/7.webp new file mode 100644 index 00000000..dae95755 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/3/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/0.webp new file mode 100644 index 00000000..00dfd1e2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/1.webp new file mode 100644 index 00000000..827c8f42 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/2.webp new file mode 100644 index 00000000..da0980e1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/3.webp new file mode 100644 index 00000000..a135441a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/4.webp new file mode 100644 index 00000000..ec324237 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/5.webp new file mode 100644 index 00000000..795925de Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/6.webp new file mode 100644 index 00000000..ab4a55fd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/7.webp new file mode 100644 index 00000000..bdffb5a5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/4/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/0.webp new file mode 100644 index 00000000..1a8cd0a0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/1.webp new file mode 100644 index 00000000..1051e826 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/2.webp new file mode 100644 index 00000000..ee5efd70 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/3.webp new file mode 100644 index 00000000..8d393cce Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/4.webp new file mode 100644 index 00000000..02517069 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/5.webp new file mode 100644 index 00000000..d409c747 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/6.webp new file mode 100644 index 00000000..ba8538ee Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/7.webp new file mode 100644 index 00000000..bd1f55d1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/5/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/0.webp new file mode 100644 index 00000000..ac57f9a1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/1.webp new file mode 100644 index 00000000..8b8d5b0a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/2.webp new file mode 100644 index 00000000..06c39f15 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/3.webp new file mode 100644 index 00000000..4e4a1390 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/4.webp new file mode 100644 index 00000000..3b671f85 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/5.webp new file mode 100644 index 00000000..e780f46a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/6.webp new file mode 100644 index 00000000..5394378c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/7.webp new file mode 100644 index 00000000..6afcf1c6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/6/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/0.webp new file mode 100644 index 00000000..5e65de74 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/1.webp new file mode 100644 index 00000000..cadb7944 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/2.webp new file mode 100644 index 00000000..b7b45abe Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/3.webp new file mode 100644 index 00000000..d8b380b2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/4.webp new file mode 100644 index 00000000..a66587a3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/5.webp new file mode 100644 index 00000000..742b8111 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/6.webp new file mode 100644 index 00000000..eefed1e4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/7.webp new file mode 100644 index 00000000..ac700d06 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/2/3/7/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/0/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/0/0/0.webp new file mode 100644 index 00000000..86555460 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/0/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/1/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/1/0/0.webp new file mode 100644 index 00000000..586a1858 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/1/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/1/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/1/0/1.webp new file mode 100644 index 00000000..0627c9ff Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/1/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/1/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/1/1/0.webp new file mode 100644 index 00000000..1b99b552 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/1/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/1/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/1/1/1.webp new file mode 100644 index 00000000..74a1aba9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/1/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/2/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/2/0/0.webp new file mode 100644 index 00000000..5380926d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/2/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/2/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/2/0/1.webp new file mode 100644 index 00000000..42251373 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/2/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/2/0/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/2/0/2.webp new file mode 100644 index 00000000..afd64585 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/2/0/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/2/0/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/2/0/3.webp new file mode 100644 index 00000000..ecf65e58 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/2/0/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/2/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/2/1/0.webp new file mode 100644 index 00000000..1c0aed8f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/2/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/2/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/2/1/1.webp new file mode 100644 index 00000000..a095630c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/2/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/2/1/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/2/1/2.webp new file mode 100644 index 00000000..d80224dc Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/2/1/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/2/1/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/2/1/3.webp new file mode 100644 index 00000000..757e946e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/2/1/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/2/2/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/2/2/0.webp new file mode 100644 index 00000000..f53399c4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/2/2/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/2/2/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/2/2/1.webp new file mode 100644 index 00000000..d75a8c21 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/2/2/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/2/2/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/2/2/2.webp new file mode 100644 index 00000000..86c3593c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/2/2/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/2/2/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/2/2/3.webp new file mode 100644 index 00000000..4030551e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/2/2/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/2/3/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/2/3/0.webp new file mode 100644 index 00000000..42a49a9b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/2/3/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/2/3/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/2/3/1.webp new file mode 100644 index 00000000..d6652467 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/2/3/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/2/3/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/2/3/2.webp new file mode 100644 index 00000000..75090ece Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/2/3/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/2/3/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/2/3/3.webp new file mode 100644 index 00000000..0fd2da3b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/2/3/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/0.webp new file mode 100644 index 00000000..61edb9f8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/1.webp new file mode 100644 index 00000000..620736dd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/2.webp new file mode 100644 index 00000000..225f61b2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/3.webp new file mode 100644 index 00000000..06720fce Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/4.webp new file mode 100644 index 00000000..8864e126 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/5.webp new file mode 100644 index 00000000..e44c3e2f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/6.webp new file mode 100644 index 00000000..f0dcd30f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/7.webp new file mode 100644 index 00000000..06962047 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/0/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/0.webp new file mode 100644 index 00000000..781971d6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/1.webp new file mode 100644 index 00000000..26a5f710 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/2.webp new file mode 100644 index 00000000..5bd002fc Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/3.webp new file mode 100644 index 00000000..5ab6fbb5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/4.webp new file mode 100644 index 00000000..c0a6c0ec Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/5.webp new file mode 100644 index 00000000..788e3e17 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/6.webp new file mode 100644 index 00000000..abcf5f46 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/7.webp new file mode 100644 index 00000000..c40f6f81 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/1/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/0.webp new file mode 100644 index 00000000..73647097 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/1.webp new file mode 100644 index 00000000..97c9a127 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/2.webp new file mode 100644 index 00000000..32b05c6d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/3.webp new file mode 100644 index 00000000..cd1a6705 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/4.webp new file mode 100644 index 00000000..a2c4d6ec Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/5.webp new file mode 100644 index 00000000..11af4b97 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/6.webp new file mode 100644 index 00000000..acbc218f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/7.webp new file mode 100644 index 00000000..6058607d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/2/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/0.webp new file mode 100644 index 00000000..c6f7bbfd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/1.webp new file mode 100644 index 00000000..e255b804 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/2.webp new file mode 100644 index 00000000..1aaf2540 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/3.webp new file mode 100644 index 00000000..2347f195 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/4.webp new file mode 100644 index 00000000..ea2c53cb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/5.webp new file mode 100644 index 00000000..bdc8722b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/6.webp new file mode 100644 index 00000000..3b91c982 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/7.webp new file mode 100644 index 00000000..87bf70f2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/3/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/0.webp new file mode 100644 index 00000000..75c5e80c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/1.webp new file mode 100644 index 00000000..904edc20 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/2.webp new file mode 100644 index 00000000..1d0d394f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/3.webp new file mode 100644 index 00000000..cf057171 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/4.webp new file mode 100644 index 00000000..4c3c8ba1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/5.webp new file mode 100644 index 00000000..56720cf6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/6.webp new file mode 100644 index 00000000..e4807489 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/7.webp new file mode 100644 index 00000000..cfd16f1e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/4/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/0.webp new file mode 100644 index 00000000..964b4992 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/1.webp new file mode 100644 index 00000000..dbbd6f35 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/2.webp new file mode 100644 index 00000000..677d79c6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/3.webp new file mode 100644 index 00000000..bc5d4223 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/4.webp new file mode 100644 index 00000000..402498cb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/5.webp new file mode 100644 index 00000000..8a1d72ae Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/6.webp new file mode 100644 index 00000000..b28bb53c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/7.webp new file mode 100644 index 00000000..36a59c5b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/5/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/0.webp new file mode 100644 index 00000000..d46dac16 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/1.webp new file mode 100644 index 00000000..524f9893 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/2.webp new file mode 100644 index 00000000..2a33b65e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/3.webp new file mode 100644 index 00000000..6552a7a7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/4.webp new file mode 100644 index 00000000..5e9d307e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/5.webp new file mode 100644 index 00000000..8fbe4dd1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/6.webp new file mode 100644 index 00000000..07469c0c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/7.webp new file mode 100644 index 00000000..b77bc045 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/6/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/0.webp new file mode 100644 index 00000000..babb05ce Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/1.webp new file mode 100644 index 00000000..55712c3a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/2.webp new file mode 100644 index 00000000..561c7fba Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/3.webp new file mode 100644 index 00000000..218f5724 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/4.webp new file mode 100644 index 00000000..221f0fd2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/5.webp new file mode 100644 index 00000000..569a1f88 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/6.webp new file mode 100644 index 00000000..412bcb4d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/7.webp new file mode 100644 index 00000000..3fbde613 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/3/3/7/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/0/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/0/0/0.webp new file mode 100644 index 00000000..10e206df Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/0/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/1/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/1/0/0.webp new file mode 100644 index 00000000..f0a06e74 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/1/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/1/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/1/0/1.webp new file mode 100644 index 00000000..e8ac6d77 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/1/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/1/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/1/1/0.webp new file mode 100644 index 00000000..6f5a3faa Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/1/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/1/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/1/1/1.webp new file mode 100644 index 00000000..16aed54f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/1/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/2/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/2/0/0.webp new file mode 100644 index 00000000..f5f86e9c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/2/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/2/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/2/0/1.webp new file mode 100644 index 00000000..59d785e1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/2/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/2/0/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/2/0/2.webp new file mode 100644 index 00000000..fb5fb4cf Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/2/0/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/2/0/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/2/0/3.webp new file mode 100644 index 00000000..994ae861 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/2/0/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/2/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/2/1/0.webp new file mode 100644 index 00000000..204b1d1e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/2/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/2/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/2/1/1.webp new file mode 100644 index 00000000..946df36b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/2/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/2/1/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/2/1/2.webp new file mode 100644 index 00000000..e989c744 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/2/1/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/2/1/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/2/1/3.webp new file mode 100644 index 00000000..fc8c1316 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/2/1/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/2/2/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/2/2/0.webp new file mode 100644 index 00000000..c9d658ec Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/2/2/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/2/2/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/2/2/1.webp new file mode 100644 index 00000000..be579266 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/2/2/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/2/2/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/2/2/2.webp new file mode 100644 index 00000000..4f73a669 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/2/2/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/2/2/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/2/2/3.webp new file mode 100644 index 00000000..8db95ca1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/2/2/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/2/3/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/2/3/0.webp new file mode 100644 index 00000000..511e313b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/2/3/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/2/3/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/2/3/1.webp new file mode 100644 index 00000000..a1c081ac Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/2/3/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/2/3/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/2/3/2.webp new file mode 100644 index 00000000..a4385aee Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/2/3/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/2/3/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/2/3/3.webp new file mode 100644 index 00000000..e2f80ec5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/2/3/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/0.webp new file mode 100644 index 00000000..ff1e5659 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/1.webp new file mode 100644 index 00000000..7e95fd76 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/2.webp new file mode 100644 index 00000000..d16dccb6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/3.webp new file mode 100644 index 00000000..89c677ce Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/4.webp new file mode 100644 index 00000000..221576bf Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/5.webp new file mode 100644 index 00000000..0fd294c4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/6.webp new file mode 100644 index 00000000..936140f1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/7.webp new file mode 100644 index 00000000..2154c5fe Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/0/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/0.webp new file mode 100644 index 00000000..31d48e2f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/1.webp new file mode 100644 index 00000000..b769d7a8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/2.webp new file mode 100644 index 00000000..aaa9050e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/3.webp new file mode 100644 index 00000000..774f68e0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/4.webp new file mode 100644 index 00000000..2addca01 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/5.webp new file mode 100644 index 00000000..87b33ea0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/6.webp new file mode 100644 index 00000000..12616c8d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/7.webp new file mode 100644 index 00000000..1f6f08c5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/1/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/0.webp new file mode 100644 index 00000000..7024da43 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/1.webp new file mode 100644 index 00000000..f5a8c86f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/2.webp new file mode 100644 index 00000000..5440494c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/3.webp new file mode 100644 index 00000000..247a89f0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/4.webp new file mode 100644 index 00000000..c123189c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/5.webp new file mode 100644 index 00000000..d8c6e497 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/6.webp new file mode 100644 index 00000000..6e49ecc4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/7.webp new file mode 100644 index 00000000..38ed6dad Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/2/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/0.webp new file mode 100644 index 00000000..7598790b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/1.webp new file mode 100644 index 00000000..c0874a7e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/2.webp new file mode 100644 index 00000000..e5fa2f0b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/3.webp new file mode 100644 index 00000000..bfe9cd26 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/4.webp new file mode 100644 index 00000000..247e0079 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/5.webp new file mode 100644 index 00000000..580443a9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/6.webp new file mode 100644 index 00000000..59bae439 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/7.webp new file mode 100644 index 00000000..946516e4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/3/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/0.webp new file mode 100644 index 00000000..023f7bb2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/1.webp new file mode 100644 index 00000000..a12a8b50 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/2.webp new file mode 100644 index 00000000..905a71ff Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/3.webp new file mode 100644 index 00000000..ea01c0fa Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/4.webp new file mode 100644 index 00000000..eed19098 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/5.webp new file mode 100644 index 00000000..9d8d6453 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/6.webp new file mode 100644 index 00000000..71ac9eae Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/7.webp new file mode 100644 index 00000000..28b000da Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/4/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/0.webp new file mode 100644 index 00000000..b447fce9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/1.webp new file mode 100644 index 00000000..b4cb2cf0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/2.webp new file mode 100644 index 00000000..e14d4be7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/3.webp new file mode 100644 index 00000000..57e7b729 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/4.webp new file mode 100644 index 00000000..5fa938a1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/5.webp new file mode 100644 index 00000000..7f7c7a4f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/6.webp new file mode 100644 index 00000000..2aab17f0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/7.webp new file mode 100644 index 00000000..307f015c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/5/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/0.webp new file mode 100644 index 00000000..68061393 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/1.webp new file mode 100644 index 00000000..a1642148 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/2.webp new file mode 100644 index 00000000..79666419 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/3.webp new file mode 100644 index 00000000..4cb013bc Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/4.webp new file mode 100644 index 00000000..009033b7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/5.webp new file mode 100644 index 00000000..79a49640 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/6.webp new file mode 100644 index 00000000..3198940d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/7.webp new file mode 100644 index 00000000..d9f970ba Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/6/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/0.webp new file mode 100644 index 00000000..7b6fec44 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/1.webp new file mode 100644 index 00000000..59a9e5fb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/2.webp new file mode 100644 index 00000000..272ea444 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/3.webp new file mode 100644 index 00000000..9eff86be Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/4.webp new file mode 100644 index 00000000..0d9333f8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/5.webp new file mode 100644 index 00000000..5ed4ded6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/6.webp new file mode 100644 index 00000000..5b00bf6f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/7.webp new file mode 100644 index 00000000..257b67f8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/4/3/7/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/0/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/0/0/0.webp new file mode 100644 index 00000000..3693abac Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/0/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/1/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/1/0/0.webp new file mode 100644 index 00000000..e6fe5704 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/1/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/1/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/1/0/1.webp new file mode 100644 index 00000000..164bcb57 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/1/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/1/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/1/1/0.webp new file mode 100644 index 00000000..97961f59 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/1/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/1/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/1/1/1.webp new file mode 100644 index 00000000..942fe4e3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/1/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/2/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/2/0/0.webp new file mode 100644 index 00000000..89cb95fc Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/2/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/2/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/2/0/1.webp new file mode 100644 index 00000000..ae74419d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/2/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/2/0/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/2/0/2.webp new file mode 100644 index 00000000..8d0e1bec Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/2/0/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/2/0/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/2/0/3.webp new file mode 100644 index 00000000..93f04e75 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/2/0/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/2/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/2/1/0.webp new file mode 100644 index 00000000..3d4b4ba8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/2/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/2/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/2/1/1.webp new file mode 100644 index 00000000..fd4638ab Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/2/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/2/1/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/2/1/2.webp new file mode 100644 index 00000000..00c16d11 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/2/1/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/2/1/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/2/1/3.webp new file mode 100644 index 00000000..46da6ccc Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/2/1/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/2/2/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/2/2/0.webp new file mode 100644 index 00000000..58edfc74 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/2/2/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/2/2/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/2/2/1.webp new file mode 100644 index 00000000..d76455a8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/2/2/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/2/2/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/2/2/2.webp new file mode 100644 index 00000000..5ac31e4a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/2/2/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/2/2/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/2/2/3.webp new file mode 100644 index 00000000..be9be564 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/2/2/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/2/3/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/2/3/0.webp new file mode 100644 index 00000000..7a9de8c1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/2/3/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/2/3/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/2/3/1.webp new file mode 100644 index 00000000..aee14465 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/2/3/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/2/3/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/2/3/2.webp new file mode 100644 index 00000000..e7d0345e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/2/3/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/2/3/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/2/3/3.webp new file mode 100644 index 00000000..5807050d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/2/3/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/0.webp new file mode 100644 index 00000000..e1551118 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/1.webp new file mode 100644 index 00000000..f00c55e0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/2.webp new file mode 100644 index 00000000..98c37729 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/3.webp new file mode 100644 index 00000000..a8248fcf Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/4.webp new file mode 100644 index 00000000..ef811378 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/5.webp new file mode 100644 index 00000000..7ebbcdb9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/6.webp new file mode 100644 index 00000000..4c4908b8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/7.webp new file mode 100644 index 00000000..19f8aecd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/0/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/0.webp new file mode 100644 index 00000000..e29672ba Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/1.webp new file mode 100644 index 00000000..816f2135 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/2.webp new file mode 100644 index 00000000..fc89aef2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/3.webp new file mode 100644 index 00000000..dc5cb640 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/4.webp new file mode 100644 index 00000000..1f0b15ef Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/5.webp new file mode 100644 index 00000000..d07d832e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/6.webp new file mode 100644 index 00000000..ca8bad3f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/7.webp new file mode 100644 index 00000000..9b0ad1fd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/1/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/0.webp new file mode 100644 index 00000000..02cdcb49 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/1.webp new file mode 100644 index 00000000..78d9045b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/2.webp new file mode 100644 index 00000000..0f1f499f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/3.webp new file mode 100644 index 00000000..82f8a0bd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/4.webp new file mode 100644 index 00000000..4f80a141 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/5.webp new file mode 100644 index 00000000..bdabdd76 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/6.webp new file mode 100644 index 00000000..61600f80 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/7.webp new file mode 100644 index 00000000..489911b3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/2/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/0.webp new file mode 100644 index 00000000..662e3203 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/1.webp new file mode 100644 index 00000000..624c81eb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/2.webp new file mode 100644 index 00000000..6fa4332e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/3.webp new file mode 100644 index 00000000..2549c649 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/4.webp new file mode 100644 index 00000000..82a58101 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/5.webp new file mode 100644 index 00000000..3caa0acd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/6.webp new file mode 100644 index 00000000..9c7bff75 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/7.webp new file mode 100644 index 00000000..81279ad0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/3/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/0.webp new file mode 100644 index 00000000..bb794716 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/1.webp new file mode 100644 index 00000000..38283fde Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/2.webp new file mode 100644 index 00000000..115d18bd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/3.webp new file mode 100644 index 00000000..87e747c7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/4.webp new file mode 100644 index 00000000..946abba1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/5.webp new file mode 100644 index 00000000..a094d2e2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/6.webp new file mode 100644 index 00000000..1c16f42b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/7.webp new file mode 100644 index 00000000..a3ef379c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/4/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/0.webp new file mode 100644 index 00000000..da6331ff Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/1.webp new file mode 100644 index 00000000..31fc6c96 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/2.webp new file mode 100644 index 00000000..61e0cfec Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/3.webp new file mode 100644 index 00000000..5ab35e21 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/4.webp new file mode 100644 index 00000000..a0c52bac Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/5.webp new file mode 100644 index 00000000..0f7bb690 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/6.webp new file mode 100644 index 00000000..226fb9d8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/7.webp new file mode 100644 index 00000000..32e0be5f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/5/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/0.webp new file mode 100644 index 00000000..827b7857 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/1.webp new file mode 100644 index 00000000..308b5c2b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/2.webp new file mode 100644 index 00000000..3787be7b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/3.webp new file mode 100644 index 00000000..e4d1bbf4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/4.webp new file mode 100644 index 00000000..1685983e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/5.webp new file mode 100644 index 00000000..0878c565 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/6.webp new file mode 100644 index 00000000..ffee3bd3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/7.webp new file mode 100644 index 00000000..7eb0ce54 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/6/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/0.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/0.webp new file mode 100644 index 00000000..c52bc534 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/0.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/1.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/1.webp new file mode 100644 index 00000000..6662452d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/1.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/2.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/2.webp new file mode 100644 index 00000000..2e8849a8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/2.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/3.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/3.webp new file mode 100644 index 00000000..03ae02e2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/3.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/4.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/4.webp new file mode 100644 index 00000000..b76edf24 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/4.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/5.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/5.webp new file mode 100644 index 00000000..7c616896 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/5.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/6.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/6.webp new file mode 100644 index 00000000..3b25d83d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/6.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/7.webp b/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/7.webp new file mode 100644 index 00000000..6f4dee29 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/modis-mini/5/3/7/7.webp differ diff --git a/tests/readers/tile/fixtures/s2/modis-mini/metadata.json b/tests/readers/tile/fixtures/s2/modis-mini/metadata.json new file mode 100644 index 00000000..e6e3157e --- /dev/null +++ b/tests/readers/tile/fixtures/s2/modis-mini/metadata.json @@ -0,0 +1,264 @@ +{ + "s2tilejson": "1.0.0", + "format": "s2", + "type": "raster", + "extension": "webp", + "scheme": "fzxy", + "encoding": "none", + "minzoom": 0, + "maxzoom": 1, + "version": 1, + "faces": [ + 0, + 1, + 2, + 3, + 4, + 5 + ], + "facesbounds": { + "0": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ] + }, + "1": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ] + }, + "2": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ] + }, + "3": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ] + }, + "4": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ] + }, + "5": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ] + } + }, + "layers": {}, + "attributions": { + "MODIS": "https://modis.gsfc.nasa.gov" + }, + "description": "NASA Modis Dataset Reprojected by S2 MAPS INC.", + "tilestats": { + "0": 1365, + "1": 1365, + "2": 1365, + "3": 1365, + "4": 1365, + "5": 1365, + "total": 8190 + }, + "name": "Modis Raster Dataset" +} \ No newline at end of file diff --git a/tests/readers/tile/fixtures/s2/streets/0/0/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/0/0/0/0.pbf new file mode 100644 index 00000000..897fb07c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/0/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/1/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/0/1/0/0.pbf new file mode 100644 index 00000000..efca9c83 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/1/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/1/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/0/1/0/1.pbf new file mode 100644 index 00000000..59f7c47e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/1/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/1/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/0/1/1/0.pbf new file mode 100644 index 00000000..20d1326a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/1/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/1/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/0/1/1/1.pbf new file mode 100644 index 00000000..4a729e05 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/1/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/2/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/0/2/0/0.pbf new file mode 100644 index 00000000..e8936fe8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/2/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/2/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/0/2/0/1.pbf new file mode 100644 index 00000000..050f237e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/2/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/2/0/2.pbf b/tests/readers/tile/fixtures/s2/streets/0/2/0/2.pbf new file mode 100644 index 00000000..0baeaa6c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/2/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/2/0/3.pbf b/tests/readers/tile/fixtures/s2/streets/0/2/0/3.pbf new file mode 100644 index 00000000..0c029e03 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/2/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/2/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/0/2/1/0.pbf new file mode 100644 index 00000000..91b26140 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/2/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/2/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/0/2/1/1.pbf new file mode 100644 index 00000000..43c48473 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/2/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/2/1/2.pbf b/tests/readers/tile/fixtures/s2/streets/0/2/1/2.pbf new file mode 100644 index 00000000..8c8b193f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/2/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/2/1/3.pbf b/tests/readers/tile/fixtures/s2/streets/0/2/1/3.pbf new file mode 100644 index 00000000..e0d78747 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/2/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/2/2/0.pbf b/tests/readers/tile/fixtures/s2/streets/0/2/2/0.pbf new file mode 100644 index 00000000..d2300dbe Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/2/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/2/2/1.pbf b/tests/readers/tile/fixtures/s2/streets/0/2/2/1.pbf new file mode 100644 index 00000000..73c36fa0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/2/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/2/2/2.pbf b/tests/readers/tile/fixtures/s2/streets/0/2/2/2.pbf new file mode 100644 index 00000000..e523ed7c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/2/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/2/2/3.pbf b/tests/readers/tile/fixtures/s2/streets/0/2/2/3.pbf new file mode 100644 index 00000000..08909c9e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/2/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/2/3/0.pbf b/tests/readers/tile/fixtures/s2/streets/0/2/3/0.pbf new file mode 100644 index 00000000..e9ede41d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/2/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/2/3/1.pbf b/tests/readers/tile/fixtures/s2/streets/0/2/3/1.pbf new file mode 100644 index 00000000..c5528466 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/2/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/2/3/2.pbf b/tests/readers/tile/fixtures/s2/streets/0/2/3/2.pbf new file mode 100644 index 00000000..95e57349 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/2/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/2/3/3.pbf b/tests/readers/tile/fixtures/s2/streets/0/2/3/3.pbf new file mode 100644 index 00000000..06da363f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/2/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/0/0.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/0/1.pbf new file mode 100644 index 00000000..d3dafb41 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/0/2.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/0/2.pbf new file mode 100644 index 00000000..54465ab7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/0/3.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/0/3.pbf new file mode 100644 index 00000000..2f826ee5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/0/4.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/0/4.pbf new file mode 100644 index 00000000..4b3fb8e1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/0/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/0/5.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/0/5.pbf new file mode 100644 index 00000000..8011a16e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/0/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/0/6.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/0/6.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/0/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/0/7.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/0/7.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/0/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/1/0.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/1/1.pbf new file mode 100644 index 00000000..512d2b44 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/1/2.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/1/2.pbf new file mode 100644 index 00000000..6eb29809 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/1/3.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/1/3.pbf new file mode 100644 index 00000000..fd4bbae2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/1/4.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/1/4.pbf new file mode 100644 index 00000000..d84d55a8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/1/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/1/5.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/1/5.pbf new file mode 100644 index 00000000..9c28edd5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/1/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/1/6.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/1/6.pbf new file mode 100644 index 00000000..a444032b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/1/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/1/7.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/1/7.pbf new file mode 100644 index 00000000..6fe45ca3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/1/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/2/0.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/2/0.pbf new file mode 100644 index 00000000..0b4b19e8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/2/1.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/2/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/2/2.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/2/2.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/2/3.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/2/3.pbf new file mode 100644 index 00000000..b8465044 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/2/4.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/2/4.pbf new file mode 100644 index 00000000..2baca597 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/2/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/2/5.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/2/5.pbf new file mode 100644 index 00000000..f826c117 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/2/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/2/6.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/2/6.pbf new file mode 100644 index 00000000..c8031b0b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/2/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/2/7.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/2/7.pbf new file mode 100644 index 00000000..b6fd980e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/2/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/3/0.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/3/0.pbf new file mode 100644 index 00000000..c78a82e0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/3/1.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/3/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/3/2.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/3/2.pbf new file mode 100644 index 00000000..4eb0660d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/3/3.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/3/3.pbf new file mode 100644 index 00000000..2e8a593f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/3/4.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/3/4.pbf new file mode 100644 index 00000000..93fec25d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/3/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/3/5.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/3/5.pbf new file mode 100644 index 00000000..460441f2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/3/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/3/6.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/3/6.pbf new file mode 100644 index 00000000..8e0875f9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/3/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/3/7.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/3/7.pbf new file mode 100644 index 00000000..e1661a21 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/3/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/4/0.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/4/0.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/4/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/4/1.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/4/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/4/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/4/2.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/4/2.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/4/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/4/3.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/4/3.pbf new file mode 100644 index 00000000..ba5262f2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/4/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/4/4.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/4/4.pbf new file mode 100644 index 00000000..09ef08a6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/4/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/4/5.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/4/5.pbf new file mode 100644 index 00000000..676403a3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/4/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/4/6.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/4/6.pbf new file mode 100644 index 00000000..29f4c7b8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/4/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/4/7.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/4/7.pbf new file mode 100644 index 00000000..303e6406 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/4/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/5/0.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/5/0.pbf new file mode 100644 index 00000000..b8df327c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/5/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/5/1.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/5/1.pbf new file mode 100644 index 00000000..ebae639d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/5/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/5/2.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/5/2.pbf new file mode 100644 index 00000000..cceb637e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/5/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/5/3.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/5/3.pbf new file mode 100644 index 00000000..bfa37fb0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/5/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/5/4.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/5/4.pbf new file mode 100644 index 00000000..e7f1e11f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/5/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/5/5.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/5/5.pbf new file mode 100644 index 00000000..76dc082f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/5/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/5/6.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/5/6.pbf new file mode 100644 index 00000000..c3521ffe Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/5/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/5/7.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/5/7.pbf new file mode 100644 index 00000000..1cea874f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/5/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/6/0.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/6/0.pbf new file mode 100644 index 00000000..a09cacad Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/6/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/6/1.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/6/1.pbf new file mode 100644 index 00000000..0a854b35 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/6/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/6/2.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/6/2.pbf new file mode 100644 index 00000000..b2aaa031 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/6/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/6/3.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/6/3.pbf new file mode 100644 index 00000000..b7f696aa Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/6/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/6/4.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/6/4.pbf new file mode 100644 index 00000000..a267f540 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/6/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/6/5.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/6/5.pbf new file mode 100644 index 00000000..cc26fb21 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/6/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/6/6.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/6/6.pbf new file mode 100644 index 00000000..28b65ed3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/6/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/6/7.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/6/7.pbf new file mode 100644 index 00000000..b3d5e3c3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/6/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/7/0.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/7/0.pbf new file mode 100644 index 00000000..a644eb22 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/7/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/7/1.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/7/1.pbf new file mode 100644 index 00000000..f9fc15c9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/7/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/7/2.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/7/2.pbf new file mode 100644 index 00000000..310b4ec4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/7/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/7/3.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/7/3.pbf new file mode 100644 index 00000000..39c6a7ab Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/7/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/7/4.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/7/4.pbf new file mode 100644 index 00000000..9afecc42 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/7/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/7/5.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/7/5.pbf new file mode 100644 index 00000000..4beed889 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/7/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/7/6.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/7/6.pbf new file mode 100644 index 00000000..8626f14b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/7/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/0/3/7/7.pbf b/tests/readers/tile/fixtures/s2/streets/0/3/7/7.pbf new file mode 100644 index 00000000..479e1c5e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/0/3/7/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/0/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/1/0/0/0.pbf new file mode 100644 index 00000000..24b34e8b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/0/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/1/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/1/1/0/0.pbf new file mode 100644 index 00000000..847b55c9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/1/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/1/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/1/1/0/1.pbf new file mode 100644 index 00000000..6c878071 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/1/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/1/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/1/1/1/0.pbf new file mode 100644 index 00000000..839631f6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/1/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/1/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/1/1/1/1.pbf new file mode 100644 index 00000000..0a3e27b1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/1/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/2/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/1/2/0/0.pbf new file mode 100644 index 00000000..0ebd9f9c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/2/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/2/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/1/2/0/1.pbf new file mode 100644 index 00000000..3e11e3af Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/2/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/2/0/2.pbf b/tests/readers/tile/fixtures/s2/streets/1/2/0/2.pbf new file mode 100644 index 00000000..4a5a0762 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/2/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/2/0/3.pbf b/tests/readers/tile/fixtures/s2/streets/1/2/0/3.pbf new file mode 100644 index 00000000..5602697b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/2/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/2/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/1/2/1/0.pbf new file mode 100644 index 00000000..fb01a6af Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/2/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/2/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/1/2/1/1.pbf new file mode 100644 index 00000000..09473fdf Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/2/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/2/1/2.pbf b/tests/readers/tile/fixtures/s2/streets/1/2/1/2.pbf new file mode 100644 index 00000000..975fa035 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/2/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/2/1/3.pbf b/tests/readers/tile/fixtures/s2/streets/1/2/1/3.pbf new file mode 100644 index 00000000..35093162 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/2/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/2/2/0.pbf b/tests/readers/tile/fixtures/s2/streets/1/2/2/0.pbf new file mode 100644 index 00000000..2dbb041d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/2/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/2/2/1.pbf b/tests/readers/tile/fixtures/s2/streets/1/2/2/1.pbf new file mode 100644 index 00000000..139d25b3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/2/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/2/2/2.pbf b/tests/readers/tile/fixtures/s2/streets/1/2/2/2.pbf new file mode 100644 index 00000000..f5b2351a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/2/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/2/2/3.pbf b/tests/readers/tile/fixtures/s2/streets/1/2/2/3.pbf new file mode 100644 index 00000000..5b9ffa0f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/2/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/2/3/0.pbf b/tests/readers/tile/fixtures/s2/streets/1/2/3/0.pbf new file mode 100644 index 00000000..e1df5d2e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/2/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/2/3/1.pbf b/tests/readers/tile/fixtures/s2/streets/1/2/3/1.pbf new file mode 100644 index 00000000..2caa9013 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/2/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/2/3/2.pbf b/tests/readers/tile/fixtures/s2/streets/1/2/3/2.pbf new file mode 100644 index 00000000..a0704975 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/2/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/2/3/3.pbf b/tests/readers/tile/fixtures/s2/streets/1/2/3/3.pbf new file mode 100644 index 00000000..3ceae055 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/2/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/0/0.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/0/1.pbf new file mode 100644 index 00000000..54061c44 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/0/2.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/0/2.pbf new file mode 100644 index 00000000..ac084e16 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/0/3.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/0/3.pbf new file mode 100644 index 00000000..2d9368f0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/0/4.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/0/4.pbf new file mode 100644 index 00000000..5c4564a0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/0/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/0/5.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/0/5.pbf new file mode 100644 index 00000000..da60fdfe Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/0/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/0/6.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/0/6.pbf new file mode 100644 index 00000000..569c846d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/0/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/0/7.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/0/7.pbf new file mode 100644 index 00000000..26146bea Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/0/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/1/0.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/1/1.pbf new file mode 100644 index 00000000..dae92581 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/1/2.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/1/2.pbf new file mode 100644 index 00000000..5e1e0fca Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/1/3.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/1/3.pbf new file mode 100644 index 00000000..1e07ea75 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/1/4.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/1/4.pbf new file mode 100644 index 00000000..eb96e2cd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/1/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/1/5.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/1/5.pbf new file mode 100644 index 00000000..0bb112e4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/1/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/1/6.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/1/6.pbf new file mode 100644 index 00000000..abf31da2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/1/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/1/7.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/1/7.pbf new file mode 100644 index 00000000..130b269d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/1/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/2/0.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/2/0.pbf new file mode 100644 index 00000000..3f61282d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/2/1.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/2/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/2/2.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/2/2.pbf new file mode 100644 index 00000000..d3d80479 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/2/3.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/2/3.pbf new file mode 100644 index 00000000..d3f5bcbb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/2/4.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/2/4.pbf new file mode 100644 index 00000000..2d57f4b2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/2/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/2/5.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/2/5.pbf new file mode 100644 index 00000000..76111b13 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/2/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/2/6.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/2/6.pbf new file mode 100644 index 00000000..933917b5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/2/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/2/7.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/2/7.pbf new file mode 100644 index 00000000..8401b352 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/2/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/3/0.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/3/0.pbf new file mode 100644 index 00000000..85913844 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/3/1.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/3/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/3/2.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/3/2.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/3/3.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/3/3.pbf new file mode 100644 index 00000000..b19c3037 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/3/4.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/3/4.pbf new file mode 100644 index 00000000..49aed3c1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/3/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/3/5.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/3/5.pbf new file mode 100644 index 00000000..5bf459b3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/3/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/3/6.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/3/6.pbf new file mode 100644 index 00000000..20baedf2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/3/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/3/7.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/3/7.pbf new file mode 100644 index 00000000..bdb1d2a3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/3/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/4/0.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/4/0.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/4/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/4/1.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/4/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/4/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/4/2.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/4/2.pbf new file mode 100644 index 00000000..46c05db3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/4/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/4/3.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/4/3.pbf new file mode 100644 index 00000000..31035a7f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/4/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/4/4.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/4/4.pbf new file mode 100644 index 00000000..96118a23 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/4/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/4/5.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/4/5.pbf new file mode 100644 index 00000000..589c6c9b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/4/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/4/6.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/4/6.pbf new file mode 100644 index 00000000..957173b3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/4/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/4/7.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/4/7.pbf new file mode 100644 index 00000000..8ad12b45 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/4/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/5/0.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/5/0.pbf new file mode 100644 index 00000000..a37809e2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/5/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/5/1.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/5/1.pbf new file mode 100644 index 00000000..8da7ee68 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/5/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/5/2.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/5/2.pbf new file mode 100644 index 00000000..a9c39902 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/5/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/5/3.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/5/3.pbf new file mode 100644 index 00000000..a5324527 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/5/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/5/4.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/5/4.pbf new file mode 100644 index 00000000..90a1f71e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/5/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/5/5.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/5/5.pbf new file mode 100644 index 00000000..de773503 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/5/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/5/6.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/5/6.pbf new file mode 100644 index 00000000..f931e2f2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/5/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/5/7.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/5/7.pbf new file mode 100644 index 00000000..23b69e7c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/5/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/6/0.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/6/0.pbf new file mode 100644 index 00000000..89a6fabc Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/6/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/6/1.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/6/1.pbf new file mode 100644 index 00000000..e6a1bdba Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/6/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/6/2.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/6/2.pbf new file mode 100644 index 00000000..59fa9f1a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/6/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/6/3.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/6/3.pbf new file mode 100644 index 00000000..084afc36 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/6/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/6/4.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/6/4.pbf new file mode 100644 index 00000000..307e9a00 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/6/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/6/5.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/6/5.pbf new file mode 100644 index 00000000..24ed90b0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/6/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/6/6.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/6/6.pbf new file mode 100644 index 00000000..43d64fb4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/6/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/6/7.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/6/7.pbf new file mode 100644 index 00000000..e8b2f31d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/6/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/7/0.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/7/0.pbf new file mode 100644 index 00000000..21445983 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/7/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/7/1.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/7/1.pbf new file mode 100644 index 00000000..85795f96 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/7/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/7/2.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/7/2.pbf new file mode 100644 index 00000000..c8f3556d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/7/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/7/3.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/7/3.pbf new file mode 100644 index 00000000..b5bbdadf Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/7/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/7/4.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/7/4.pbf new file mode 100644 index 00000000..f9229df3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/7/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/7/5.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/7/5.pbf new file mode 100644 index 00000000..ee60b1b3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/7/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/7/6.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/7/6.pbf new file mode 100644 index 00000000..015d055d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/7/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/1/3/7/7.pbf b/tests/readers/tile/fixtures/s2/streets/1/3/7/7.pbf new file mode 100644 index 00000000..8c592248 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/1/3/7/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/0/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/2/0/0/0.pbf new file mode 100644 index 00000000..328b8cfb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/0/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/1/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/2/1/0/0.pbf new file mode 100644 index 00000000..7f780376 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/1/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/1/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/2/1/0/1.pbf new file mode 100644 index 00000000..61c85325 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/1/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/1/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/2/1/1/0.pbf new file mode 100644 index 00000000..d2dbdb21 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/1/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/1/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/2/1/1/1.pbf new file mode 100644 index 00000000..fc252cb8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/1/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/2/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/2/2/0/0.pbf new file mode 100644 index 00000000..54c7c5bb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/2/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/2/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/2/2/0/1.pbf new file mode 100644 index 00000000..86b8a60f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/2/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/2/0/2.pbf b/tests/readers/tile/fixtures/s2/streets/2/2/0/2.pbf new file mode 100644 index 00000000..481f2a77 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/2/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/2/0/3.pbf b/tests/readers/tile/fixtures/s2/streets/2/2/0/3.pbf new file mode 100644 index 00000000..abe7a234 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/2/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/2/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/2/2/1/0.pbf new file mode 100644 index 00000000..8ee5ab34 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/2/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/2/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/2/2/1/1.pbf new file mode 100644 index 00000000..50fe5764 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/2/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/2/1/2.pbf b/tests/readers/tile/fixtures/s2/streets/2/2/1/2.pbf new file mode 100644 index 00000000..6d827108 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/2/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/2/1/3.pbf b/tests/readers/tile/fixtures/s2/streets/2/2/1/3.pbf new file mode 100644 index 00000000..b2e861ec Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/2/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/2/2/0.pbf b/tests/readers/tile/fixtures/s2/streets/2/2/2/0.pbf new file mode 100644 index 00000000..973f303a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/2/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/2/2/1.pbf b/tests/readers/tile/fixtures/s2/streets/2/2/2/1.pbf new file mode 100644 index 00000000..8cbd2864 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/2/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/2/2/2.pbf b/tests/readers/tile/fixtures/s2/streets/2/2/2/2.pbf new file mode 100644 index 00000000..84ff7fa0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/2/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/2/2/3.pbf b/tests/readers/tile/fixtures/s2/streets/2/2/2/3.pbf new file mode 100644 index 00000000..c1acf722 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/2/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/2/3/0.pbf b/tests/readers/tile/fixtures/s2/streets/2/2/3/0.pbf new file mode 100644 index 00000000..f9c4efc6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/2/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/2/3/1.pbf b/tests/readers/tile/fixtures/s2/streets/2/2/3/1.pbf new file mode 100644 index 00000000..7d0fdf75 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/2/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/2/3/2.pbf b/tests/readers/tile/fixtures/s2/streets/2/2/3/2.pbf new file mode 100644 index 00000000..8a22fbe0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/2/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/2/3/3.pbf b/tests/readers/tile/fixtures/s2/streets/2/2/3/3.pbf new file mode 100644 index 00000000..036bdc85 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/2/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/0/0.pbf new file mode 100644 index 00000000..eb9c4683 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/0/1.pbf new file mode 100644 index 00000000..8004c124 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/0/2.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/0/2.pbf new file mode 100644 index 00000000..2028701e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/0/3.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/0/3.pbf new file mode 100644 index 00000000..b6aedbb6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/0/4.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/0/4.pbf new file mode 100644 index 00000000..657afd3c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/0/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/0/5.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/0/5.pbf new file mode 100644 index 00000000..20cb7333 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/0/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/0/6.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/0/6.pbf new file mode 100644 index 00000000..10e2fdc5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/0/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/0/7.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/0/7.pbf new file mode 100644 index 00000000..4d93998b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/0/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/1/0.pbf new file mode 100644 index 00000000..dbba5c20 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/1/1.pbf new file mode 100644 index 00000000..176afee0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/1/2.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/1/2.pbf new file mode 100644 index 00000000..5c5e3b67 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/1/3.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/1/3.pbf new file mode 100644 index 00000000..05cd140f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/1/4.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/1/4.pbf new file mode 100644 index 00000000..cfd9cf8f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/1/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/1/5.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/1/5.pbf new file mode 100644 index 00000000..67b3cddb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/1/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/1/6.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/1/6.pbf new file mode 100644 index 00000000..94490585 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/1/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/1/7.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/1/7.pbf new file mode 100644 index 00000000..033abdd6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/1/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/2/0.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/2/0.pbf new file mode 100644 index 00000000..6acdcc06 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/2/1.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/2/1.pbf new file mode 100644 index 00000000..b59301bf Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/2/2.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/2/2.pbf new file mode 100644 index 00000000..90bf3731 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/2/3.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/2/3.pbf new file mode 100644 index 00000000..4d421edd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/2/4.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/2/4.pbf new file mode 100644 index 00000000..d0d20b82 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/2/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/2/5.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/2/5.pbf new file mode 100644 index 00000000..57465a42 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/2/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/2/6.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/2/6.pbf new file mode 100644 index 00000000..c51e9b6b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/2/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/2/7.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/2/7.pbf new file mode 100644 index 00000000..bbb3a6d0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/2/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/3/0.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/3/0.pbf new file mode 100644 index 00000000..4fa0cb91 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/3/1.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/3/1.pbf new file mode 100644 index 00000000..de3bd325 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/3/2.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/3/2.pbf new file mode 100644 index 00000000..7d77a437 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/3/3.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/3/3.pbf new file mode 100644 index 00000000..a3f3ecdb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/3/4.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/3/4.pbf new file mode 100644 index 00000000..c4b31eca Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/3/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/3/5.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/3/5.pbf new file mode 100644 index 00000000..66908a1f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/3/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/3/6.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/3/6.pbf new file mode 100644 index 00000000..3a729f9a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/3/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/3/7.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/3/7.pbf new file mode 100644 index 00000000..9e3b339b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/3/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/4/0.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/4/0.pbf new file mode 100644 index 00000000..92df1c3e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/4/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/4/1.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/4/1.pbf new file mode 100644 index 00000000..d8ded5a7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/4/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/4/2.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/4/2.pbf new file mode 100644 index 00000000..3d316b83 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/4/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/4/3.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/4/3.pbf new file mode 100644 index 00000000..73152ff7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/4/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/4/4.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/4/4.pbf new file mode 100644 index 00000000..71bcdda2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/4/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/4/5.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/4/5.pbf new file mode 100644 index 00000000..05262d53 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/4/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/4/6.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/4/6.pbf new file mode 100644 index 00000000..84b83e5d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/4/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/4/7.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/4/7.pbf new file mode 100644 index 00000000..3a173216 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/4/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/5/0.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/5/0.pbf new file mode 100644 index 00000000..90be066e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/5/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/5/1.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/5/1.pbf new file mode 100644 index 00000000..3d639249 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/5/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/5/2.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/5/2.pbf new file mode 100644 index 00000000..9c1d1db6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/5/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/5/3.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/5/3.pbf new file mode 100644 index 00000000..64aebe86 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/5/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/5/4.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/5/4.pbf new file mode 100644 index 00000000..e728e6d0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/5/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/5/5.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/5/5.pbf new file mode 100644 index 00000000..f722ec52 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/5/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/5/6.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/5/6.pbf new file mode 100644 index 00000000..b726add7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/5/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/5/7.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/5/7.pbf new file mode 100644 index 00000000..81c00270 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/5/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/6/0.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/6/0.pbf new file mode 100644 index 00000000..b05d1048 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/6/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/6/1.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/6/1.pbf new file mode 100644 index 00000000..13a3ba26 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/6/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/6/2.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/6/2.pbf new file mode 100644 index 00000000..f9eb56e4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/6/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/6/3.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/6/3.pbf new file mode 100644 index 00000000..1fd2886e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/6/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/6/4.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/6/4.pbf new file mode 100644 index 00000000..89f736bb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/6/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/6/5.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/6/5.pbf new file mode 100644 index 00000000..3f49ad1b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/6/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/6/6.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/6/6.pbf new file mode 100644 index 00000000..a76ad1d9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/6/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/6/7.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/6/7.pbf new file mode 100644 index 00000000..1cc4de64 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/6/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/7/0.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/7/0.pbf new file mode 100644 index 00000000..27c6c220 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/7/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/7/1.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/7/1.pbf new file mode 100644 index 00000000..aef11e3c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/7/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/7/2.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/7/2.pbf new file mode 100644 index 00000000..85f9dabc Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/7/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/7/3.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/7/3.pbf new file mode 100644 index 00000000..9037aad1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/7/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/7/4.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/7/4.pbf new file mode 100644 index 00000000..b97fadb9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/7/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/7/5.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/7/5.pbf new file mode 100644 index 00000000..0f2bd382 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/7/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/7/6.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/7/6.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/7/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/2/3/7/7.pbf b/tests/readers/tile/fixtures/s2/streets/2/3/7/7.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/2/3/7/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/0/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/3/0/0/0.pbf new file mode 100644 index 00000000..80137ec9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/0/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/1/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/3/1/0/0.pbf new file mode 100644 index 00000000..9ae4baaf Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/1/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/1/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/3/1/0/1.pbf new file mode 100644 index 00000000..0dcd0865 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/1/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/1/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/3/1/1/0.pbf new file mode 100644 index 00000000..f15d8171 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/1/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/1/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/3/1/1/1.pbf new file mode 100644 index 00000000..ea526623 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/1/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/2/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/3/2/0/0.pbf new file mode 100644 index 00000000..9c0963e2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/2/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/2/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/3/2/0/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/2/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/2/0/2.pbf b/tests/readers/tile/fixtures/s2/streets/3/2/0/2.pbf new file mode 100644 index 00000000..bb3aa433 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/2/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/2/0/3.pbf b/tests/readers/tile/fixtures/s2/streets/3/2/0/3.pbf new file mode 100644 index 00000000..a6bd5431 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/2/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/2/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/3/2/1/0.pbf new file mode 100644 index 00000000..0b521d66 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/2/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/2/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/3/2/1/1.pbf new file mode 100644 index 00000000..e305861a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/2/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/2/1/2.pbf b/tests/readers/tile/fixtures/s2/streets/3/2/1/2.pbf new file mode 100644 index 00000000..af3bef1a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/2/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/2/1/3.pbf b/tests/readers/tile/fixtures/s2/streets/3/2/1/3.pbf new file mode 100644 index 00000000..ef0e1d5e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/2/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/2/2/0.pbf b/tests/readers/tile/fixtures/s2/streets/3/2/2/0.pbf new file mode 100644 index 00000000..6652ff50 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/2/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/2/2/1.pbf b/tests/readers/tile/fixtures/s2/streets/3/2/2/1.pbf new file mode 100644 index 00000000..89e125cb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/2/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/2/2/2.pbf b/tests/readers/tile/fixtures/s2/streets/3/2/2/2.pbf new file mode 100644 index 00000000..64e28e81 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/2/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/2/2/3.pbf b/tests/readers/tile/fixtures/s2/streets/3/2/2/3.pbf new file mode 100644 index 00000000..b04ab1f1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/2/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/2/3/0.pbf b/tests/readers/tile/fixtures/s2/streets/3/2/3/0.pbf new file mode 100644 index 00000000..5376a24e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/2/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/2/3/1.pbf b/tests/readers/tile/fixtures/s2/streets/3/2/3/1.pbf new file mode 100644 index 00000000..81b06696 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/2/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/2/3/2.pbf b/tests/readers/tile/fixtures/s2/streets/3/2/3/2.pbf new file mode 100644 index 00000000..cc7942bf Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/2/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/2/3/3.pbf b/tests/readers/tile/fixtures/s2/streets/3/2/3/3.pbf new file mode 100644 index 00000000..8c6cb6c1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/2/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/0/0.pbf new file mode 100644 index 00000000..91b27a87 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/0/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/0/2.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/0/2.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/0/3.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/0/3.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/0/4.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/0/4.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/0/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/0/5.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/0/5.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/0/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/0/6.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/0/6.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/0/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/0/7.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/0/7.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/0/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/1/0.pbf new file mode 100644 index 00000000..db716b5f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/1/1.pbf new file mode 100644 index 00000000..3962c5f9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/1/2.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/1/2.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/1/3.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/1/3.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/1/4.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/1/4.pbf new file mode 100644 index 00000000..44c490d0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/1/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/1/5.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/1/5.pbf new file mode 100644 index 00000000..872d8e59 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/1/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/1/6.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/1/6.pbf new file mode 100644 index 00000000..2cb862cb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/1/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/1/7.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/1/7.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/1/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/2/0.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/2/0.pbf new file mode 100644 index 00000000..983621bd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/2/1.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/2/1.pbf new file mode 100644 index 00000000..6d031716 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/2/2.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/2/2.pbf new file mode 100644 index 00000000..ecb3821d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/2/3.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/2/3.pbf new file mode 100644 index 00000000..f60da08a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/2/4.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/2/4.pbf new file mode 100644 index 00000000..f45f2886 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/2/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/2/5.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/2/5.pbf new file mode 100644 index 00000000..14caeb1e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/2/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/2/6.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/2/6.pbf new file mode 100644 index 00000000..554abe03 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/2/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/2/7.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/2/7.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/2/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/3/0.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/3/0.pbf new file mode 100644 index 00000000..617c9ed4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/3/1.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/3/1.pbf new file mode 100644 index 00000000..4fa2c09b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/3/2.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/3/2.pbf new file mode 100644 index 00000000..14fdd848 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/3/3.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/3/3.pbf new file mode 100644 index 00000000..ce451195 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/3/4.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/3/4.pbf new file mode 100644 index 00000000..7635f92f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/3/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/3/5.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/3/5.pbf new file mode 100644 index 00000000..eed513cb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/3/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/3/6.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/3/6.pbf new file mode 100644 index 00000000..b88e23fc Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/3/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/3/7.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/3/7.pbf new file mode 100644 index 00000000..c06dd91a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/3/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/4/0.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/4/0.pbf new file mode 100644 index 00000000..8b4595a0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/4/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/4/1.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/4/1.pbf new file mode 100644 index 00000000..39cbbb0e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/4/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/4/2.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/4/2.pbf new file mode 100644 index 00000000..6d03e2e7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/4/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/4/3.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/4/3.pbf new file mode 100644 index 00000000..6992fd36 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/4/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/4/4.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/4/4.pbf new file mode 100644 index 00000000..2a61dd1e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/4/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/4/5.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/4/5.pbf new file mode 100644 index 00000000..3c11f57a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/4/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/4/6.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/4/6.pbf new file mode 100644 index 00000000..57dc474d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/4/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/4/7.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/4/7.pbf new file mode 100644 index 00000000..5bdc71b1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/4/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/5/0.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/5/0.pbf new file mode 100644 index 00000000..204fe571 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/5/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/5/1.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/5/1.pbf new file mode 100644 index 00000000..86bd515a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/5/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/5/2.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/5/2.pbf new file mode 100644 index 00000000..b6fa2f64 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/5/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/5/3.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/5/3.pbf new file mode 100644 index 00000000..d218bcbf Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/5/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/5/4.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/5/4.pbf new file mode 100644 index 00000000..81c6b098 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/5/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/5/5.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/5/5.pbf new file mode 100644 index 00000000..8c3c922d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/5/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/5/6.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/5/6.pbf new file mode 100644 index 00000000..d24557e9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/5/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/5/7.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/5/7.pbf new file mode 100644 index 00000000..ddaa8049 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/5/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/6/0.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/6/0.pbf new file mode 100644 index 00000000..0d0e45c1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/6/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/6/1.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/6/1.pbf new file mode 100644 index 00000000..c11c3a06 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/6/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/6/2.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/6/2.pbf new file mode 100644 index 00000000..079aea57 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/6/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/6/3.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/6/3.pbf new file mode 100644 index 00000000..8c2fd9db Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/6/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/6/4.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/6/4.pbf new file mode 100644 index 00000000..e6b4f18f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/6/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/6/5.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/6/5.pbf new file mode 100644 index 00000000..e2978171 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/6/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/6/6.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/6/6.pbf new file mode 100644 index 00000000..7ea78fa5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/6/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/6/7.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/6/7.pbf new file mode 100644 index 00000000..7a7b2548 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/6/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/7/0.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/7/0.pbf new file mode 100644 index 00000000..51fe648f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/7/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/7/1.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/7/1.pbf new file mode 100644 index 00000000..c9ec76e6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/7/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/7/2.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/7/2.pbf new file mode 100644 index 00000000..94117c39 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/7/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/7/3.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/7/3.pbf new file mode 100644 index 00000000..e5163ee4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/7/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/7/4.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/7/4.pbf new file mode 100644 index 00000000..2614abf7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/7/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/7/5.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/7/5.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/7/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/7/6.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/7/6.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/7/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/3/3/7/7.pbf b/tests/readers/tile/fixtures/s2/streets/3/3/7/7.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/3/3/7/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/0/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/4/0/0/0.pbf new file mode 100644 index 00000000..02c99d09 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/0/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/1/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/4/1/0/0.pbf new file mode 100644 index 00000000..67a83e4a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/1/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/1/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/4/1/0/1.pbf new file mode 100644 index 00000000..b98d591d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/1/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/1/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/4/1/1/0.pbf new file mode 100644 index 00000000..d005b7ad Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/1/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/1/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/4/1/1/1.pbf new file mode 100644 index 00000000..51c7db64 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/1/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/2/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/4/2/0/0.pbf new file mode 100644 index 00000000..860d3dc9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/2/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/2/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/4/2/0/1.pbf new file mode 100644 index 00000000..dad0188c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/2/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/2/0/2.pbf b/tests/readers/tile/fixtures/s2/streets/4/2/0/2.pbf new file mode 100644 index 00000000..7bf1f530 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/2/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/2/0/3.pbf b/tests/readers/tile/fixtures/s2/streets/4/2/0/3.pbf new file mode 100644 index 00000000..9d553793 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/2/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/2/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/4/2/1/0.pbf new file mode 100644 index 00000000..4a30abed Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/2/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/2/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/4/2/1/1.pbf new file mode 100644 index 00000000..e257a51f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/2/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/2/1/2.pbf b/tests/readers/tile/fixtures/s2/streets/4/2/1/2.pbf new file mode 100644 index 00000000..84e0adc4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/2/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/2/1/3.pbf b/tests/readers/tile/fixtures/s2/streets/4/2/1/3.pbf new file mode 100644 index 00000000..1511b6fe Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/2/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/2/2/0.pbf b/tests/readers/tile/fixtures/s2/streets/4/2/2/0.pbf new file mode 100644 index 00000000..fe932de4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/2/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/2/2/1.pbf b/tests/readers/tile/fixtures/s2/streets/4/2/2/1.pbf new file mode 100644 index 00000000..eaca12a0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/2/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/2/2/2.pbf b/tests/readers/tile/fixtures/s2/streets/4/2/2/2.pbf new file mode 100644 index 00000000..9ec0c94c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/2/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/2/2/3.pbf b/tests/readers/tile/fixtures/s2/streets/4/2/2/3.pbf new file mode 100644 index 00000000..4fe8d67e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/2/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/2/3/0.pbf b/tests/readers/tile/fixtures/s2/streets/4/2/3/0.pbf new file mode 100644 index 00000000..6faec860 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/2/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/2/3/1.pbf b/tests/readers/tile/fixtures/s2/streets/4/2/3/1.pbf new file mode 100644 index 00000000..8b8616d9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/2/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/2/3/2.pbf b/tests/readers/tile/fixtures/s2/streets/4/2/3/2.pbf new file mode 100644 index 00000000..6e55564e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/2/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/2/3/3.pbf b/tests/readers/tile/fixtures/s2/streets/4/2/3/3.pbf new file mode 100644 index 00000000..02736b60 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/2/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/0/0.pbf new file mode 100644 index 00000000..54b23cbb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/0/1.pbf new file mode 100644 index 00000000..9e787c2e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/0/2.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/0/2.pbf new file mode 100644 index 00000000..c6e89afe Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/0/3.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/0/3.pbf new file mode 100644 index 00000000..64050127 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/0/4.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/0/4.pbf new file mode 100644 index 00000000..a9e3c8c2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/0/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/0/5.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/0/5.pbf new file mode 100644 index 00000000..99874ee4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/0/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/0/6.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/0/6.pbf new file mode 100644 index 00000000..66c613d5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/0/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/0/7.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/0/7.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/0/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/1/0.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/1/1.pbf new file mode 100644 index 00000000..4ae8f7ef Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/1/2.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/1/2.pbf new file mode 100644 index 00000000..04602b38 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/1/3.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/1/3.pbf new file mode 100644 index 00000000..d23d8eb0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/1/4.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/1/4.pbf new file mode 100644 index 00000000..40adab57 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/1/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/1/5.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/1/5.pbf new file mode 100644 index 00000000..3cb0fa04 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/1/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/1/6.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/1/6.pbf new file mode 100644 index 00000000..4748c4e7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/1/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/1/7.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/1/7.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/1/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/2/0.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/2/0.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/2/1.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/2/1.pbf new file mode 100644 index 00000000..b9df66a9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/2/2.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/2/2.pbf new file mode 100644 index 00000000..cf793756 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/2/3.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/2/3.pbf new file mode 100644 index 00000000..f303f42a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/2/4.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/2/4.pbf new file mode 100644 index 00000000..dc10f82d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/2/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/2/5.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/2/5.pbf new file mode 100644 index 00000000..751d6ccd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/2/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/2/6.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/2/6.pbf new file mode 100644 index 00000000..2e6e56db Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/2/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/2/7.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/2/7.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/2/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/3/0.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/3/0.pbf new file mode 100644 index 00000000..e930c332 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/3/1.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/3/1.pbf new file mode 100644 index 00000000..0b263ab9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/3/2.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/3/2.pbf new file mode 100644 index 00000000..165f70fb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/3/3.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/3/3.pbf new file mode 100644 index 00000000..62265b30 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/3/4.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/3/4.pbf new file mode 100644 index 00000000..2c385cce Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/3/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/3/5.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/3/5.pbf new file mode 100644 index 00000000..520c6384 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/3/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/3/6.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/3/6.pbf new file mode 100644 index 00000000..f0a00202 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/3/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/3/7.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/3/7.pbf new file mode 100644 index 00000000..2344f23a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/3/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/4/0.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/4/0.pbf new file mode 100644 index 00000000..1d523cae Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/4/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/4/1.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/4/1.pbf new file mode 100644 index 00000000..f3cb4108 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/4/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/4/2.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/4/2.pbf new file mode 100644 index 00000000..d27fc887 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/4/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/4/3.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/4/3.pbf new file mode 100644 index 00000000..432e762d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/4/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/4/4.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/4/4.pbf new file mode 100644 index 00000000..d8a6fe64 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/4/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/4/5.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/4/5.pbf new file mode 100644 index 00000000..8361e68d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/4/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/4/6.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/4/6.pbf new file mode 100644 index 00000000..70c462c3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/4/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/4/7.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/4/7.pbf new file mode 100644 index 00000000..8290e9be Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/4/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/5/0.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/5/0.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/5/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/5/1.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/5/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/5/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/5/2.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/5/2.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/5/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/5/3.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/5/3.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/5/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/5/4.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/5/4.pbf new file mode 100644 index 00000000..9038a81f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/5/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/5/5.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/5/5.pbf new file mode 100644 index 00000000..5e6d14a6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/5/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/5/6.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/5/6.pbf new file mode 100644 index 00000000..1bb25d7a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/5/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/5/7.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/5/7.pbf new file mode 100644 index 00000000..7bcdbe1f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/5/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/6/0.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/6/0.pbf new file mode 100644 index 00000000..847cb318 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/6/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/6/1.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/6/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/6/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/6/2.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/6/2.pbf new file mode 100644 index 00000000..07a9e3fd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/6/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/6/3.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/6/3.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/6/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/6/4.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/6/4.pbf new file mode 100644 index 00000000..56ff9c6b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/6/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/6/5.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/6/5.pbf new file mode 100644 index 00000000..901e5613 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/6/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/6/6.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/6/6.pbf new file mode 100644 index 00000000..e3545a72 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/6/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/6/7.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/6/7.pbf new file mode 100644 index 00000000..a731029d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/6/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/7/0.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/7/0.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/7/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/7/1.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/7/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/7/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/7/2.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/7/2.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/7/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/7/3.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/7/3.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/7/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/7/4.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/7/4.pbf new file mode 100644 index 00000000..fed3c966 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/7/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/7/5.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/7/5.pbf new file mode 100644 index 00000000..2140a829 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/7/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/7/6.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/7/6.pbf new file mode 100644 index 00000000..2f4d5ac8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/7/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/4/3/7/7.pbf b/tests/readers/tile/fixtures/s2/streets/4/3/7/7.pbf new file mode 100644 index 00000000..b679d6c2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/4/3/7/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/0/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/5/0/0/0.pbf new file mode 100644 index 00000000..30411fec Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/0/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/1/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/5/1/0/0.pbf new file mode 100644 index 00000000..2200db5a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/1/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/1/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/5/1/0/1.pbf new file mode 100644 index 00000000..1dfc8940 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/1/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/1/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/5/1/1/0.pbf new file mode 100644 index 00000000..1ca8406f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/1/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/1/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/5/1/1/1.pbf new file mode 100644 index 00000000..c748ebe8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/1/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/2/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/5/2/0/0.pbf new file mode 100644 index 00000000..f4a9c0c4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/2/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/2/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/5/2/0/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/2/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/2/0/2.pbf b/tests/readers/tile/fixtures/s2/streets/5/2/0/2.pbf new file mode 100644 index 00000000..cd0fdb3b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/2/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/2/0/3.pbf b/tests/readers/tile/fixtures/s2/streets/5/2/0/3.pbf new file mode 100644 index 00000000..b387b4eb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/2/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/2/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/5/2/1/0.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/2/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/2/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/5/2/1/1.pbf new file mode 100644 index 00000000..cc6ee5da Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/2/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/2/1/2.pbf b/tests/readers/tile/fixtures/s2/streets/5/2/1/2.pbf new file mode 100644 index 00000000..1cbf2bc9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/2/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/2/1/3.pbf b/tests/readers/tile/fixtures/s2/streets/5/2/1/3.pbf new file mode 100644 index 00000000..b3a856a1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/2/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/2/2/0.pbf b/tests/readers/tile/fixtures/s2/streets/5/2/2/0.pbf new file mode 100644 index 00000000..20d7dda4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/2/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/2/2/1.pbf b/tests/readers/tile/fixtures/s2/streets/5/2/2/1.pbf new file mode 100644 index 00000000..26fecb69 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/2/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/2/2/2.pbf b/tests/readers/tile/fixtures/s2/streets/5/2/2/2.pbf new file mode 100644 index 00000000..f4047395 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/2/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/2/2/3.pbf b/tests/readers/tile/fixtures/s2/streets/5/2/2/3.pbf new file mode 100644 index 00000000..1067ef8e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/2/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/2/3/0.pbf b/tests/readers/tile/fixtures/s2/streets/5/2/3/0.pbf new file mode 100644 index 00000000..9f9020e8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/2/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/2/3/1.pbf b/tests/readers/tile/fixtures/s2/streets/5/2/3/1.pbf new file mode 100644 index 00000000..ddc833ad Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/2/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/2/3/2.pbf b/tests/readers/tile/fixtures/s2/streets/5/2/3/2.pbf new file mode 100644 index 00000000..3f8686e6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/2/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/2/3/3.pbf b/tests/readers/tile/fixtures/s2/streets/5/2/3/3.pbf new file mode 100644 index 00000000..20254ee2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/2/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/0/0.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/0/0.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/0/1.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/0/1.pbf new file mode 100644 index 00000000..06521785 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/0/2.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/0/2.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/0/3.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/0/3.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/0/4.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/0/4.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/0/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/0/5.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/0/5.pbf new file mode 100644 index 00000000..4c8db85f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/0/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/0/6.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/0/6.pbf new file mode 100644 index 00000000..d59ec59a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/0/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/0/7.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/0/7.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/0/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/1/0.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/1/0.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/1/1.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/1/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/1/2.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/1/2.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/1/3.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/1/3.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/1/4.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/1/4.pbf new file mode 100644 index 00000000..faddd7b1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/1/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/1/5.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/1/5.pbf new file mode 100644 index 00000000..18d3c423 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/1/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/1/6.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/1/6.pbf new file mode 100644 index 00000000..0b0d4466 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/1/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/1/7.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/1/7.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/1/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/2/0.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/2/0.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/2/1.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/2/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/2/2.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/2/2.pbf new file mode 100644 index 00000000..86949ac4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/2/3.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/2/3.pbf new file mode 100644 index 00000000..fa034f05 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/2/4.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/2/4.pbf new file mode 100644 index 00000000..f49d88be Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/2/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/2/5.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/2/5.pbf new file mode 100644 index 00000000..769a9bde Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/2/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/2/6.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/2/6.pbf new file mode 100644 index 00000000..205ef5e5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/2/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/2/7.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/2/7.pbf new file mode 100644 index 00000000..c66f260b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/2/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/3/0.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/3/0.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/3/1.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/3/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/3/2.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/3/2.pbf new file mode 100644 index 00000000..8457799c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/3/3.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/3/3.pbf new file mode 100644 index 00000000..baa2467f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/3/4.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/3/4.pbf new file mode 100644 index 00000000..b99ae3db Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/3/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/3/5.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/3/5.pbf new file mode 100644 index 00000000..8fe5282b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/3/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/3/6.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/3/6.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/3/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/3/7.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/3/7.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/3/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/4/0.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/4/0.pbf new file mode 100644 index 00000000..c61dc0ed Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/4/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/4/1.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/4/1.pbf new file mode 100644 index 00000000..4da45e35 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/4/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/4/2.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/4/2.pbf new file mode 100644 index 00000000..305f23d9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/4/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/4/3.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/4/3.pbf new file mode 100644 index 00000000..d233a8b9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/4/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/4/4.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/4/4.pbf new file mode 100644 index 00000000..23dc8b8b --- /dev/null +++ b/tests/readers/tile/fixtures/s2/streets/5/3/4/4.pbf @@ -0,0 +1,3 @@ + nl1ZK]ba$? LR3i7Quhx:˕KOPAj1Fk +oP?`tXHk yL܆xf +-~wJ"ݡIDe9A%IYU`4dbm+ PL[phD*TF tM<#/m\R,!T'pZ7$fu1`XF> \3Bf@'#'>)[Uv%M0tmь1Na33~O^ߐG[_ 9OzR`|`E_E-mÌ|C\ \ No newline at end of file diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/4/5.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/4/5.pbf new file mode 100644 index 00000000..b79e1ca3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/4/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/4/6.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/4/6.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/4/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/4/7.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/4/7.pbf new file mode 100644 index 00000000..03e2ee91 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/4/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/5/0.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/5/0.pbf new file mode 100644 index 00000000..3d9c4678 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/5/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/5/1.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/5/1.pbf new file mode 100644 index 00000000..b25c8d05 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/5/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/5/2.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/5/2.pbf new file mode 100644 index 00000000..97295452 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/5/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/5/3.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/5/3.pbf new file mode 100644 index 00000000..aa9be37c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/5/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/5/4.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/5/4.pbf new file mode 100644 index 00000000..1aacf71f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/5/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/5/5.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/5/5.pbf new file mode 100644 index 00000000..7aafc971 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/5/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/5/6.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/5/6.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/5/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/5/7.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/5/7.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/5/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/6/0.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/6/0.pbf new file mode 100644 index 00000000..63f3ff62 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/6/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/6/1.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/6/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/6/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/6/2.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/6/2.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/6/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/6/3.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/6/3.pbf new file mode 100644 index 00000000..2fc69415 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/6/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/6/4.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/6/4.pbf new file mode 100644 index 00000000..12b26e36 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/6/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/6/5.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/6/5.pbf new file mode 100644 index 00000000..b125ccad Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/6/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/6/6.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/6/6.pbf new file mode 100644 index 00000000..249febe1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/6/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/6/7.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/6/7.pbf new file mode 100644 index 00000000..232c5050 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/6/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/7/0.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/7/0.pbf new file mode 100644 index 00000000..83edab80 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/7/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/7/1.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/7/1.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/7/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/7/2.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/7/2.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/7/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/7/3.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/7/3.pbf new file mode 100644 index 00000000..eeeb620d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/7/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/7/4.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/7/4.pbf new file mode 100644 index 00000000..ab4e8f4b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/7/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/7/5.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/7/5.pbf new file mode 100644 index 00000000..ebd0d708 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/7/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/7/6.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/7/6.pbf new file mode 100644 index 00000000..5fddb364 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/7/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/5/3/7/7.pbf b/tests/readers/tile/fixtures/s2/streets/5/3/7/7.pbf new file mode 100644 index 00000000..69d57128 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/streets/5/3/7/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/streets/metadata.json b/tests/readers/tile/fixtures/s2/streets/metadata.json new file mode 100644 index 00000000..90404b82 --- /dev/null +++ b/tests/readers/tile/fixtures/s2/streets/metadata.json @@ -0,0 +1,5726 @@ +{ + "s2tilejson": "1.0.0", + "format": "fzxy", + "type": "vector", + "extension": "pbf", + "encoding": "br", + "minzoom": 0, + "maxzoom": 3, + "version": 1, + "faces": [ + 3, + 1, + 5, + 0, + 4, + 2 + ], + "facesbounds": { + "0": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ], + "6": [ + 0, + 0, + 63, + 63 + ], + "7": [ + 0, + 0, + 127, + 127 + ], + "8": [ + 0, + 0, + 255, + 255 + ], + "9": [ + 0, + 0, + 511, + 511 + ], + "10": [ + 0, + 0, + 1023, + 1023 + ], + "11": [ + 0, + 0, + 2047, + 2047 + ], + "12": [ + 0, + 0, + 4095, + 4095 + ], + "13": [ + 0, + 0, + 8191, + 8191 + ], + "14": [ + 0, + 47, + 16383, + 16383 + ] + }, + "1": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ], + "6": [ + 0, + 0, + 63, + 63 + ], + "7": [ + 0, + 0, + 127, + 127 + ], + "8": [ + 0, + 0, + 255, + 255 + ], + "9": [ + 0, + 0, + 511, + 511 + ], + "10": [ + 0, + 0, + 1023, + 1023 + ], + "11": [ + 0, + 0, + 2047, + 2047 + ], + "12": [ + 0, + 0, + 4095, + 4095 + ], + "13": [ + 0, + 0, + 8191, + 8191 + ], + "14": [ + 0, + 163, + 16383, + 16383 + ] + }, + "2": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ], + "6": [ + 0, + 0, + 63, + 63 + ], + "7": [ + 0, + 0, + 127, + 127 + ], + "8": [ + 0, + 0, + 255, + 255 + ], + "9": [ + 0, + 0, + 511, + 511 + ], + "10": [ + 0, + 0, + 1023, + 1023 + ], + "11": [ + 0, + 0, + 2047, + 2047 + ], + "12": [ + 0, + 0, + 4095, + 4095 + ], + "13": [ + 0, + 0, + 8191, + 8191 + ], + "14": [ + 0, + 0, + 16383, + 16383 + ] + }, + "3": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ], + "6": [ + 0, + 0, + 63, + 63 + ], + "7": [ + 0, + 0, + 127, + 127 + ], + "8": [ + 0, + 0, + 255, + 255 + ], + "9": [ + 0, + 0, + 511, + 511 + ], + "10": [ + 0, + 0, + 1023, + 1023 + ], + "11": [ + 0, + 0, + 2047, + 2047 + ], + "12": [ + 0, + 0, + 4095, + 4095 + ], + "13": [ + 0, + 0, + 8191, + 8191 + ], + "14": [ + 0, + 0, + 16383, + 16383 + ] + }, + "4": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ], + "6": [ + 0, + 0, + 63, + 63 + ], + "7": [ + 0, + 0, + 127, + 127 + ], + "8": [ + 0, + 0, + 255, + 255 + ], + "9": [ + 0, + 0, + 511, + 511 + ], + "10": [ + 0, + 0, + 1023, + 1023 + ], + "11": [ + 0, + 0, + 2047, + 2047 + ], + "12": [ + 0, + 0, + 4095, + 4095 + ], + "13": [ + 0, + 0, + 8191, + 8191 + ], + "14": [ + 0, + 0, + 16383, + 16383 + ] + }, + "5": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ], + "6": [ + 0, + 0, + 63, + 63 + ], + "7": [ + 0, + 0, + 127, + 127 + ], + "8": [ + 0, + 0, + 255, + 255 + ], + "9": [ + 0, + 0, + 511, + 511 + ], + "10": [ + 0, + 0, + 1023, + 1023 + ], + "11": [ + 0, + 0, + 2047, + 2047 + ], + "12": [ + 0, + 0, + 4095, + 4095 + ], + "13": [ + 0, + 0, + 8191, + 8191 + ], + "14": [ + 0, + 0, + 16258, + 15918 + ] + } + }, + "layers": { + "water": { + "minzoom": 0, + "maxzoom": 13, + "fields": { + "class": [ + "water", + "bay", + "lake", + "ocean", + "reservoir", + "river", + "lagoon", + "reef", + "riverbank", + "pond", + "intermittent", + "basin", + "shoal", + "canal", + "stream", + "drain", + "spring", + "oxbow", + "ditch", + "wastewater", + "fishpond", + "gully" + ], + "intermittent": [ + true + ], + "layer": [ + -1, + 1, + 0, + -2, + -3, + 2, + 3, + 4, + -4, + -10, + -5, + 5, + 0.1, + -12, + -16, + 12, + 19, + -6, + -9, + 61, + 8, + 20, + 10, + -11, + 3.5, + 1.5 + ], + "tunnel": [ + true + ], + "name": [ + "Skua Pond", + "Cave Gulch", + "Round Hill Gulch", + "East Stony Gulch", + "Gipsy's Gulch", + "West Stony Gulch", + "Stony Beach Gulch", + "First Gulch", + "Flat Gulch", + "Deep Gulch", + "Big Gulch", + "East End of Sandy Point Gulch", + "Washout Gulch", + "Bluff Gulch", + "Molly Gulch", + "Spring Gulch", + "Second Gulch", + "Third Gulch", + "Hottentot Gulch", + "Crater lake", + "East end of Sandy point gulch", + "Second Lagoon Gulch", + "First Lagoon Gulch", + "Morgie's Gulch", + "Wash Gulch", + "Little Sandy Gulch", + "Plantation Gulch", + "Big Sandy Gulch", + "Where Times fall off Gulch", + "Pigbite Gulch", + "Bottom pond", + "Middle pond", + "Top pond", + "Former Bayworld Dolphinarium", + "Kromme River", + "Boundary Ln Pond", + "Baakens River", + "Klipdriftriver", + "Boknes River", + "Barkens River", + "Seekoeirivier", + "Swart River", + "Kariega River", + "Bushman's River", + "North End Lake", + "swimming pool", + "Chelsea Quarries", + "Maitland River", + "Kasouga River", + "Papenkuils" + ], + "name_ru": [ + "Топ понд", + "река Умкомази", + "Лимпопо", + "Крокодилрифир", + "Замбези", + "Мукаиья", + "Капоше", + "Муше", + "Мкуджу", + "Река Ния", + "Луапула", + "Река Кассуэ", + "Река Капунго", + "Конга", + "Конкель", + "Река Катофе", + "Хуя", + "Река Сале", + "Река Кипанда", + "Калунга Мбунба Ривер", + "Река Мундандаш", + "Река Капурулу", + "Река Кассалила", + "река Лонга", + "Река Мулуэги", + "Река Муксиси", + "Река Татала", + "Река Муконга", + "Река Кванза", + "Стоки от фабрики", + "Лагуна Кабуко", + "Лагуна Соарес", + "бухта Мусуло", + "Куилу", + "Рувуву", + "Кагера", + "Biyo Gudud", + "Khurub", + "Uindi", + "Balley", + "Найроби", + "Виктория-Нил", + "Ивиндо", + "Асуа", + "Альберт-Нил", + "Ньонг", + "Паджер", + "Бахр-эль-Джебель", + "Нигер", + "Джерем" + ], + "name_en": [ + "Boknes River", + "Lower Van Stadens Dam", + "Upper van Stadens Dam", + "Bulk River", + "Bulk River Dam", + "Nuwejaars River", + "Sand River", + "Sand River Dam", + "Piesang River", + "Kouga River", + "Groot River", + "Bloukrans River", + "Boesmans River", + "Breede River", + "Duiwenhoks River", + "Boskloof Stream", + "Hartenbos River", + "Kariega River", + "Maalgate River", + "Little Brak River", + "Brandwag River", + "Moordkuil River", + "Norga River", + "Salt River", + "Witels River", + "Onrus River", + "Mossel River", + "Kluitjieskraal River", + "Heskwas River", + "Freek Botha's River", + "Van Der Wattskraal River", + "Rustenberg River", + "Kleinlaagte River", + "Marguas River", + "Korlandskloof River", + "Sonderend River", + "Kwassadie River", + "Leeu River", + "Wolf River", + "Olifants River", + "Keurbooms River", + "Riet River", + "Bot River", + "Eikenhof Dam", + "Jackson Reservoir", + "Rawson Reservoir", + "Touws River", + "Bokram River", + "Else River", + "Eerste River" + ], + "name_de": [ + "Oranje", + "Woodstock Dam", + "Löwenfluss", + "Bemamba See", + "Wasserloch", + "Guinassee", + "Otjikotosee", + "Kwando", + "Sambesi", + "Oponono-See", + "Lutambasee", + "Nhia Fluss", + "Fluss Cassué", + "Capungo Fluss", + "Conga", + "Konquel", + "Catofe Fluss", + "Huia", + "Sissué Fluss", + "Quipanda Fluss", + "Calunga Mbunba Fluss", + "Mundandache Fluss", + "Kapurulu Fluss", + "Kassalila Fluss", + "Longa Fluss", + "Muluegi Fluss", + "Muxixi Fluss", + "Tatala Fluss", + "Muconga Fluss", + "Kwanza Fluss", + "Cabuco Lagune", + "Soares Lagune", + "Mussulo-Bucht", + "Quelle", + "Manyara-See", + "Eyasisee", + "Kekhotoito-See", + "Rishateni-See", + "Großer Momella-See", + "Kleiner Momella-See", + "Tulusia-See", + "Lekandiro-See", + "Magadisee", + "Mandusi-Flusspferd-See", + "Natronsee", + "Ikokosee", + "Viktoria-Nil", + "Aruwimi", + "Albert-Nil", + "Bahr al-Dschabal" + ], + "name_pt": [ + "Rio Maputo", + "Rio Incomáti", + "Rio Limpopo", + "Rio Singuédzi", + "Aribiri River", + "Rio Mossurise", + "Rio Zambeze", + "Rio Ventania", + "Rio Metangua", + "Rio Daque", + "Rio Condedezi", + "Rio Luambala", + "Lungué-Bungo", + "Rio Kwanza", + "Rio Luena", + "Rio Kukema", + "Rio Lwando", + "Luao", + "Kwango", + "Chicapa", + "Rio Nhia", + "Kwilu", + "Cassai", + "Rio Cassué", + "Rio Capungo", + "Conga", + "Konquel", + "Rio Catofe", + "Huia", + "Rio Sissué", + "Rio Quipanda", + "Rio Calunga Mbunba", + "Rio Mundandache", + "Rio Kapurulu", + "Rio Kassalila", + "Rio Longa", + "Kukumbi", + "Rio Muluegi", + "Rio Muxixi", + "Rio Parnaíba", + "Rio Tatala", + "Luale", + "Rio Muconga", + "Luare", + "Rio Lucala", + "Laguinho UFPE", + "Bále", + "Luangue", + "Rio Japão", + "Lagoa Cabuco" + ], + "name_fr": [ + "Lac Sariaka", + "Kasaï", + "Luau", + "Kwango", + "Tshikapa", + "Tshiumbe", + "Rivière Nhia", + "Kwilu", + "Rivière Cassué", + "Rivière Capungo", + "Conga", + "Konquel", + "Rivière Catofe", + "Huia", + "Rivière Sissué", + "Rivière Quipanda", + "Rivière Calunga Mbunba", + "Rivière Mundandache", + "Rivière Kapurulu", + "Rivière Kassalila", + "Río Longa", + "Rivière Muluegi", + "Rivière Muxixi", + "Rivière Tatala", + "Rivière Muconga", + "Longatshimo", + "Rivière Kwanza", + "Lagune Cabuco", + "Lagune Soares", + "Baie de Mussulo", + "Wamba", + "Tungila", + "Kwengo", + "Kadzadi", + "Inkisi", + "Lovwa", + "Kwenge", + "Luvu", + "Shiloango", + "Nsele", + "Lac Eyasi", + "Lac Magadi", + "Rivière Rusizi", + "Lac Natron", + "Lac Ikoko", + "Lac Hago", + "Lac Ruhondo", + "Lubilia", + "Fleuve Congo", + "Labos" + ], + "name_ar": [ + "نهر سواكوب", + "نهر أوكاهانديا", + "نهر زمبيزي", + "نهر لينكني", + "نهر ليلونغوي", + "جدول كيتوي", + "نهر الكونغو", + "نهر أغوي", + "نهر نيروبي", + "النيل الأبيض", + "نهر بنيتو", + "نهر كي", + "نهر شبيلي", + "بحر الجبل", + "نهر النيجر", + "نهر ساساندرا", + "خور كس", + "داوا", + "نهر ياي", + "نهر نانا", + "بحيرة ييرول", + "امبيري", + "ض", + "نهر مبري", + "قمروك", + "جنوب السودان - إثيوبيا", + "نهر بيبور", + "نهر موهون", + "نهر بندي", + "نهر تونج", + "نهر الجور", + "لوقون", + "سيدو الكبير", + "وي", + "بحر كو", + "نهر شاري", + "وادي أومو المنخفض", + "نهر راجا", + "نهر كارا", + "مايو كيبي", + "نهر اغبنهالا", + "بحر الزراف", + "نهر بارو", + "نهر سنكاراني", + "البندر", + "نهر جاجابا", + "بحر الغزال", + "نهر مقي", + "بحر العرب", + "نهر كنكوري" + ], + "name_es": [ + "Río Nhia", + "Río Cassué", + "Río Capungo", + "Conga", + "Konquel", + "Río Catofe", + "Huia", + "Río Sissué", + "Río Quipanda", + "Río Calunga Mbunba", + "Río Mundandache", + "Río Kapurulu", + "Río Kassalila", + "Río Longa", + "Río Muluegi", + "Río Muxixi", + "Río Tatala", + "Río Muconga", + "Río Kwanza", + "Laguna Cabuco", + "Laguna Soares", + "Bahía de Mussulo", + "Lago Natron", + "Río Benito", + "Río Niger", + "Lago Monoun", + "Lago Awing", + "Lago Oku", + "Lago Nyos", + "Río Mono", + "Valle bajo del Omo", + "Nilo Blanco", + "Nilo Azul", + "Río Baoulé", + "Río Gambia", + "Lagunas de Aleg", + "Lago Karum", + "Rio Nilo", + "Barranco", + "Nilo", + "Uad Aguaililat", + "Tiguissit", + "Uad Aarred el Yam", + "La Charca площадь", + "Lago Iriki", + "Canal de Suez", + "Río de Oro", + "Barranco del Lobo", + "Barranco del Infierno", + "Río Farjana" + ], + "name_it": [ + "Fiume Nhia", + "Fiume Cassué", + "Fiume Capungo", + "Conga", + "Konquel", + "Fiume Catofe", + "Huia", + "Fiume Sissué", + "Fiume Quipanda", + "Fiume Calunga Mbunba", + "Fiume Mundandache", + "Fiume Kapurulu", + "Fiume Kassalila", + "Fiume Lungo", + "Fiume Muluegi", + "Fiume Muxixi", + "Fiume Tatala", + "Fiume Muconga", + "Fiume Kwanza", + "Laguna Cabuco", + "Laguna Soares", + "Baia di Mussulo", + "Lago Eyasi", + "Lago Magadi", + "Lago Natron", + "Lago Monoun", + "Daua", + "Lago Nyos", + "Omo", + "Nilo bianco", + "Lake Verde", + "Auash", + "Nilo azzurro", + "Tacazzè", + "Lago Yoa", + "Ferdinandea", + "Lago di Piana degli Albanesi", + "Torrente Casudda", + "Torrente Grande", + "Laghetto Quattrocchi", + "Torrente Medda", + "Torrente Rubino", + "Torrente San Domenico", + "Torrente San Martino", + "Fiumara Romei", + "Torrente Paratore", + "Fiumara di Santo Stefano", + "Scogliera naturista Chiappe", + "Lago di Qaraʿūn", + "Riu Mannu di San Sperate" + ], + "name_ja": [ + "クワンザ川", + "カブコラグーン", + "ソアレスラグーン", + "ムスロ湾", + "オモ川", + "青ナイル川", + "ナイル川", + "ヨルダン川", + "グアディアナ川", + "コリントス運河", + "ピニオス川 (テッサリア)", + "アルバーノ湖", + "ナイアディの噴水", + "トリトーネの噴水", + "ピラート湖", + "ドリナ川", + "クラン川", + "ゴンパック川", + "シンフォニーレイク", + "ソジュパザ", + "サイゴン川", + "クリシュナ", + "ハン川", + "シッタン川", + "ベンハイ川", + "アンゲウ貯水池", + "ペーンガンガー", + "紅河", + "天光井", + "タイ湖", + "ガンジス川", + "カロン川", + "ダ川", + "カトニー", + "サトナー", + "高雄港", + "花蓮港", + "青魯池", + "蘇澳港", + "名称不明", + "田原川", + "アセンダ川", + "ウボ川", + "ウラダ川", + "越良川", + "バイダ川", + "フカイ川", + "大原川", + "仲間川", + "ヒドリ川" + ], + "name_zh": [ + "寬扎河", + "卡布科潟湖", + "蘇亞雷斯潟湖", + "穆蘇洛灣", + "奧莫河", + "吉格吉貝河", + "吉貝河", + "迪德薩河", + "青尼罗河", + "約阿湖", + "雅孔河", + "瓜地亞納河", + "城墙", + "天鹅的喷泉", + "科林斯运河", + "皇家廣場", + "魔法噴泉", + "皮尼奥斯河", + "阿尔巴诺湖", + "那依阿德喷泉", + "破船噴泉", + "利姆河", + "黑湖", + "德里纳河", + "鲁巴河", + "梦之湖", + "濱海蓄水池", + "加冷盆地", + "芽茏河", + "埔来河", + "柏玛士河", + "勿洛蓄水池", + "半月池", + "砂拉越河左边支流", + "小桂林", + "振林山河", + "金金河", + "峇丹沙隆河", + "纱玉河", + "碧湖", + "马西河", + "砂拉越河右边支流", + "小笨珍河", + "避兰东河", + "地不佬河", + "士姑来河", + "笨珍河", + "柔佛河", + "淡杯河", + "砂拉越河" + ], + "name_vi": [ + "Thung lũng thấp Omo", + "Sông Nin", + "Đá Ba Kè", + "Chim Biển", + "Đá En Ca", + "Đá Đông", + "DAO TOC TAN C", + "Sông Hậu", + "Sông Cái Bé", + "Sông Cung Hầu", + "Sông Cổ Chiên", + "Sông Hàm Luông", + "Sông Ba Lai", + "Sông Mỹ Tho", + "Sông Tiền", + "Đá ngầm Ngưu Xa Sanh", + "Rạch Sa Đéc", + "Sông Cửa Tiểu", + "đá Phúc Sĩ (đá Hi Ghen)", + "Rạch Cái Tàu Thượng", + "đá Văn Nguyên", + "đá Nghĩa Hành", + "đá Ninh Hoà", + "Sông Bảo Định", + "đá Sơn Hà", + "đá Bình Khê", + "đá Bia", + "đá An Bình", + "đá Ken Nan", + "Đá Đông Môn", + "Đá An Lạc", + "Đá Lớn", + "Sông Ray", + "Đá ngầm Trường Tuyến", + "đá Ba Đầu", + "sông Mỏ Nhát", + "đá Đức Hòa", + "Đá Tiểu Nam Huân", + "Rặng san hô Nam Yết", + "Sông Tầm Bó", + "Sông Dinh", + "Sông Sài Gòn", + "Sông Sở Thượng", + "R.Cá Trê", + "rạch", + "Sông Mê Kông", + "Sông La Ngà", + "Cồn san hô Jackson", + "hồ Đá Bàn", + "Sông Sà Mách" + ], + "name_ko": [ + "청나일 강", + "과디아나 강", + "스페인 광장 분수", + "아레투사 분수", + "프레토리아 분수", + "코린토스 운하", + "마법의 분수", + "트레비 분수", + "드리나 강", + "세가라앙카", + "분다란 하이", + "찬퉁 강", + "삼파나한 강", + "마눙굴 강", + "몬탈랏 강", + "부의 분수", + "클랑 강", + "껀터강", + "까이랑", + "끄어강", + "띠엔강", + "사덱강", + "미토강", + "발라이강", + "바오딘강", + "락끄어럽", + "라이강", + "밤꼬떠이강", + "송낀호", + "쩌우독강", + "수오이라오호", + "쯔뎀강", + "사이공강", + "자호엣호", + "떰보호", + "동나이강", + "반타인호", + "베트남-캄보디아 국경선", + "고꽁강", + "다호", + "요정의 샘", + "바우창", + "바우센", + "바오하오호", + "담브리호", + "남선호", + "다증강", + "꽝케호", + "꽝케른호", + "뚜옌럼호" + ] + } + }, + "landuse": { + "minzoom": 0, + "maxzoom": 13, + "fields": { + "class": [ + "boundary", + "natural", + "landuse", + "leisure", + "amenity", + "power", + "tourism", + "aeroway", + "golf" + ], + "type": [ + "urban", + "desert", + "protected_area", + "military", + "national_park", + "wood", + "farmland", + "glacier", + "sand", + "wetland", + "forest", + "scrub", + "bare_rock", + "aboriginal_lands", + "grassland", + "mud", + "meadow", + "park", + "landfill", + "orchard", + "beach", + "rock", + "vineyard", + "quarry", + "prison", + "plant", + "construction", + "farmyard", + "basin", + "parking", + "grass", + "allotments", + "tree", + "marsh", + "school", + "zoo", + "commercial", + "aerodrome", + "bunker", + "garden", + "fire_station", + "farm", + "theme_park", + "track", + "pitch", + "course", + "cemetery", + "hospital", + "retail", + "police" + ], + "name": [ + "Uintah and Ouray Reservation" + ] + } + }, + "boundary": { + "minzoom": 0, + "maxzoom": 13, + "fields": { + "class": [ + "administrative" + ], + "adminLevel": [ + 4, + 2, + 3, + 2.5 + ], + "maritime": [ + true, + false + ], + "disputed": [ + true + ], + "ISO1": [ + "TA", + "SH", + "ZA", + "MG", + "LS", + "BR", + "SZ", + "MZ", + "NA", + "TF", + "FR", + "BW", + "ZW", + "MW", + "ZM", + "AO", + "YT", + "KM", + "CD", + "TZ", + "AC", + "KE", + "CG", + "BI", + "GA", + "RW", + "SO", + "UG", + "GQ", + "ST", + "CM", + "CF", + "SS", + "NG", + "LR", + "CI", + "ET", + "GH", + "TG", + "BJ", + "SL", + "GN", + "TD", + "BF", + "SD", + "ML", + "GW", + "NE", + "SN", + "GM" + ], + "ISO2": [ + "SH-TA", + "ZA-EC", + "ZA-WC", + "ZA-KZN", + "ZA-NC", + "MG-U", + "ZA-FS", + "BR-SP", + "BR-RJ", + "SZ-SH", + "ZA-MP", + "SZ-LU", + "MZ-L", + "MG-F", + "SZ-MA", + "ZA-NW", + "MZ-MPM", + "NA-KA", + "BR-MG", + "SZ-HH", + "ZA-GP", + "MZ-G", + "MZ-I", + "ZA-LP", + "FR-TF", + "BW-KG", + "BW-SO", + "BW-SE", + "BR-ES", + "BW-KW", + "BW-KL", + "NA-HA", + "BW-CE", + "MG-M", + "ZW-MV", + "ZW-MS", + "BW-GH", + "MZ-S", + "NA-OH", + "NA-KH", + "ZW-MA", + "NA-ER", + "BW-NE", + "ZW-MI", + "BR-BA", + "NA-OD", + "ZW-MN", + "ZW-BU", + "BW-NW", + "ZW-ME" + ], + "name": [ + "Tristan da Cunha", + "Saint Helena", + "Gough Island", + "Nightingale Island", + "Inaccessible Island", + "Eastern Cape", + "South Africa", + "Western Cape", + "KwaZulu-Natal", + "Northern Cape", + "Madagasikara", + "Androy", + "Province de Toliara", + "Lesotho", + "Free State", + "Atsimo-Andrefana", + "Região Sudeste", + "São Paulo", + "Brasil", + "Rio de Janeiro", + "Shiselweni", + "eSwatini", + "Moçambique", + "Mpumalanga", + "Lubombo", + "Maputo", + "Ihorombe", + "Province de Fianarantsoa", + "Manzini", + "North West", + "Cidade de Maputo", + "ǁKaras Region", + "Namibia", + "Minas Gerais", + "Hhohho", + "Matola", + "Gauteng", + "Gaza", + "Inhambane", + "Menabe", + "Limpopo", + "Terres australes et antarctiques françaises", + "France", + "Kgalagadi District", + "Botswana", + "Southern District", + "South-East District", + "Espírito Santo", + "Kweneng District", + "Kgatleng District" + ], + "name_ar": [ + "سانت هيلينا، أسينسيون وتريستان دا كونها", + "تريستان دا كونا", + "كيب الشرقية", + "جنوب أفريقيا", + "كيب الغربية", + "كوازولو ناتال", + "كيب الشمالية", + "مدغشقر", + "ليسوتو", + "فري ستيت", + "المنطقة الجنوبية الشرقية", + "ساو باولو", + "البَرَازِيل", + "ريو دي جانيرو", + "سوازيلاند", + "موزمبيق", + "مبومالانجا", + "منزيني", + "الشمالية الغربية", + "إقليم كاراس", + "ناميبيا", + "ميناس جيرايس", + "غاوتينج", + "ليمبوبو", + "الأراضي الجنوبية الفرنسية", + "فرنسا", + "مقاطعة كغالاجادي", + "بوتسوانا", + "المقاطعة الجنوبية", + "المقاطعة الجنوب شرقية", + "إسبيريتو سانتو", + "مقاطعة كويننغ", + "مقاطعة كغاتلنغ", + "إقليم هارداب", + "المقاطعة المركزية", + "منطقة ماسفينغو", + "زيمبابوي", + "مقاطعة جنوب ماتابيليلاند", + "مقاطعةغانزي", + "إقليم أوماهيكي", + "إقليم خوماس", + "محافظة مانيكالاند", + "إقليم إيرونغو", + "مقاطعة الشمال الشرقي", + "محافظة ميدلاندز", + "المنطقة الشمالية الشرقية", + "باهيا", + "إقليم أوتجوزوندجوبا", + "محافظة شمال ماتابيليلاند", + "بولاوايو" + ], + "name_de": [ + "St. Helena", + "Ostkap", + "Südafrika", + "Westkap", + "Nordkap", + "Madagaskar", + "Lesotho", + "Freistaat", + "Südosten", + "São Paulo", + "Brasilien", + "Rio de Janeiro", + "Eswatini", + "Mosambik", + "Nordwest", + "ǁKaras", + "Namibia", + "Minas Gerais", + "Französische Süd- und Antarktisgebiete", + "Frankreich", + "Botsuana", + "Südlicher Distrikt", + "Espírito Santo", + "Hardap", + "Zentral-Distrikt", + "Simbabwe", + "Südmatabeleland", + "Omaheke", + "Khomas", + "Erongo", + "Nordost-Distrikt", + "Nordosten", + "Bahia", + "Otjozondjupa", + "Nordmatabeleland", + "Bulawayo Provinz", + "Nordwest-Distrikt", + "Ostmaschonaland", + "Kunene", + "Westmaschonaland", + "Harare Provinz", + "Malawi", + "Zentralmaschonaland", + "Oshikoto", + "Kavango-Ost", + "Kavango-West", + "Südprovinz", + "Sambia", + "Sambesi", + "Oshana" + ], + "name_en": [ + "Saint Helena", + "South Africa", + "Madagascar", + "Lesotho", + "Free State", + "Southeast Region", + "São Paulo", + "Brazil", + "Rio de Janeiro", + "Eswatini", + "Mozambique", + "Karas", + "Namibia", + "Minas Gerais", + "French Southern and Antarctic Lands", + "France", + "Kgalagadi District", + "Botswana", + "Southern District", + "South-East District", + "Espírito Santo", + "Kweneng District", + "Kgatleng District", + "Hardap", + "Central District", + "Zimbabwe", + "Ghanzi District", + "Omaheke", + "Khomas", + "North-East District", + "Northeast Region", + "Bahia", + "Otjozondjupa", + "Bulawayo Province", + "North-West District", + "Kunene Region", + "Malawi", + "Oshikoto", + "Kavango East", + "Kavango West", + "Southern Province", + "Zambia", + "Zambezi", + "Oshana", + "Omusati", + "Angola", + "Neno", + "Ohangwena", + "Mayotte", + "Namibe" + ], + "name_es": [ + "Santa Elena", + "El Cabo Oriental", + "Sudáfrica", + "El Cabo Occidental", + "El Cabo Septentrional", + "Madagascar", + "Lesoto", + "Estado Libre", + "Región Sudeste", + "San Pablo", + "Brasil", + "Río de Janeiro", + "Suazilandia", + "Mozambique", + "Noroeste", + "Karas", + "Namibia", + "Tierras Australes y Antárticas Francesas", + "Francia", + "Distrito Kgalagadi", + "Botsuana", + "Distrito Sur", + "Distrito Sudeste", + "Distrito Kweneng", + "Distrito Kgatleng", + "Hardap", + "Distrito Central", + "Zimbabue", + "Matabelelandia Meridional", + "Distrito Ghanzi", + "Omaheke", + "Khomas", + "Manicalandia", + "Erongo", + "Distrito Noreste", + "Región Nordeste", + "Bahía", + "Otjozondjupa", + "Matabelelandia Septentrional", + "Provincia de Bulawayo", + "Distrito Noroeste", + "Mashonalandia Oriental", + "Kunene", + "Mashonalandia Occidental", + "Distrito Chobe", + "Provincia de Harare", + "Malaui", + "Mashonalandia Central", + "Oshikoto", + "Kavango del Este" + ], + "name_fr": [ + "Sainte-Hélène", + "Île Gough", + "Cap-Oriental", + "Afrique du Sud", + "Cap occidental", + "Cap du Nord", + "Madagascar", + "Province de Toliara", + "Lesotho", + "État-Libre", + "Région Sud-est", + "Brésil", + "Swaziland", + "Mozambique", + "Ihorombe", + "Province de Fianarantsoa", + "Nord-Ouest", + "Karas", + "Namibie", + "Menabe", + "Terres australes et antarctiques françaises", + "France", + "District de Kgalagadi", + "Botswana", + "District du Sud", + "District du Sud-Est", + "District de Kweneng", + "District de Kgatleng", + "Hardap", + "District Central", + "Melaky", + "Province de Mahajanga", + "Zimbabwe", + "Matabeleland méridional", + "District de Ghanzi", + "Omaheke", + "Khomas", + "Erongo", + "District du Nord-Est", + "Région Nord-est", + "Otjozondjupa", + "Matabeleland septentrional", + "Province de Bulawayo", + "District du Nord-Ouest", + "Mashonaland oriental", + "Kunene", + "Mashonaland occidental", + "District de Chobe", + "Province d'Harare", + "Malawi" + ], + "name_it": [ + "Sant'Elena", + "Sudafrica", + "Madagascar", + "Lesotho", + "Regione Sudest", + "San Paolo", + "Brasile", + "Swaziland", + "Mozambico", + "Namibia", + "Terre Australi e Antartiche Francesi", + "Francia", + "Botswana", + "Zimbabwe", + "Regione Nordest", + "Malawi", + "Zambia", + "Angola", + "Anjouan", + "Mohéli", + "Grande Comore", + "Repubblica Democratica del Congo", + "Tanzania", + "Provincia di Luanda", + "Kasai Orientale", + "Kenya", + "Kilimangiaro", + "Repubblica del Congo", + "Burundi", + "Gabon", + "Ruanda", + "Basso Giuba", + "Somalia", + "Uganda", + "Guinea Equatoriale", + "Medio Giuba", + "Basso Scebeli", + "Ghedo", + "Camerun", + "Bai", + "Repubblica Centrafricana", + "Sudan del Sud", + "Nigeria", + "Liberia", + "Costa d'Avorio", + "Etiopia", + "Ghana", + "Abidjan", + "Togo", + "Benin" + ], + "name_pt": [ + "Santa Helena", + "Cabo Oriental", + "África do Sul", + "Cabo Ocidental", + "KwaZulu-Natal", + "Cabo Setentrional", + "Madagáscar", + "Lesoto", + "Estado Livre", + "Região Sudeste", + "São Paulo", + "Brasil", + "Rio de Janeiro", + "eSwatini", + "Moçambique", + "Mpumalanga", + "Noroeste", + "Namíbia", + "Minas Gerais", + "Gautengue", + "Limpopo", + "Terras Austrais e Antárticas Francesas", + "França", + "Botsuana", + "Espírito Santo", + "Zimbabué", + "Região Nordeste", + "Bahia", + "Malawi", + "Zâmbia", + "Angola", + "Anjouan", + "Mohéli", + "Grande Comore", + "República Democrática do Congo", + "Piauí", + "Tanzânia", + "Sergipe", + "Alagoas", + "Pernambuco", + "Província de Luanda", + "Maranhão", + "Paraíba", + "Ceará", + "Rio Grande do Norte", + "Ilha de Ascensão", + "Quénia", + "Cabinda", + "Mombaça", + "República do Congo" + ], + "name_ru": [ + "Острова Святой Елены", + "Восточно-Капская провинция", + "Южная Африка", + "Западная Капская провинция", + "Квазулу-Наталь", + "Северная Капская провинция", + "Мадагаскар", + "Лесото", + "Фри-Стейт", + "Юго-восточный регион", + "Сан-Паулу", + "Бразилия", + "Рио-де-Жанейро", + "Эсватини", + "Мозамбик", + "Северо-Западная провинция", + "Карас", + "Намибия", + "Минас-Жерайс", + "Лимпопо", + "Французские Южные и Антарктические территории", + "Франция", + "Кгалагади", + "Ботсвана", + "Эспириту-Санту", + "Хардап", + "Центральный округ", + "Зимбабве", + "Ганзи", + "Омахеке", + "Кхомас", + "Эронго", + "Северо-восточный регион", + "Баия", + "Очосондьюпа", + "Северо-Западный округ", + "Кунене", + "Тете", + "Нсанье", + "Малави", + "Ошикото", + "Восточный Окаванго", + "Западный Окаванго", + "Южная провинция", + "Замбия", + "Чиквава", + "Каприви", + "Ошана", + "Омусати", + "Тайоло" + ], + "name_vi": [ + "Saint Helena", + "Nam Phi", + "Madagascar", + "Lesotho", + "Brasil", + "Eswatini", + "Mozambique", + "Namibia", + "Vùng đất phía Nam và châu Nam Cực thuộc Pháp", + "Pháp", + "Bốt-xoa-na", + "Zimbabwe", + "Vùng Đông Bắc", + "Malawi", + "Zambia", + "Angola", + "Cộng hòa Dân chủ Congo", + "Tanzania", + "Kenya", + "Cộng hòa Congo", + "Burundi", + "Gabon", + "Rwanda", + "Somalia", + "Uganda", + "Guinea Xích Đạo", + "Cameroon", + "Cộng hòa Trung Phi", + "Nam Sudan", + "Nigeria", + "Liberia", + "Bờ Biển Ngà", + "Ethiopia", + "Ghana", + "Abidjan", + "Togo", + "Bénin", + "Sierra Leone", + "Guinée", + "Tchad", + "Buốc-ki-na Pha-xô", + "Sudan", + "Mali", + "Guiné-Bissau", + "Addis Ababa", + "Niger", + "Sénégal", + "Gambia", + "Djibouti", + "Mauritanie" + ], + "name_zh": [ + "圣赫勒拿、阿森松和特里斯坦-达库尼亚", + "南非", + "马达加斯加", + "莱索托", + "东南部", + "圣保罗", + "巴西", + "里約熱內盧", + "斯威士兰", + "莫桑比克", + "纳米比亚", + "米纳斯吉拉斯", + "法属南部领地", + "法國", + "波札那", + "圣埃斯皮里图", + "辛巴威", + "东北部", + "巴伊亚", + "马拉维", + "赞比亚", + "宽多-库邦戈省", + "安哥拉", + "马约特", + "库内内省", + "纳米贝省", + "莫希科省", + "昂儒昂岛", + "莫埃利島", + "威拉省", + "大科摩罗岛", + "刚果民主共和国", + "皮奧伊", + "比耶省", + "坦桑尼亚", + "塞尔希培", + "本格拉省", + "万博省", + "阿拉戈斯", + "南宽扎省", + "伯南布哥", + "马兰热省", + "南隆达省", + "罗安达省", + "北隆达省", + "马拉尼昂", + "帕拉伊巴", + "北宽扎省", + "塞阿腊", + "達累斯薩拉姆" + ], + "name_ja": [ + "南アフリカ", + "マダガスカル", + "レソト", + "南東部地域", + "サンパウロ", + "ブラジル", + "リオ デ ジャネイロ", + "スワジランド", + "モザンビーク", + "マプト州", + "ナミビア", + "ミナス ジェライス", + "ガザ州", + "イニャンバネ州", + "フランス領南方・南極地域", + "フランス", + "ボツワナ", + "エスピリト サント", + "ジンバブエ", + "ソファラ州", + "マニッカ州", + "北東部地域", + "バイーア", + "テテ州", + "マラウイ", + "ザンビア", + "アンゴラ", + "マヨット", + "カボ・デルガード州", + "アンジュアン島", + "モヘリ島", + "グランドコモロ島", + "コンゴ民主共和国", + "ピアウイー", + "タンザニア", + "セルジッペ", + "アラゴアス", + "ペルナンブーコ", + "ルアンダ州", + "マラニョン", + "パライバ", + "セアラー", + "ダルエスサラーム", + "リオグランデ・ド・ノルテ", + "ケニア", + "モンバサ", + "コンゴ共和国", + "ブルンジ", + "ガボン", + "ルワンダ" + ], + "name_ko": [ + "남아프리카", + "마다가스카르", + "레소토", + "남동지방", + "상파울루", + "브라질", + "리우데자네이루", + "스와질란드", + "모잠비크", + "나미비아", + "미나스제라이스", + "프랑스령 남부와 남극 지역", + "프랑스", + "보츠와나", + "이스피리투산투", + "짐바브웨", + "북동지방", + "바이아", + "말라위", + "잠비아", + "앙골라", + "마요트", + "앙주앙 섬", + "모엘리 섬", + "그랑드코모르 섬", + "콩고 민주 공화국", + "피아우이", + "탄자니아", + "세르지피", + "알라고아스", + "페르남부쿠", + "마라냥", + "파라이바", + "세아라", + "다르에스살람", + "히우그란지두노르치", + "케냐", + "콩고 공화국", + "부룬디", + "가봉", + "르완다", + "소말리아", + "나이로비", + "우간다", + "적도 기니", + "카메룬", + "중앙아프리카 공화국", + "남수단", + "나이지리아", + "라이베리아" + ] + } + }, + "equator": { + "minzoom": 0, + "maxzoom": 10, + "fields": {} + }, + "place": { + "minzoom": 0, + "maxzoom": 12, + "fields": { + "id": [ + "P.306004", + "424313451", + "316949921", + "P.2177187", + "506535828", + "433483527", + "249399679", + "1971329414", + "1942993844", + "304951004", + "8353684490", + "2049929146", + "25842885", + "304512479", + "304951007", + "304951009", + "289559370", + "289559361", + "424311679", + "248120384", + "P.3203752", + "P.3203751", + "P.3247287", + "432425028", + "P.3203754", + "P.3203753", + "304951008", + "36966060", + "2294586133", + "2651781115", + "2746237191", + "P.2096896", + "2651781117", + "P.2096898", + "P.2096901", + "P.2096900", + "424316493", + "2651781108", + "2651781114", + "P.12558577", + "P.2096899", + "424297816", + "P.2096902", + "2651781119", + "1937463971", + "1937463246", + "2651781118", + "P.1258651", + "1937459087", + "432425041" + ], + "class": [ + "state", + "country", + "territory", + "continent", + "region", + "province", + "city", + "municipality", + "county", + "zipcode", + "town", + "island", + "islet", + "archipelago", + "village", + "suburb", + "quarter", + "district", + "hamlet", + "neighbourhood", + "locality", + "isolated_dwelling", + "block", + "square", + "borough" + ], + "ISO1": [ + "MP", + "JP", + "AS", + "NF", + "NZ", + "MG", + "AQ", + "HM", + "MR", + "ML", + "MA", + "ES", + "CC", + "CX", + "AU", + "ID", + "SO", + "IR", + "TH", + "IN", + "CN", + "MO", + "HK", + "NA", + "AO", + "MZ", + "BW", + "ZA", + "ZM", + "CD", + "TZ", + "NE", + "TD", + "NG", + "DZ", + "LY", + "IT", + "GR", + "SA", + "SS", + "EG", + "TR", + "SD", + "ET", + "KE", + "PG", + "MX", + "US", + "YE", + "PK" + ], + "ISO2": [ + "US-MP", + "US-HI", + "US-AS", + "AU-QLD", + "AU-NSW", + "AU-ACT", + "AU-SA", + "AU-VIC", + "MG-M", + "MG-F", + "MG-T", + "MG-A", + "AU-TAS", + "MR-02", + "GN-K", + "ML-1", + "MR-09", + "ML-2", + "ML-4", + "ML-3", + "MR-07", + "MR-01", + "ML-5", + "ML-6", + "MR-06", + "MA-12", + "MA-11", + "MR-11", + "DZ-37", + "MA-09", + "MA-08", + "DZ-50", + "DZ-01", + "DZ-52", + "MA-02", + "ES-AN", + "ES-CM", + "ES-CL", + "AU-WA", + "AU-NT", + "CN-XJ", + "CN-HI", + "CN-QH", + "CN-XZ", + "CN-GS", + "CN-NX", + "CN-SN", + "CN-SX", + "CN-YN", + "CN-SC" + ], + "wikidata": [ + "Q16644", + "Q17", + "Q782", + "Q16641", + "Q172216", + "Q538", + "Q36074", + "Q828357", + "Q3224", + "Q15577", + "Q3258", + "Q35715", + "Q36687", + "Q16534989", + "Q16576918", + "Q31057", + "Q664", + "Q669259", + "Q841197", + "Q1165783", + "Q1019", + "Q489821", + "Q639418", + "Q34366", + "Q51", + "Q131198", + "Q850435", + "Q870191", + "Q332113", + "Q843903", + "Q287789", + "Q656845", + "Q461298", + "Q1025", + "Q366626", + "Q12621", + "Q2424657", + "Q214155", + "Q912", + "Q339462", + "Q859581", + "Q21235104", + "Q19951088", + "Q859567", + "Q231151", + "Q20652586", + "Q1028", + "Q19950954", + "Q76592938", + "Q188166" + ], + "name": [ + "Northern Mariana Islands", + "日本", + "Hawaii", + "American Samoa", + "Coral Sea Islands", + "Oceania", + "Queensland", + "Sunshine Coast", + "New South Wales", + "Kolonga Labyrinth", + "Jervis Bay", + "Australian Capital Territory", + "Monaro", + "South Australia", + "Victoria", + "Cascade", + "Middlegate", + "Norfolk Island", + "New Zealand", + "Province de Mahajanga", + "Province de Fianarantsoa", + "Sofia", + "Madagasikara", + "Province d’Antananarivo", + "Province de Tamatave", + "Tasmania", + "Antarctica", + "Heard Island and McDonald Islands", + "ﻲﺑﺮﻐﻟﺍ ﺽﻮﺤﻟﺍ", + "Kankan", + "Kayes", + "ﺖﻧﺎﻜﺗ", + "Koulikoro", + "Ségou", + "Sikasso", + "ﺎﻴﻧﺎﺘﻳﺭﻮﻣ", + "ﺭﺍﺭﺩﺃ", + "ﻲﻗﺮﺸﻟﺍ ﺽﻮﺤﻟﺍ", + "Taoudénit", + "Mopti", + "Mali", + "Tombouctou", + "ﺓﺯﺭﺍﺮﺘﻟﺍ", + "Dakhla", + "Laâyoune", + "ﺭﻮﻣﺯ ﺱﺮﻴﺗ", + "Tindouf", + "Souss", + "Maroc", + "Drâa" + ], + "name_de": [ + "Nördliche Marianen", + "Japan", + "Hawaii", + "Amerikanisch", + "Korallenmeerinseln", + "Ozeanien", + "Queensland", + "Neusüdwales", + "Jervis", + "Australisches Hauptstadtterritorium", + "Südaustralien", + "Victoria", + "Norfolkinsel", + "Neuseeland", + "Madagaskar", + "Provinz Toamasina", + "Tasmanien", + "Antarktika", + "Heard und McDonaldinseln", + "Al", + "Takanit", + "Mauretanien", + "Adrar", + "Hodh Ech Chargui", + "Mali", + "Timbuktu", + "At", + "Tiris Zemmour", + "Tinduf", + "Marokko", + "Oriental", + "Andalusien", + "Spanien", + "Kastilien", + "Kastilien und León", + "Kokosinseln", + "Weihnachtsinsel", + "Westaustralien", + "Große Sandwüste", + "Große Victoria", + "Australien", + "Nordterritorium", + "Ashmore", + "Indonesien", + "Somalia", + "Iran", + "Thailand", + "Xinjiang", + "Hainan", + "Indien" + ], + "name_en": [ + "Northern Mariana Islands", + "Japan", + "Hawaii", + "American Samoa", + "Coral Sea Islands", + "Oceania", + "Queensland", + "New South Wales", + "Jervis Bay Territory", + "Australian Capital Territory", + "South Australia", + "Victoria", + "Norfolk Island", + "New Zealand", + "Madagascar", + "Toamasina Province", + "Tasmania", + "Antarctica", + "Heard Island and McDonald Islands", + "Hodh El Gharbi", + "Kayes", + "Tagant", + "Koulikoro", + "Sikasso", + "Mauritania", + "Adrar", + "Hodh Ech Chargui", + "Mopti", + "Mali", + "Timbuktu", + "Trarza", + "Dakhla", + "Laâyoune", + "Tiris Zemmour", + "Tinduf", + "Souss", + "Morocco", + "Drâa", + "Bordj Badji Mokhtar", + "Beni Abbes", + "Oriental", + "Andalusia", + "Spain", + "Castile", + "Castile and León", + "Cocos (Keeling) Islands", + "Christmas Island", + "Western Australia", + "Great Victoria Desert", + "Australia" + ], + "name_es": [ + "Islas Marianas del Norte", + "Japón", + "Hawái", + "Samoa Americana", + "Islas del Mar del Coral", + "Oceanía", + "Queensland", + "Nueva Gales del Sur", + "Territorio de la Capital Australiana", + "Australia Meridional", + "Victoria", + "Isla Norfolk", + "Nueva Zelanda", + "Madagascar", + "Tasmania", + "Antártida", + "Islas Heard y McDonald", + "Mauritania", + "Malí", + "Tombuctú", + "Tinduf", + "Sus", + "Marruecos", + "Andalucía", + "España", + "Castilla", + "Castilla y León", + "Islas Cocos (Keeling)", + "Isla de Navidad", + "Australia Occidental", + "Australia", + "Territorio del Norte", + "Islas Ashmore y Cartier", + "Indonesia", + "Somalia", + "Irán", + "Tailandia", + "Sinkiang", + "Hainan", + "India", + "Qinghai", + "Tibet", + "Gansu", + "Ningxia", + "China", + "Shaanxi", + "Shanxi", + "Yunnan", + "Sichuan", + "Guizhou" + ], + "name_fr": [ + "Îles Mariannes du Nord", + "Japon", + "Hawaï", + "Samoa américaines", + "Samoa Américaines", + "Îles de la Mer de Corail", + "Océanie", + "Queensland", + "Nouvelle Galles du Sud", + "Territoire de la capitale australienne", + "Australie méridionale", + "Victoria", + "Île Norfolk", + "Nouvelle", + "Province de Mahajanga", + "Province de Fianarantsoa", + "Madagascar", + "Province d’Antananarivo", + "Province de Tamatave", + "Tasmanie", + "Antarctique", + "Îles Heard", + "Hodh El Gharbi", + "Kayes", + "Tagant", + "Koulikoro", + "Ségou", + "Sikasso", + "Mauritanie", + "Adrar", + "Hodh Ech Chargui", + "Mopti", + "Mali", + "Tombouctou", + "Trarza", + "Dakhla", + "Laâyoune", + "Tiris Zemmour", + "Tindouf", + "Souss", + "Maroc", + "Drâa", + "Bordj Badji Mokhtar", + "Béni Abbès", + "Oriental", + "Andalousie", + "Espagne", + "Castille", + "Îles Cocos", + "Île Christmas" + ], + "name_it": [ + "Isole Marianne Settentrionali", + "Giappone", + "Samoa Americane", + "Isole del Mar dei Coralli", + "Oceania", + "Nuovo Galles del Sud", + "Territorio della capitale australiana", + "Australia Meridionale", + "Isola Norfolk", + "Nuova Zelanda", + "Madagascar", + "Tasmania", + "Antartide", + "Isole Heard e McDonald", + "Mauritania", + "Mali", + "Marocco", + "Vandalitia", + "Spagna", + "Castiglia", + "Castiglia e León", + "Isole Cocos e Keeling", + "Isola del Natale", + "Australia Occidentale", + "Australia", + "Territorio del Nord", + "Isole Ashmore e Cartier", + "Indonesia", + "Somalia", + "Iran", + "Thailandia", + "Xinjiang", + "Hainan", + "India", + "Qinghai", + "Tibet", + "Gansu", + "Ningxia", + "Cina", + "Shaanxi", + "Shanxi", + "Yunnan", + "Sichuan", + "Guizhou", + "Chongqing", + "Guangxi", + "Hubei", + "Hunan", + "Hebei", + "Henan" + ], + "name_ja": [ + "北マリアナ諸島", + "日本", + "ハワイ州", + "アメリカ領サモア", + "コーラル・シー諸島", + "クイーンズランド州", + "サンシャイン・コースト", + "ニューサウスウェールズ", + "オーストラリア首都特別地域", + "南オーストラリア", + "ビクトリア", + "ノーフォーク島", + "ニュージーランド", + "マダガスカル", + "タスマニア", + "南極大陸", + "ハード島とマクドナルド諸島", + "モーリタニア", + "マリ共和国", + "モロッコ", + "アンダルシア州", + "スペイン", + "カスティーリャ=ラ・マンチャ州", + "カスティーリャ・イ・レオン州", + "ココス[キーリング]諸島", + "クリスマス島", + "西オーストラリア", + "オーストラリア", + "ノーザンテリトリー", + "インドネシア", + "ソマリア", + "イラン", + "タイ王国", + "新疆ウイグル自治区", + "海南省", + "インド", + "青海省", + "チベット自治区", + "甘粛省", + "寧夏回族自治区", + "中国", + "陝西省", + "山西省", + "雲南省", + "四川省", + "貴州省", + "重慶市", + "広西チワン族自治区", + "湖北省", + "湖南省" + ], + "name_pt": [ + "Ilhas Marianas Setentrionais", + "Japão", + "Havaí", + "Oceânia", + "Nova Gales do Sul", + "Território da Capital Australiana", + "Austrália Meridional", + "Ilha Norfolk", + "Nova Zelândia", + "Madagáscar", + "Tasmânia", + "Antártida", + "Mauritânia", + "Mali", + "Tindufe", + "Marrocos", + "Bordj Badji Mokhtar", + "Adrar", + "Béni Abbès", + "Andaluzia", + "Espanha", + "Castela", + "Castela e Leão", + "Ilhas Coco", + "Ilha Christmas", + "Austrália Ocidental", + "Austrália", + "Território do Norte", + "Ilhas Ashmore e Cartier", + "Indonésia", + "Somália", + "Irão", + "Tailândia", + "Sinquião", + "Ainão", + "Índia", + "Chingai", + "Tibete", + "Gansu", + "Ningxia", + "China", + "Xianxim", + "Xanxim", + "Yunnan", + "Sujuão", + "Guizhou", + "Chongqing", + "Quancim", + "Hubei", + "Hunan" + ], + "name_ru": [ + "Северные Марианские острова", + "Япония", + "Гавайи", + "Американское Самоа", + "Острова Кораллового моря", + "Океания", + "Квинсленд", + "Новый Южный Уэльс", + "Территория Джервис", + "Территория столицы Австралии", + "Южная Австралия", + "Виктория", + "Остров Норфолк", + "Новая Зеландия", + "Мадагаскар", + "Тасмания", + "Антарктида", + "Остров Херд и острова Макдональд", + "Ход", + "Каес", + "Тагант", + "Куликоро", + "Сегу", + "Сикасо", + "Мавритания", + "Адрар", + "Мопти", + "Мали", + "Тимбукту", + "Трарза", + "Вади", + "Эль", + "Тирис", + "Тиндуф", + "Сус", + "Марокко", + "Драа", + "Бордж", + "Бени", + "Восточная область", + "Андалусия", + "Испания", + "Кастилия", + "Кастилия и Леон", + "Кокосовые (Килинг) острова", + "Остров Рождества", + "Западная Австралия", + "Австралия", + "Северная территория", + "Острова Ашмор и Картье" + ], + "rank": [ + 4, + 0, + 5, + 1, + 6, + 2, + 7, + 8, + 3, + 9, + 10, + 11, + 12, + 13 + ], + "name_ar": [ + "ﻥﺎﺑﺎﻴﻟﺍ", + "ﻱﺍﻭﺎﻫ", + "ﺔﻴﻜﻳﺮﻣﻷﺍ ﺍﻮﻣﺎﺳ", + "ﻝﺍﺭﻮﻜﻟﺍ ﺮﺤﺑ ﺭﺰﺟ", + "ﺎﻴﺳﻮﻧﺎﻴﻗﻭﺃ", + "ﺪﻧﻻﺰﻨﻳﻮﻛ", + "ﺰﻠﻳﻭ ﺙﻭﺎﺳﻮﻴﻧ", + "ﺲﻴﻓﺮﻴﺟ ﺞﻴﻠﺧ ﻢﻴﻠﻗﺇ", + "ﺔﻴﻟﺍﺮﺘﺳﻷﺍ ﺔﻤﺻﺎﻌﻟﺍ ﺔﻌﻃﺎﻘﻣ", + "ﺎﻴﻟﺍﺮﺘﺳﺃ ﺏﻮﻨﺟ", + "ﺎﻳﺭﻮﺘﻜﻴﻓ ﺔﻳﻻﻭ", + "ﻚﻟﻮﻓﺭﻮﻧ ﺓﺮﻳﺰﺟ", + "ﺍﺪﻨﻠﻳﺯﻮﻴﻧ", + "ﺮﻘﺸﻏﺪﻣ", + "ﺎﻨﻴﺳﺎﻣﺍﻮﺗ ﻢﻴﻠﻗﺇ", + "ﺎﻴﻧﺎﻤﺴﺗ", + "ﺔﻴﺑﻮﻨﺠﻟﺍ ﺔﻴﺒﻄﻘﻟﺍ ﺓﺭﺎﻘﻟﺍ", + "ﺪﻟﺎﻧﻭﺪﻛﺎﻣ ﺭﺰﺟﻭ ﺩﺮﻴﻫ ﺓﺮﻳﺰﺟ", + "ﻲﺑﺮﻐﻟﺍ ﺽﻮﺤﻟﺍ ﺔﻳﻻﻭ", + "ﻥﺎﻜﻧﺎﻛ", + "ﺲﻳﺎﻛ", + "ﺖﻧﺎﻜﺗ ﺔﻳﻻﻭ", + "ﻭﺭﻮﻜﻴﻟﻮﻛ", + "ﻮﻐﻴﺳ", + "ﻮﺳﺎﻜﻴﺳ", + "ﺎﻴﻧﺎﺘﻳﺭﻮﻣ", + "ﺭﺍﺭﺩﺃ", + "ﻲﻗﺮﺸﻟﺍ ﺽﻮﺤﻟﺍ", + "ﻲﺘﺑﻮﻣ", + "ﻲﻟﺎﻣ", + "ﻮﺘﻜﺒﻤﺗ", + "ﺓﺯﺭﺍﺮﺘﻟﺍ", + "ﺔﻠﺧﺍﺪﻟﺍ", + "ءﺍﺮﻤﺤﻟﺍ ﺔﻴﻗﺎﺴﻟﺍ ﻥﻮﻴﻌﻟﺍ", + "ﺭﻮﻣﺯ ﺱﺮﻴﺗ", + "ﻑﻭﺪﻨﺗ", + "ﺱﻮﺳ", + "ﺏﺮﻐﻤﻟﺍ", + "ﺖﻟﻼﻴﻓﺎﺗ ﺔﻋﺭﺩ", + "ﺭﺎﺘﺨﻣ ﻲﺟﺎﺑ ﺝﺮﺑ", + "ﺱﺎﺒﻋ ﻲﻨﺑ", + "ﺔﻴﻗﺮﺸﻟﺍ", + "ﺎﻴﺳﻮﻟﺪﻧﺃ", + "ﺎﻴﻧﺎﺒﺳﺇ", + "ﺔﻟﺎﺘﺸﻗ", + "ﻥﻮﻴﻟﻭ ﺔﻟﺎﺘﺸﻗ", + "(ﻎﻨﻴﻠﻴﻛ) ﺱﻮﻛﻮﻛ ﺭﺰﺟ", + "ﺩﻼﻴﻤﻟﺍ ﺓﺮﻳﺰﺟ", + "ﺔﻴﺑﺮﻐﻟﺍ ﺎﻴﻟﺍﺮﺘﺳﺃ", + "ﺎﻴﻟﺍﺮﺘﺳﺃ" + ], + "name_ko": [ + "일본", + "하와이", + "빅토리아", + "노퍽섬", + "뉴질랜드", + "마다가스카르", + "남극", + "허드 맥도널드 제도", + "모리타니", + "말리", + "모로코", + "스페인", + "코코스제도", + "크리스마스 섬", + "오스트레일리아", + "인도네시아", + "소말리아", + "이란", + "태국", + "신장위구르자치구", + "하이난성", + "인도", + "칭하이성", + "티베트 자치구", + "간쑤성", + "닝샤 후이족 자치구", + "중국", + "산시성", + "윈난 성", + "쓰촨 성", + "구이저우성", + "충칭시", + "광시 좡족 자치구", + "후베이성", + "후난성", + "허베이성", + "허난성", + "베이징시", + "톈진시", + "안후이성", + "산둥성", + "장쑤성", + "마카오", + "광둥성", + "홍콩", + "장시성", + "저장성", + "푸젠성", + "수마트라슬라탄 주", + "갈라파고스 제도" + ], + "name_vi": [ + "Nhật Bản", + "Samoa thuộc Mỹ", + "Quần đảo Biển San hô", + "Châu Đại Dương", + "Lãnh thổ Thủ đô Úc", + "Nam Úc", + "Đảo Norfolk", + "New Zealand", + "Madagascar", + "Châu Nam Cực", + "Mauritanie", + "Mali", + "Maroc", + "Tây Ban Nha", + "Quần đảo Cocos (Keeling)", + "Đảo Giáng Sinh", + "Tây Úc", + "Úc", + "Lãnh thổ Bắc", + "Quần đảo Ashmore và Cartier", + "Indonesia", + "Somalia", + "Iran", + "Thái Lan", + "Tân Cương", + "Hải Nam", + "Ấn Độ", + "Thanh Hải", + "Khu tự trị Tây Tạng", + "Cam Túc", + "Ninh Hạ", + "Trung Quốc", + "Thiểm Tây", + "Vân Nam", + "Tứ Xuyên", + "Quý Châu", + "Trùng Khánh", + "Quảng Tây", + "Hồ Bắc", + "Hồ Nam", + "Hà Bắc", + "Hà Nam", + "Bắc Kinh", + "Thiên Tân", + "An Huy", + "Sơn Đông", + "Giang Tô", + "Ma Cao", + "Quảng Đông", + "Hồng Kông" + ], + "name_zh": [ + "日本", + "夏威夷州", + "美属萨摩亚", + "大洋洲", + "昆士兰州", + "新南威尔士州", + "首都领地", + "南澳大利亚州", + "维多利亚州", + "诺福克岛", + "新西兰", + "马达加斯加", + "塔斯马尼亚州", + "南极洲", + "赫德岛和麦克唐纳群岛", + "毛里塔尼亚", + "马里共和国", + "廷巴克图", + "摩洛哥", + "安达鲁西亚", + "西班牙", + "卡斯蒂利亚", + "科科斯(基林)群島", + "圣诞岛", + "西澳大利亚州", + "澳大利亚", + "北领地", + "印度尼西亚", + "索马里", + "伊朗", + "泰国", + "新疆维吾尔自治区", + "海南省", + "印度", + "青海省", + "洞朗地区", + "西藏自治区", + "中国实控白玉地区", + "巴里加斯", + "甘肃省", + "宁夏回族自治区", + "中国", + "陕西省", + "山西省", + "云南省", + "四川省", + "贵州省", + "重庆市", + "广西壮族自治区", + "湖北省" + ], + "abbr": [ + "Hawaii", + "QLD", + "NSW", + "ACT", + "新", + "海南省", + "青", + "藏", + "甘", + "宁", + "陕", + "陕西省", + "晋", + "云", + "川", + "黔", + "渝", + "桂", + "鄂", + "湘", + "冀", + "豫", + "京", + "津", + "皖", + "鲁", + "苏", + "粤", + "HK", + "赣", + "浙", + "闽", + "Sumbar", + "Sumsel", + "Babel", + "Kalbar", + "Jabar", + "Jateng", + "Jatim", + "Kalteng", + "Kalsel", + "NTB", + "NTT", + "Sulsel", + "Sulteng", + "Sulbar", + "Sultra", + "Pabar", + "RJ", + "MG" + ], + "capital": [ + 2, + 1 + ] + } + }, + "poi": { + "minzoom": 0, + "maxzoom": 14, + "fields": { + "name": [ + "Indian Ocean", + "Southern Ocean", + "Atlantic Ocean", + "Pacific Ocean", + "Arctic Ocean", + "خليج عدن", + "بحر العرب", + "Laut Jawa", + "South China Sea", + "Sulu Sea", + "Celebes Sea", + "Molucca Sea", + "Bohol Sea", + "Camotes Sea", + "Visayan Sea", + "Samar Sea", + "Sibuyan Sea", + "Laccadive Sea", + "Laut Seram", + "Laut Halmahera", + "Laut Banda", + "Laut Bali", + "Laut Flores", + "Κρητικό πέλαγος", + "Ικάριο πέλαγος", + "Μυρτώο Πέλαγος", + "Θρακικό Πέλαγος", + "Levantine Sea", + "البحر الأحمر", + "Andaman Sea", + "Mar Cantábrico", + "Mar da Palha", + "بحر البحران", + "Gulf of Guinea", + "Mar Ligure", + "Mar Tirreno", + "Mediterranean Sea", + "البحر الليبي", + "Jadransko more", + "Ionian Sea", + "Sea of Okhotsk", + "Охотское море", + "خلیج عمان", + "خور العديد", + "North Atlantic Ocean", + "Bering Sea", + "Gulf of Alaska", + "Восточно", + "Море Лаптевых", + "Irminger Sea" + ], + "name_ar": [ + "المحيط الهندي", + "المحيط المتجمد الجنوبي", + "المحيط الأطلسي", + "المحيط الهادئ", + "المحيط المتجمد الشمالي", + "خليج عدن", + "بحر العرب", + "بحر جاوة", + "بحر الصين الجنوبي", + "بحر سولو", + "بحر سيليبس", + "بحر مالوكا", + "بحر بوهول", + "بحر كاموتس", + "بحر ييسايا", + "بحر سمار", + "بحر سيبوبان", + "بحر لكديف", + "بحر سيرام", + "بحر هلماهرا", + "بحر باندا", + "بحر بالي", + "بحر فلوريس", + "بحر كريت", + "بحر إيكاريا", + "بحر ميرتون", + "بحر تراقيا", + "بحر الشام", + "البحر الأحمر", + "بحر أندامان", + "بحر كانتابريا", + "بحر البحران", + "خليج غينيا", + "البحر الليغوري", + "البحر التيراني", + "البحر الأبيض المتوسط", + "البحر الليبي", + "البحر الأدرياتيكي", + "البحر الأيوني", + "بحر أوخوتسك", + "خليج عمان", + "خور العديد", + "شمال المحيط الأطلسي", + "بحر بيرنغ", + "خليج ألاسكا", + "بحر سيبيريا الشرقي", + "بحر لابتيف", + "بحر إيرمنغر", + "البحر الكلتي", + "البحر الأيرلندي" + ], + "name_de": [ + "Indischer Ozean", + "Südlicher Ozean", + "Atlantischer Ozean", + "Pazifischer Ozean", + "Arktischer Ozean", + "Golf von Aden", + "Arabisches Meer", + "Javasee", + "Südchinesisches Meer", + "Sulusee", + "Molukkensee", + "Boholsee", + "Lakkadivensee", + "Seramsee", + "Halmaherasee", + "Bandasee", + "Balisee", + "Floressee", + "Kretisches Meer", + "Ikarisches Meer", + "Myrtoisches Meer", + "Thrakisches Meer", + "Levantisches Meer", + "Rotes Meer", + "Andamanensee", + "Kantabrisches Meer", + "Alborán", + "Golf von Guinea", + "Ligurisches Meer", + "Tyrrhenisches Meer", + "Mittelmeer", + "Libysches Meer", + "Adriatisches Meer", + "Ionisches Meer", + "Ochotskisches Meer", + "Golf von Oman", + "Nordatlantischer Ozean", + "Beringmeer", + "Golf von Alaska", + "Ostsibirische See", + "Laptewsee", + "Keltische See", + "Irische See", + "Petschorasee", + "Weißes Meer", + "Barentssee", + "Karasee", + "Philippinensee", + "Gelbes Meer", + "Ostchinesisches Meer" + ], + "name_en": [ + "Indian Ocean", + "Southern Ocean", + "Atlantic Ocean", + "Pacific Ocean", + "Arctic Ocean", + "Gulf of Aden", + "Arabian Sea", + "Java Sea", + "South China Sea", + "Sulu Sea", + "Celebes Sea", + "Molucca Sea", + "Bohol Sea", + "Camotes Sea", + "Visayan Sea", + "Samar Sea", + "Laccadive Sea", + "Ceram Sea", + "Halmahera Sea", + "Banda Sea", + "Bali Sea", + "Flores Sea", + "Sea of Crete", + "Icarian Sea", + "Myrtoan Sea", + "Thracian Sea", + "Red Sea", + "Andaman Sea", + "Cantabrian Sea", + "Alboran Sea", + "Gulf of Guinea", + "Ligurian Sea", + "Tyrrhenian Sea", + "Mediterranean Sea", + "Libyan Sea", + "Adriatic Sea", + "Ionian Sea", + "Sea of Okhotsk", + "Gulf of Oman", + "Khawr al Udayd", + "North Atlantic Ocean", + "Bering Sea", + "Gulf of Alaska", + "East Siberian Sea", + "Laptev Sea", + "Irminger Sea", + "Celtic Sea", + "Irish Sea", + "Sea of the Hebrides", + "Pechora Sea" + ], + "name_es": [ + "Océano Índico", + "Océano Antártico", + "Océano Atlántico", + "Océano Pacífico", + "Océano Ártico", + "Golfo de Adén", + "Mar Arábigo", + "Mar de Java", + "Mar de la China Meridional", + "Mar de Joló", + "Mar de Laquedivas", + "Mar de Creta", + "Mar de Mirtos", + "Mar de Tracia", + "Mar Levantino", + "Mar Rojo", + "Mar de Andamán", + "Mar Cantábrico", + "Mar de la Paja", + "Mar de Alborán", + "Golfo de Guinea", + "Mar de Liguria", + "Mar Tirreno", + "Mar Mediterráneo", + "Mar de Libia", + "Mar Adriático", + "Mar Jónico", + "Mar de Ojotsk", + "Golfo de Omán", + "Océano Atlántico Norte", + "Mar de Bering", + "Golfo de Alaska", + "Mar de Láptev", + "Mar de Irlanda", + "Mar de las Hébridas", + "Mar de Pechora", + "Mar Blanco", + "Mar de Barents", + "Mar Amarillo", + "Mar Interior de Seto", + "Mar de Yatsushiro", + "Océano Pacífico Norte", + "Mar de Beaufort", + "Mar de Chukotsk", + "Mar del Coral", + "Mar de Groenlandia", + "Mar de Lincoln", + "Bahía de Baffin", + "Mar de Tasmania", + "Mar de los Sargazos" + ], + "name_fr": [ + "Océan Indien", + "Océan Austral", + "Océan Atlantique", + "Océan Pacifique", + "Océan Arctique", + "Golfe d'Aden", + "Mer d'Arabie", + "Mer de Java", + "Mer de Chine méridionale", + "Mer de Sulu", + "Mer de Célèbes", + "Mer des Moluques", + "mer de Bohol", + "mer des Camotes", + "mer de Visayan", + "mer de Samar", + "mer de Sibuyan", + "Mer des Laquedives", + "Mer de Seram", + "Mer d'Halmahera", + "Mer de Banda", + "Mer de Bali", + "Mer de Florès", + "Mer de Crète", + "Mer Icarienne", + "mer de Myrto", + "Mer de Thrace", + "Bassin Levantin", + "Mer Rouge", + "Mer d'Andaman", + "Mer Cantabrique", + "Mer de Paille", + "Mer d'Alboran", + "Golfe de Guinée", + "Mer Ligure", + "Mer Tyrrhénienne", + "Mer Méditerranée", + "Mer de Libye", + "Mer Adriatique", + "Mer Ionienne", + "Mer d'Okhotsk", + "Golfe d'Oman", + "Océan Atlantique Nord", + "Mer de Béring", + "Golfe d'Alaska", + "Mer de Sibérie orientale", + "Mer de Laptev", + "mer d´Irminger", + "Mer Celtique", + "Mer d'Irlande" + ], + "name_it": [ + "Oceano Indiano", + "Mari antartici", + "Oceano Atlantico", + "Oceano Pacifico", + "Mare glaciale artico", + "Golfo di Aden", + "Mar Arabico", + "Mar di Giava", + "Mar Cinese Meridionale", + "Mare di Sulu", + "Mar di Levante", + "Mar Rosso", + "Mare delle Andamane", + "Mar Cantabrico", + "Mare di Alborán", + "Golfo di Guinea", + "mar Ligure", + "Mar Tirreno", + "Mar Mediterraneo", + "Mar Libico", + "Mare Adriatico", + "Mar Ionio", + "Golfo di Oman", + "Mare di Bering", + "Golfo dell'Alaska", + "Mare della Siberia orientale", + "Mare di Laptev", + "Mare Celtico", + "Mare d'Irlanda", + "Mare delle Ebridi", + "Mare della Pečora", + "Mar Bianco", + "Mare di Barents", + "Mare di Kara", + "Mare interno di Seto", + "Mare di Beaufort", + "Mare dei Čukči", + "Mare di Groenlandia", + "Mare di Lincoln", + "Baia di Baffin", + "Mar dei Sargassi", + "Mare di Ross", + "Mare di Amundsen", + "Mare di Scotia", + "Mare di Weddell", + "Mare di Bellingshausen", + "Mare Caraibico", + "Golfo di California", + "Golfo del Messico", + "Canale di Drake" + ], + "name_ja": [ + "インド洋", + "大西洋", + "太平洋", + "北極海", + "アラビア海", + "ジャワ海", + "南支那海", + "レバント海", + "紅海", + "アンダマン海", + "リグリア海", + "地中海", + "オホーツク海", + "北大西洋", + "ベーリング海", + "ヘブリディーズ海", + "フィリピン海", + "黄海", + "東シナ海", + "瀬戸内海", + "八代海", + "南海", + "天草灘", + "周防灘", + "安芸灘", + "斎灘", + "北太平洋", + "南太平洋", + "南大西洋", + "カリブ海", + "黒海", + "カスピ海", + "日本海", + "シナイ半島", + "アラビア半島", + "バルト海", + "ワッデン海", + "北海", + "ラプラタ川", + "ペルシア湾", + "キジルクム砂漠", + "バルカン半島", + "台湾海峡", + "コラ半島", + "セントローレンス湾", + "フェニックス諸島保護地域", + "パパハナウモクアケア", + "イタリア半島", + "ブランスフィールド海峡", + "オカピ野生生物保護区" + ], + "name_pt": [ + "Oceano Índico", + "Oceano Antártico", + "Oceano Atlântico", + "Oceano Pacífico", + "Oceano Ártico", + "Mar de Java", + "Mar da China Meridional", + "Mar de Sulu", + "Mar Levantino", + "Mar Lígure", + "Mar da Líbia", + "Mar da Irlanda", + "Mar das Hébridas", + "Mar de Pechora", + "Mar Branco", + "Mar Amarelo", + "Mar da China Oriental", + "Mar Interior de Seto", + "Mar da Gronelândia", + "Baía de Baffin", + "Golfo de São Lourenço", + "Mar Negro", + "Mar Cáspio", + "Mar do Japão", + "Golfo de Sidra", + "Ténéré", + "Lago Vitória", + "Sinai", + "Grande Erg Oriental", + "Arábia", + "Grande Baía Australiana", + "Mar Báltico", + "Mar de Bótnia", + "Baía de Bótnia", + "Mar Frísio", + "Mar do Norte", + "Estreito de Macáçar", + "Rio da Prata", + "Golfo da Tailândia", + "Golfo Pérsico", + "Kyzyl Kum", + "Bálcãs", + "Estreito de Taiwan", + "península de Kola", + "Golfo de Bótnia", + "península Itálica", + "Estreito de Bass", + "Estreito de Bransfield", + "Parque Nacional Etosha", + "Parque Nacional Kruger" + ], + "name_ru": [ + "Индийский океан", + "Южный океан", + "Атлантический океан", + "Тихий океан", + "Северный Ледовитый океан", + "Аденский залив", + "Аравийское море", + "Яванское море", + "Южно", + "Море Сулу", + "Море Сулавеси", + "Молуккское море", + "Море Минданао", + "Море Камотес", + "Море Висаян", + "Море Самар", + "Лаккадивское море", + "Море Серам", + "Море Хальмахера", + "Море Банда", + "Море Бали", + "Море Флорес", + "Критское море", + "Икарийское море", + "Миртойское море", + "Фракийское море", + "Левантийское море", + "Красное море", + "Андаманское море", + "Бискайский залив", + "море Альборан", + "Гвинейский залив", + "Лигурийское море", + "Тирренское море", + "Средиземное море", + "Ливийское море", + "Адриатическое море", + "Ионическое море", + "Охотское море", + "Оманский залив", + "Хор", + "Северный Атлантический океан", + "Берингово море", + "Аляскинский залив", + "Восточно", + "Море Лаптевых", + "Море Ирмингера", + "Кельтское море", + "Ирландское море", + "Гебридское море" + ], + "name_vi": [ + "Ấn Độ Dương", + "Nam Đại Dương", + "Đại Tây Dương", + "Vịnh Aden", + "Biển Ả Rập", + "Biển Đông", + "Biển Crete", + "Biển Đỏ", + "Biển Andaman", + "Biển Alboran", + "Vịnh Guinea", + "Biển Ligure", + "Biển Tyrrhenus", + "Biển Ionia", + "Vịnh Oman", + "Bắc Đại Tây Dương", + "Biển Bering", + "Vịnh Alaska", + "Biển Đông Siberi", + "Biển Laptev", + "Biển Celtic", + "Biển Ireland", + "Biển Hebrides", + "Biển Trắng", + "Biển Barents", + "Biển Kara", + "Hoàng Hải", + "Biển Hoa Đông", + "Bắc Thái Bình Dương", + "Biển Chukotka", + "Biển Greenland", + "Biển Sargasso", + "Nam Thái Bình Dương", + "Biển Davis", + "Nam Đại Tây Dương", + "Biển Caribe", + "Vịnh Ca Li", + "Vịnh Mexico", + "Vịnh Hudson", + "Biển Đen", + "Biển Caspi", + "Bán đảo Sinai", + "Bán đảo Ả Rập", + "Biển Wadden", + "Bắc Hải", + "Biển Na Uy", + "Vịnh Ba Tư", + "Sa mạc Taklamakan", + "Vịnh Bắc Bộ", + "Balkan" + ], + "name_zh": [ + "印度洋", + "南冰洋", + "大西洋", + "太平洋", + "北冰洋", + "亚丁湾", + "阿拉伯海", + "爪哇海", + "南海", + "苏禄海", + "西里伯斯海", + "马鲁古海", + "保和海", + "卡莫特斯海", + "米沙鄢海", + "拉克代夫海", + "塞兰海", + "哈馬黑拉海", + "班达海", + "峇里海", + "弗洛勒斯海", + "克里特海", + "伊卡利安海", + "黎凡特海", + "红海", + "安达曼海", + "阿尔沃兰海", + "利古里亞海", + "第勒尼安海", + "地中海", + "利比亚海", + "亚得里亚海", + "爱奥尼亚海", + "鄂霍次克海", + "阿曼湾", + "北大西洋", + "白令海", + "东西伯利亚海", + "拉普捷夫海", + "伊爾明厄海", + "凯尔特海", + "爱尔兰海", + "赫布里底海", + "伯朝拉海", + "白海", + "巴伦支海", + "喀拉海", + "菲律宾海", + "黄海", + "东海" + ], + "class": [ + "water", + "outdoor", + "aboriginal_lands", + "tourism", + "military", + "historic", + "government", + "aeroway", + "shop", + "sport", + "school", + "rest", + "building", + "fire_station", + "religious", + "medical", + "aerialway", + "police", + "amenity", + "fuel", + "food_drink", + "ranger_station", + "transport", + "addr" + ], + "type": [ + "ocean", + "sea", + "protected_area", + "desert", + "nature_reserve", + "sand", + "bay", + "water", + "peninsula", + "strait", + "landfill", + "wood", + "glacier", + "national_park", + "wetland", + "attraction", + "tundra", + "grassland", + "scrub", + "forest", + "farm", + "sinkhole", + "park", + "historic", + "habitat", + "meadow", + "volcano", + "information", + "orchard", + "fort", + "residential", + "reservoir", + "vineyard", + "grass", + "prison", + "battlefield", + "construction", + "quarry", + "industrial", + "peak", + "aerodrome", + "basin", + "bicycle", + "allotments", + "heritage", + "aquaculture", + "museum", + "skiing", + "camp_site", + "commercial" + ], + "name_ko": [ + "아덴 만", + "아라비아 해", + "자와 해", + "술루 해", + "술라웨시 해", + "래카다이브 해", + "크레타 만", + "리구리아해", + "지중해", + "오호츠크 해", + "베링 해", + "켈트 해", + "필리핀 해", + "황해", + "동중국해", + "야쓰시로 해", + "남해", + "산호해", + "그린란드 해", + "배핀 만", + "아문센 해", + "스코샤 해", + "웨들 해", + "벨링스하우젠 해", + "칼리포르니아 만", + "드레이크 해협", + "허드슨 만", + "흑해", + "동해", + "시나이 반도", + "아라비아 반도", + "발트해", + "북해", + "노르웨이 해", + "라플라타 강", + "타이만", + "페르시아 만", + "통킹만", + "키질쿰 사막", + "발칸 반도", + "콜라 반도", + "세인트로렌스 만", + "이탈리아 반도", + "만나르 만", + "호르무즈 해협", + "리옹만", + "코텔니 섬", + "디날리 국립공원", + "그레이트베어 호", + "그레이트슬레이브 호" + ], + "abbr": [ + "جزائر عدر عيل", + "Karskoye More", + "零丁洋", + "McKinleyhavet", + "Mar de Hoces" + ], + "icon": [ + "protected_area", + "desert", + "sand", + "landuse", + "aboriginal_lands", + "wood", + "attraction", + "military", + "tundra", + "grassland", + "scrub", + "farm", + "sinkhole", + "park", + "historic", + "volcano", + "information", + "orchard", + "vineyard", + "prison", + "quarry", + "peak", + "aerodrome", + "shop", + "museum", + "sport", + "camp_site", + "theme_park", + "archaeological_site", + "university", + "zoo", + "viewpoint", + "animal", + "tree", + "hotel", + "fort", + "outdoor", + "dune", + "garden", + "grave_yard", + "railway", + "fire_station", + "sports_centre", + "golf_course", + "cemetery", + "track", + "school", + "pitch", + "college", + "muslim" + ], + "iata": [ + "JED", + "BAB", + "NKX", + "BAD", + "JNB", + "HDS", + "QUO", + "LOS", + "NKC", + "MSW", + "GSQ", + "SEB", + "BCQ", + "DAK", + "HMB", + "CBH", + "HRG", + "SRX", + "MZW", + "LOO", + "BEN", + "TUU", + "TOB", + "CAI", + "MUH", + "HBE", + "TCP", + "VDA", + "QMH", + "DAM", + "MAD", + "ZAZ", + "TQD", + "FCO", + "QIE", + "CGK", + "KUL", + "BLR", + "BKK", + "TKH", + "SLL", + "MDL", + "HKG", + "CAN", + "KMG", + "MCT", + "RMQ", + "AAN", + "DHF", + "AUH" + ], + "icao": [ + "OEJN", + "HL69", + "ORAA", + "KBAB", + "KNKX", + "KBAD", + "FAOR", + "FAHS", + "FALM", + "DNAI", + "DNMM", + "GQNO", + "HHMS", + "HEOW", + "DAAN", + "HLLS", + "HE14", + "HEDK", + "HESG", + "DAOR", + "HEGN", + "HLGD", + "DAAY", + "DAUL", + "HLLB", + "OETB", + "HLGN", + "HECA", + "HEMM", + "HEBA", + "HETB", + "LLOV", + "DAOE", + "LLRM", + "DABO", + "OJMS", + "OSDI", + "LEMD", + "LEZG", + "ORAT", + "LIRF", + "ORBD", + "LFMI", + "LFBC", + "ORQW", + "WIII", + "WMKK", + "VOBL", + "VTBS", + "VTPI" + ], + "elev": [ + "909", + "910", + "388", + "510", + "580", + "449", + "252.8", + "571", + "564", + "589.8", + "514", + "750.7224", + "730.9", + "738", + "718.7", + "670.0", + "892.7592000000001", + "739.7", + "200", + "755.9", + "866.8512000000001", + "744", + "815.0", + "1216", + "795.8", + "760.8", + "912.9", + "653.8", + "148.5", + "412.3", + "506", + "989", + "1137", + "1316", + "1198.7784000000001", + "1052.8", + "1165.9", + "1033.9", + "1002.8", + "1016.8", + "947.9", + "1062", + "538.0", + "974.7504", + "681", + "954.2", + "1266.7488", + "1246.9368000000002", + "1266.7", + "216.9" + ], + "elev_ft": [ + 2982.28356, + 2985.5644, + 1272.96592, + 1673.2284, + 1902.8872, + 1473.09716, + 829.396352, + 1873.35964, + 1850.39376, + 1935.0394319999998, + 1686.35176, + 2463.000078816, + 2397.965956, + 2421.25992, + 2357.9397080000003, + 2198.1628, + 2929.000093728, + 2426.837348, + 656.168, + 2479.9869559999997, + 2844.0000910080003, + 2440.94496, + 2673.8846, + 3989.50144, + 2610.892472, + 2496.063072, + 2995.0788359999997, + 2145.013192, + 487.20474, + 1352.6903320000001, + 1660.10504, + 3244.75076, + 3730.31508, + 4317.58544, + 3933.0001258560005, + 3454.068352, + 3825.1313560000003, + 3392.060476, + 3290.026352, + 3335.958112, + 3109.9082359999998, + 3484.2520799999998, + 1765.09192, + 3198.000102336, + 2234.25204, + 3130.5775280000003, + 4156.0001329920005, + 4091.0001309120007, + 4155.8400280000005, + 711.614196 + ] + } + }, + "transport": { + "minzoom": 2, + "maxzoom": 13, + "fields": { + "class": [ + "highway", + "piste", + "water", + "railway", + "path", + "aeroway", + "aerialway", + "man_made", + "motorway_junction", + "traffic_signals" + ], + "type": [ + "motorway", + "trunk", + "primary", + "ferry", + "tertiary", + "secondary", + "primary_link", + "secondary_link", + "tertiary_link", + "motorway_link", + "trunk_link", + "train", + "tracks", + "runway", + "taxiway", + "rail", + "disused", + "abandoned", + "narrow_gauge", + "preserved", + "miniature", + "monorail", + "funicular", + "tram", + "cable_car", + "light_rail", + "airstrip", + "bus", + "subway", + "construction", + "gondola", + "chair_lift", + "unclassified", + "track", + "residential", + "taxilane", + "footway", + "cycleway", + "trolleybus", + "mixed_lift", + "service", + "raceway", + "pedestrian", + "steps", + "bridleway", + "living_street", + "road", + "t-bar", + "zip_line", + "goods" + ], + "ISO1": [ + "ZA", + "NA", + "AO", + "BR", + "FR", + "CI", + "SN", + "GH", + "SZ", + "ID", + "AU", + "UG", + "PH", + "BN", + "ET", + "IN", + "LK", + "TL", + "99", + "IQ", + "CY", + "TR", + "IL", + "GR", + "EG", + "LB", + "SY", + "BG", + "JO", + "PS", + "SA", + "RS", + "MK", + "MY", + "TH", + "VN", + "SG", + "CN", + "MM", + "ES", + "MA", + "PT", + "DZ", + "PK", + "KZ", + "NG", + "GQ", + "IT", + "HR", + "TN" + ], + "ref": [ + "R72", + "R67", + "N2", + "R102", + "M4", + "M13", + "R334", + "R343", + "P1532", + "OP4979", + "P336", + "R325", + "R43", + "P1525", + "P1529", + "R330", + "R62", + "R316", + "R319", + "R331", + "R305", + "M12", + "M9", + "M3", + "M7", + "M15", + "M11", + "M18", + "M14", + "M8", + "M5", + "R75", + "M10", + "M19", + "M26", + "M17", + "R335", + "M1", + "M16", + "R332", + "N6", + "DR02721", + "R402", + "R345", + "R342", + "N10", + "R336", + "M6", + "MR00470", + "M22" + ], + "reflen": [ + 3, + 2, + 4, + 5, + 6, + 7, + 1, + 8, + 0, + "null" + ], + "ISO2": [ + "ZA-EC", + "ZA-WC", + "ZA-NL", + "ZA-NC", + "MG-U", + "LS-H", + "ZA-FS", + "LS-F", + "LS-G", + "LS-K", + "LS-E", + "LS-J", + "LS-A", + "LS-D", + "LS-B", + "LS-C", + "BR-SP", + "BR-RJ", + "SZ-SH", + "ZA-MP", + "MZ-L", + "SZ-LU", + "SZ-MA", + "NA-KA", + "ZA-NW", + "SZ-HH", + "BR-MG", + "ZA-GT", + "MZ-G", + "MZ-I", + "BW-KG", + "ZA-LP", + "BW-SO", + "BW-SE", + "BW-LO", + "BR-ES", + "NA-HA", + "BW-KW", + "BW-KL", + "BW-GA", + "BW-JW", + "BW-CE", + "MG-M", + "ZW-MS", + "ZW-MV", + "NA-OH", + "BW-GH", + "MZ-B", + "MZ-S", + "NA-KH" + ], + "piste:difficulty": [ + "novice", + "easy", + "advanced", + "intermediate", + "expert", + "freeride", + "extreme", + "easy;intermediate", + "novice;easy;intermediate;advanced", + "blue", + "hard", + "green", + "fixme", + "difficult", + "expert;easy;easy", + "intermediate;easy", + "0", + "intermediary", + "in", + "beginner", + "nordic", + "L", + "WS", + "WS-", + "medium", + "inter", + "black", + "intermediate;advanced", + "intermediate+advanced", + "boardercross", + "*", + "GPS+Bing", + "unknown", + "easy;advanced", + "Traverse", + "easy; intermediate", + "Difficult", + "playground" + ], + "modifier": [ + "-business" + ], + "name": [ + "The Trail", + "Cape Town - Tristan da Cunha", + "Queen's Road", + "Calshot Crescent", + "Watkins Road", + "Elliot Road", + "Prince Phillip Road", + "Forsyth Thompson Street", + "Harris Street", + "St Mary's Road", + "Hillside Road", + "Scott Street", + "Anchorstock Road", + "Station Lane", + "Day Street", + "'61 volcano path", + "Marine Drive", + "Dunes", + "Seal Point Boulevard", + "Drake Place", + "Barcelona Street", + "Meermin Avenue", + "Da Gama Way", + "Lyngenfjord Way", + "Saint Francis Way", + "De Jonge Thomas Avenue", + "Grosvenor Way", + "Akbar Street", + "Panaghia Street", + "Niagara Street", + "President Reitz Way", + "Stavenisse", + "La Eagle Way", + "Periwinkle Lane", + "Seashell Lane", + "Rots Avenue", + "Cape Recife Avenue", + "Waratah Avenue", + "Dias Crescent", + "Bender Avenue", + "Queen of the West Boulevard", + "Birkenhead Avenue", + "Osprey Street", + "Rietbok Crescent", + "Suffolk Lane", + "Haerlem", + "Maorie Avenue", + "The Hope Crescent", + "Lady Heal Lane", + "Victoria Drive" + ], + "layer": [ + -1, + 1, + 2, + 3, + 0, + 5, + -2, + -3, + 4, + -5, + -4, + -16, + -15, + 20, + -7, + -6, + 6, + 21, + -0.5, + 7, + -1.5, + 10, + 12, + 8, + 40, + -8, + 0.5, + -17, + 3.5, + -100, + 11, + -112, + 97, + 100, + 93, + 53, + 47, + 35, + 14, + 9, + 13, + 15, + 18, + 19, + 26, + 16, + 41, + 51, + 36, + 23 + ], + "bicycle": [ + true + ], + "lanes": [ + 2, + 1, + 4, + 3, + 5, + 6, + 0, + 7, + 8, + 9, + 10, + 20, + 30, + 11, + -1, + -4, + -2, + 12, + 50, + 13, + 100, + 15, + 32, + 16, + 1.5, + 60, + 40, + 22, + 14, + 25, + 26, + 27, + 21, + 18, + 36, + 38, + 24, + 80, + 17, + 23, + 81, + 1255, + 29, + 70, + 3.5, + 2.4, + 2.8, + 0.5, + 1.2, + 150 + ], + "oneway": [ + true + ], + "tunnel": [ + true + ], + "crossing": [ + true + ], + "bridge": [ + true + ], + "name_en": [ + "Duiker Street", + "Port Jackson Avenue", + "Protea Road", + "Bloekom Avenue", + "Market Avenue", + "Lagoon Road", + "Pondokkie Street", + "Buchu Avenue", + "Seamans Road", + "Seaman's Road", + "Glashout Close", + "Bietou Avenue", + "Uitkyk Street", + "Rasper Avenue", + "Seafarer Avenue", + "Taaibos Close", + "Duine Avenue", + "Camp Road", + "Blombos Avenue", + "Steenbok Street", + "Eureka Street", + "Main Road", + "Long Street", + "Horsehead Trail", + "Karmosyn Road", + "Borneo Road", + "Skipper Road", + "Delmonte Place", + "Burgundy Road", + "Avonteur Crescent", + "Marrah Crescent", + "Barlow Place", + "Boeing Crescent", + "Burgundy Crescent", + "Labans Place", + "Garnet Road", + "Homestead Crescent", + "Labans Road", + "Hutton Street", + "Drakensberg Road", + "Lebombo Road", + "Outeniqua Road", + "Magalies Road", + "Brandberg Road", + "Swartberg Road", + "Soutpansberg Place", + "Boeing Road", + "Angus Place", + "Captain W.A. Duthie Avenue", + "Rhino Place" + ], + "toll": [ + true + ], + "piste:type": [ + "downhill", + "yes", + "hike", + "bridge", + "residential", + "skitour", + "snow_park", + "playground", + "nordic", + "sled", + "ice_skate", + "sleigh", + "sled;half-pipe", + "connection", + "uphill", + "downhill;nordic", + "Vista Varmania", + "nordic;hike", + "alpine", + "classic", + "downhill;sled", + "ski_jump", + "snow_tube", + "skiing", + "halfpipe", + "jumping", + "mogul", + "ski_jump_landing", + "skiting", + "snowtubing", + "toboggan", + "nordig", + "ski", + "foot", + "backcountry", + "ice_skate;playground", + "snowkite", + "sledge", + "skating", + "nordic;downhill", + "nordic;skitour", + "proposed", + "Vorbergloipe", + "skiroute", + "traverse", + "nordic; sled", + "nordic; hike", + "connexion", + "hiking", + "closed" + ], + "name_de": [ + "Wanderweg auf Pedra da Gávea", + "Rua C", + "Prefeito Luiz Penna Straße", + "Zufahrt Krankenhaus", + "Wagenbauerstraße", + "Baiweg", + "Nachtigalstraße", + "Lessingstraße", + "Bahnhofstraße", + "Hohe Straße", + "Hafenstraße", + "Inselstraße", + "Woermannstraße", + "Stauchstraße", + "Ringstraße", + "Schinzstraße", + "Vogelsangstraße", + "Van-Lindequist-Straße", + "Francoistraße", + "Mabelstraße", + "Zeppelinstraße", + "Bismarckstraße", + "Diazstraße", + "Lübecker Straße", + "Kieler Straße", + "Schuckmannstraße", + "Trooststraße", + "Bremer Straße", + "Moltkestraße", + "Hamburger Straße", + "Talstraße", + "Bülowstraße", + "Brückenstraße", + "Kirchenstraße", + "Diamantbergstraße", + "Uferstraße", + "Stettiner Straße", + "Kreplinstraße", + "Werftstraße", + "Hoofstraße", + "Kindergartenstraße", + "Burenstraße", + "Bergstraße", + "Am Diamantberg", + "Estorffstraße", + "Göringstraße", + "Von Auer Platz", + "Vogelsangstrasse", + "Mozartstraße", + "Puccinistraße" + ], + "name_pt": [ + "descrição", + "Rua 12 de Fevereiro", + "Monsenhor Macedo", + "R. Antônio Lucas da Silva", + "Travessa Silvinho", + "Travessa Diamante", + "Rua Doutor Zoroastro torres", + "Rua Onze de Novembro", + "Rua Conselheiro Aloysio Costa", + "Rua Durandé", + "Rua dos Trabalhadores", + "Rua José Luiz Nogueira", + "Avenida Marginal", + "Rua Juvêncio Santana", + "2ª Travessa", + "1ª Travessa", + "Rua Patricio Lumumba", + "passarela", + "Rua Ceará", + "Serra Da Leba", + "Ponte 4 de Abril", + "Travessa Treze de Maio", + "Rua Nelson Moura", + "Travessa do Bambú", + "Travessa Jitirana", + "Travessa Canafistula", + "Travessa do Cardeiro", + "Travessa Marmeleiro", + "Travessa da Caatingueira", + "Travessa do Taquari", + "Travessa Pau-D'arco", + "Travessa do Mata-Pasto", + "Travessa das Umburanas", + "Travessa do Agave", + "Travessa da Ingazeira", + "Travessa Tomé Cavalcante", + "Avenida Nelson Marinho de Araújo", + "Rua Alto Sao Sebastiao", + "Acesso Ao Loteamento Rio Novo", + "AL-105", + "Rua Antonio Satú", + "Antiga BR-101", + "Estrada da Batalha", + "Avenida Zequinha Barreto", + "Estrada de Aldeia", + "Estrada Contentamento-Belo Monte", + "Autódromo de Luanda", + "Estrada Bananeira-Boa Nova", + "Estrada Bananeira-Malhada Grande", + "Rue das Kipacas" + ], + "name_ru": [ + "Железная дорога Корковаду", + "проспект Маргиналь", + "4 Апреля Мост", + "Луандский Автодром", + "Мурталы Мохаммеда Авеню", + "Проспект 4 де Феверейро", + "Площадь Пескадоры", + "Мвамба Драйв", + "5я Авеню", + "1я Авеню", + "4я Авеню", + "3я Авеню", + "Баобабовская", + "2я Авеню", + "Аэропорт Табоу", + "улица Тейде", + "улица Уканка", + "улица Тиманфайя", + "площадь европы", + "Кольцевая автодорога", + "избегание восток", + "1 Ноябрь-стрит", + "Улица Омари КУИДЕР", + "стрит Гасеми Ибрагим", + "проспект Независимости", + "Гасеми Ибрагим стрит", + "Улица Заоуиа Мокхтариа", + "улица ЛАРБИ БЕН МЕХИДИ", + "Улица Дехане Мохамед Лаарби", + "Филах Кхалед", + "улица эмир Абд аль-Ка́дир", + "26 Ноябрь-стрит", + "Харим", + "Эстер Малка", + "Дафна", + "Алон", + "Теена", + "Эйлот", + "ХаШахам", + "Дакар", + "ХаНешер", + "Агур", + "Авней Ха Хошен", + "Хардуф", + "Дрор", + "Наассон", + "Нурит", + "Шахаф", + "Аийт", + "ХаШита" + ], + "name_es": [ + "Cristo del Corcovado", + "Carretera de Chiguluwindi", + "Carretera de Chypiela", + "Carretera de Chiponde", + "Puente 4 de Abril", + "Autodromo de Luanda", + "Avenida Murtala Mohamed", + "Avenida 4 de Fevereiro", + "Plaza de los Pescadores", + "Llegadas", + "Salidas", + "Puente de Tuti", + "Aeródromo de Tifariti - MINURSO", + "Camino del Risco", + "Puente El Ferdan", + "Almería - Ghazaouet", + "Puente del Canal de Suez", + "Carretera Beni Ensar", + "Avenida Libertad", + "Calle Batalla Al Kalaa", + "Avenida Tareq Rass El Maa", + "Avenida Ala Verde", + "Calle Averoes", + "Callejone Ben Yeloun", + "Calle Batalla Zalaka", + "Calle La Resistencia", + "Calle Musa Ibn Nusay", + "Avenida Chakib Arsalan", + "Calla Sidi Ben Ali", + "Callejon My Ahmed Larosi", + "Avenida Autiui", + "Calle Antigua Msala", + "Avenida Hassan I", + "Calle Juel Ben Maimun", + "Callejon El Bacha", + "Calle Ben Dris", + "Calle Targui", + "Calle Metilah", + "Rue Granada", + "Calle Jarrazin", + "Callejon Ben Yakub", + "Calle Sidi Belahsen", + "calle Entre Acequias", + "Avenida Sita Hura", + "Calle lala Gaita", + "Callejon El Asri", + "Calle Berria", + "Calle Zagdud", + "Calle Sliman El Haouat", + "Calle Sidi Bouchka" + ], + "aerialway:occupancy": [ + 10, + 2, + 15, + 4, + 6, + 8, + 35, + 3, + 12, + 1, + 58, + 16, + 50, + 9, + "null", + 47, + 34, + 0, + 30, + 560, + 45, + 20, + 36, + 51, + 91, + 48, + 71, + 81, + 25, + 11, + 40, + 5, + 101, + 900, + 60, + 600, + 24, + 350, + 100, + 70, + 27, + 130, + 80, + 43, + 32, + 96, + 65, + 125, + 62, + 54 + ], + "aerialway:capacity": [ + 600, + 15, + 800, + 1500, + 2600, + 2000, + 1200, + 1155, + 1050, + 2400, + 2850, + 1180, + 2830, + 2880, + 760, + 3300, + 2275, + 2052, + 2300, + 750, + 1400, + 2370, + 3200, + 950, + 807, + 2500, + 720, + 755, + 770, + 940, + 695, + 2800, + 1800, + 1000, + 1300, + 514, + 400, + 1100, + 2100, + 900, + 820, + 1440, + 1035, + 815, + 920, + 635, + 811, + 1600, + 660, + 850 + ], + "aerialway:duration": [ + 5, + 60, + 1, + 15, + 8, + 7, + 12, + 3, + 2, + 7.9, + 5.6, + 7.3, + 5.5, + 11.8, + 7.6, + 7.5, + 8.5, + 1.7, + 3.7, + 2.4, + 1.38, + 4.5, + 1.1, + 3.9, + 4.1, + 5.3, + 8.1, + 17, + 18, + 6.4, + 4.3, + 3.4, + 1.6, + 5.1, + 3.3, + 3.2, + 10, + 20, + 1.5, + 6.3, + 3.6, + 2.3, + 2.2, + 6.9, + 8.9, + 1.9, + 11, + 5.8, + 4, + 6 + ], + "name_fr": [ + "Accès à São Bento", + "Bac de Belo-Tsiribihina", + "Montée du Karthala", + "Vers Mkazi", + "Boulevard de la Ligue Arabe", + "Boulevard Karthala", + "Avenue des Ambassadeurs", + "Rue de la Corniche", + "Rue Ahmed Djoumoi", + "Route de l'Alliance Française", + "Rue de la COI", + "Rue de l'Union Africaine", + "Rond-point Salimamoud", + "Pont 4 Avril", + "Autodrome de Luanda", + "Murtala Mohamed Avenue", + "Avenue 4 de Fevereiro", + "Place des Pêcheurs", + "Avenue Bitini", + "avenue Mosso", + "Bac Isaka - Nioki", + "Bac Selenge - Inongo", + "Bac Inongo - Lukanga", + "Rue 3.700", + "rue 3.713", + "Rue 3.703", + "Rue Marc-Vivien Foé", + "Route de Poko", + "(N°1.385)", + "(N° 1.377)", + "Dungu", + "Pont de Kongo", + "Moundou - Doba - Sarh", + "Avenue Négor", + "Rue Mota", + "Goudron Mota", + "Rond point de la Coton Tchad", + "Avenue Tombalbaye", + "شارع نيغر", + "Avenue Commercial", + "Moundou - Ngoundere", + "Moundou - Tilo", + "Moundou - Kelo - Ndjamena", + "Doba - Donga Manga", + "Av. des Jeunes", + "Av. Charles de Gaulle", + "Av. Kaskanaye", + "Ancien pont", + "Nouveau pont", + "Av. du Commerce" + ], + "name_it": [ + "Rua Ângelo Biggi", + "Ponte 4 Aprile", + "Autodromo Luanda", + "Viale Murtala Mohamed", + "Viale 4 de Fevereiro", + "Piazza dei Pescadores", + "Ferrovia Addis Abeba-Gibuti", + "Ferrovia Awash-Ualdia", + "9 Strada nazionale", + "Strada Rosso - Boghé", + "Cheikh Zayed", + "Giro Fiori", + "Via Guglielmo Marconi", + "Via Angelo Mosso", + "Via Alessandro Volta", + "Piazza Algeria", + "Via Torino", + "Piazza della Libertà", + "Via Carrara", + "Piazza dei Martiri", + "Ponte Wadi al Kuf", + "Strada Sant'Orsola", + "Strada San Paolo", + "Via Cottonera", + "Strada Mercanti", + "Strada Vescovo", + "Strada dei Forni", + "Strada Teatro", + "Strada Zecca", + "Strada Sant'Anna", + "Strada San Cristoforo", + "Strada San Giovanni", + "Piazza della Repubblica", + "Strada Aquila", + "Strada Zaccaria", + "Strada Stretta", + "Strada Mezzodì", + "Strada Sant Orsola", + "Piazza della Mangiatoia", + "Ponte di Mughrabi", + "Nahalat Shiva", + "Genova - Tunis", + "Tunis - Trapani", + "Palermo - Tunis", + "Civitavecchia - Tunisi", + "Salerno - Tunisi", + "Via Re Faisal", + "Gramvousa Balos", + "Via Europa", + "Pista Altomontana Sentiero 701" + ], + "name_ar": [ + "شارع رقم ٣٢", + "الطريق شاندزاهاري", + "الطريق مدراواجو", + "الطريق نيامبو", + "الطريق شاويني", + "الطريق إلى بانداهاري", + "شارع مزيمبا", + "الطريق الوطنية ٢", + "الطريق الجبلية قرطالة", + "إلـى امكازي", + "الطريق الوطني رقم 3", + "شارع الجامعة العربية", + "شارع القرطالة", + "طريق وطني ٢", + "شارع قصر السفراء", + "شارع الكرنيش", + "شارع أحمد جومو", + "طريق أليانس فرانسيز", + "شارع لجنة المحيط الهندي", + "شارع الاتحاد الأفريقي", + "دوار سليممود", + "الطريق الوطني ١", + "شارع بندي بيكوا", + "Rua Doutor Mariano Jose", + "طريق دار السلام القديم", + "طريق ماداراكا", + "جسر السينما القديم", + "طريق المحطة", + "طريق المتحف", + "شارع الكاتدرائية", + "شارع حمامني", + "طريق ﻣﺎﺗﺎﺩﻱ-أنغو أنغو", + "مطار كيسمايو", + "Qoryooley قوريولي - Jameecada Aabow Road", + "مطار نيمول", + "مطار جربهاري", + "مطار سان بيدرو", + "طريق موسكو", + "طريق توريت - جيلو", + "طريق جوبا - كبويتا", + "الطريق السريع حودور-وااجيد", + "طريق توريت - لافون", + "طريق جبل", + "شارع الوحدة", + "شارع أديس أبابا", + "طريق لمقبرة", + "طريق الجمارك", + "طريق ياي", + "طريق الوزارات", + "شارع 28" + ], + "name_ja": [ + "4・デ・フェヴェレイロ通り", + "カルメリット", + "ダン", + "Kimonos", + "バルベリーニ広場", + "ミヨー橋", + "ミケランジェロ広場", + "イスティックラル通り", + "イモラ・サーキット", + "キングスロード", + "メダンパサール", + "ツリーブリッジ", + "ファングーラオ通り", + "ラムソン広場", + "ラーマナータプラム", + "ソイ・カウボーイ", + "カオサン通り", + "パホンヨーティン通り", + "チョムプーパンティップ 1", + "ウートーン通り", + "プリーディー・タムロン橋", + "バーンイアン通り", + "ナレースワン通り", + "ホーラッタナチャイ通り", + "チェーディーのロータリー", + "パーマプラオ通り", + "来遠橋", + "ハイバーチュン通り", + "タークシン通り", + "タールア通り", + "中国家小道", + "アーラク通り", + "ラチャダムナーン通り", + "ラチャヴィティ通り", + "ラチャパーキナイ通り", + "ターペア都門", + "ラチャマンカー通り", + "ムーンムアン5号", + "マニーノパラト通り", + "シープーム通り", + "ステープ通り", + "チャンプアク通り", + "ヴィアンガウ通り", + "ジャーバーン通り", + "サナムキーラー通り", + "プラポッグラウ通り", + "シリマンカラジャン通り", + "チャンプアク2号小道", + "インタワローロト通り", + "シンハラート通り" + ], + "name_zh": [ + "2月4日的大道", + "辅助道路", + "拉伊铁路", + "亚吉铁路", + "泽拉路", + "贾迈勒·阿卜杜·纳赛尔大街", + "二十四大街", + "二十五大街", + "二十一大道", + "十九大道", + "二十六大街", + "哈拉曼高速鐵路", + "独立大道", + "苏伊士运河路", + "滨海路", + "隆達新橋", + "馬槽廣場", + "百花巷", + "无花果树广场", + "太陽門景觀臺", + "自由大道", + "帕帕尼古劳街", + "昆图里奥蒂斯广场", + "卡洛斯五世广场", + "主廣場", + "阿卡乍門 城牆出入口", + "阿佐奎荷廣場", + "薩拉曼卡市長廣場", + "西班牙广场 (巴塞罗那)", + "國王廣場", + "里贝拉广场", + "協和大道", + "威尼托街", + "坎皮多怡歐廣場", + "密涅瓦广场", + "科尔索大街", + "法布里亚诺", + "路大坝", + "拉斐爾·萊姆金", + "반고흐카페", + "半圓拱橋", + "水井广场", + "米約高架橋", + "米开朗琪罗广场", + "大教堂廣場", + "加拉塔大桥", + "佩提滕根街", + "惹馬格朗", + "惹文多禾梭", + "惹格雷西克" + ], + "name_ko": [ + "로라 - 하밀 로드", + "누에보 다리", + "카스바 광장", + "헌법대로", + "4월 9일 광장", + "콰트로 칸티", + "가라펠로 광장", + "시청 광장", + "까몽이스 광장", + "쉬아두(라르고 도 쉬아두)", + "라르고 드 상 카를로스", + "소피아 드 멜로 브라이너 안드레센 전망대", + "추에카 광장", + "하신토 베나벤테 광장", + "마요르 광장", + "아소게호 광장", + "산 하우메 광장", + "왕의 광장", + "페레키두", + "플레비시토 광장", + "카리타 광장", + "단테 광장", + "말라토스 다리", + "콜로세움", + "캄피돌리오 광장", + "리스 광장", + "론세스바예스", + "시미에 원형경기장", + "스트라둔 거리", + "미요 교", + "XX 세템브레 광장", + "주세페 가리발디 광장", + "델레 베토발리에 광장", + "카발리에리 광장", + "두오모 광장", + "우피치 광장", + "미켈란젤로 광장", + "피티 광장", + "산타 마리아 노벨라 광장", + "시뇨리아 광장", + "레푸블리카 광장", + "산 피렌체 광장", + "산 로렌초 광장", + "산타시마 안눈치아타 광장", + "술탄아흐메트 광장", + "이스티클랄 거리", + "피낭 대교", + "껀터대교", + "밤꽁대교", + "락미에우2교" + ], + "name_vi": [ + "Cầu cạn Millau", + "Quảng trường Fatahillah", + "Cầu Penang", + "Topmilk.vn", + "Đường Hùng Vương", + "Đường Trần Văn Sơn", + "Vĩnh Hưng—Vĩnh Thử", + "đường tránh quốc lộ", + "Đường", + "Đường Lò Gạch", + "Đường Tân Bình", + "Đường Tân Lợi", + "Ngã Năm Tân Thành", + "Tỉnh lộ 29", + "Cầu Kinh Xáng", + "Cầu Cả Ngây", + "Đường Ngô Gia Tự", + "Đường 54", + "Cầu Bờ Đập", + "Cầu Cái Đôi", + "Quốc lộ 60", + "Cầu Ba Lai", + "Đường Hoa Phượng", + "Quốc Lộ 50", + "Nguyễn Thị Thập", + "Đường Hạ Long", + "Nguyễn Trung Trực", + "Nguyễn Văn Giác", + "Cầu Nguyễn Trãi", + "Cầu Vỹ", + "Tỉnh Lộ 50", + "Đinh Bộ Lĩnh", + "Đường Võ Thị Sáu", + "Đường Nguyễn Hiền", + "Đường Tô Hiệu", + "Đường Phan Chu Trinh", + "Đường Hải Đăng", + "Đường Lê Thanh Nghị", + "Ấp Bắc", + "Trưng Trắc", + "Rạch Gầm", + "Nam Kỳ Khởi Nghĩa", + "Ngô Quyền", + "Lê Văn Duyệt", + "Trương Định", + "Lý Thường Kiệt", + "Thủ Khoa Huân", + "Trần Quốc Tuấn", + "Nguyễn Huệ", + "Ba Mươi Tháng Tư" + ] + } + }, + "buildings": { + "minzoom": 12, + "maxzoom": 14, + "fields": { + "height": [ + 4, + 4.8, + 4.5, + 6, + 15, + 3.2, + 3, + 0, + 20.5, + 10, + 18, + 7, + 5, + 1, + 20, + 2.5, + 12, + 24, + 28, + 97.54, + 1.8, + 8, + 2.7, + 13.5, + 2.8, + 0.1, + 45.7, + 0.5, + 119, + 48, + 42, + 35, + 21, + 52, + 11, + 104, + 40, + 68.25, + 0.8, + 7.5, + 14, + 49, + 45.5, + 3.5, + 2, + 138, + 30, + 26, + 45, + 25 + ], + "minHeight": [ + 0, + 6, + 3.5, + 5, + 4, + 30, + 10, + 1, + 2, + 5.94, + 102, + 0.2, + 20, + 23, + 7, + 9, + 8, + 15, + 3, + 35, + 0.5, + 21, + 17.5, + 20.5, + 19, + 22.5, + 17, + 16.5, + 16, + 18.5, + 22, + 21.5, + 23.5, + 18, + 19.5, + 14.5, + 15.5, + 12, + 1.5, + 7.5, + 2.5, + 0.1, + 8.5, + 5.5, + 6.5, + 4.5, + 10.5, + 9.5, + 11, + 11.5 + ], + "class": [ + "hut", + "industrial", + "house", + "police", + "retail", + "rest", + "religious", + "government", + "fire_station", + "warehouse", + "hospital", + "public", + "school", + "cafe", + "garage", + "greenhouse", + "residential", + "commercial", + "office", + "shed", + "roof", + "stadium", + "fuel", + "toilets", + "restaurant", + "hotel", + "church", + "detached", + "apartments", + "food_drink", + "aeroway", + "medical", + "bank", + "service", + "construction", + "station", + "barn", + "terrace", + "ranger_station", + "hanger", + "underground" + ] + } + }, + "addr": { + "minzoom": 14, + "maxzoom": 14, + "fields": { + "housenumber": [ + "3", + "6", + "1", + "11", + "2", + "1-3", + "2-4", + "9-9a", + "13", + "5", + "7", + "21", + "8", + "4", + "15", + "3-5", + "20", + "7a", + "6a", + "22", + "19", + "17", + "10", + "12", + "56", + "32", + "102", + "65", + "67", + "69", + "61", + "63", + "57", + "55", + "53", + "59", + "94", + "98", + "96", + "100", + "104", + "106", + "108", + "114", + "118", + "116", + "120", + "122", + "16", + "37" + ] + } + }, + "parcel": { + "minzoom": 14, + "maxzoom": 14, + "fields": {} + } + }, + "attributions": { + "OpenStreetData": "https://www.openstreetmap.org/copyright" + }, + "description": "Built by S2 MAPS INC.", + "tilestats": { + "0": 82776508, + "1": 84535402, + "2": 93751350, + "3": 98312816, + "4": 98064782, + "5": 78098435, + "total": 535539293 + }, + "name": "Streets v3" +} \ No newline at end of file diff --git a/tests/readers/tile/fixtures/s2/terrain/0/0/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/0/0/0/0.pbf new file mode 100644 index 00000000..4667b6b0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/0/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/1/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/0/1/0/0.pbf new file mode 100644 index 00000000..38999498 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/1/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/1/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/0/1/0/1.pbf new file mode 100644 index 00000000..3538b4ba Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/1/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/1/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/0/1/1/0.pbf new file mode 100644 index 00000000..5fc9d98e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/1/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/1/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/0/1/1/1.pbf new file mode 100644 index 00000000..17385aab Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/1/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/2/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/0/2/0/0.pbf new file mode 100644 index 00000000..c15593c0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/2/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/2/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/0/2/0/1.pbf new file mode 100644 index 00000000..4c9dc2bb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/2/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/2/0/2.pbf b/tests/readers/tile/fixtures/s2/terrain/0/2/0/2.pbf new file mode 100644 index 00000000..d2d65ce2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/2/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/2/0/3.pbf b/tests/readers/tile/fixtures/s2/terrain/0/2/0/3.pbf new file mode 100644 index 00000000..6fe3b879 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/2/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/2/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/0/2/1/0.pbf new file mode 100644 index 00000000..267f482a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/2/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/2/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/0/2/1/1.pbf new file mode 100644 index 00000000..b648e634 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/2/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/2/1/2.pbf b/tests/readers/tile/fixtures/s2/terrain/0/2/1/2.pbf new file mode 100644 index 00000000..f2a0aec5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/2/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/2/1/3.pbf b/tests/readers/tile/fixtures/s2/terrain/0/2/1/3.pbf new file mode 100644 index 00000000..0061b70f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/2/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/2/2/0.pbf b/tests/readers/tile/fixtures/s2/terrain/0/2/2/0.pbf new file mode 100644 index 00000000..e06ea100 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/2/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/2/2/1.pbf b/tests/readers/tile/fixtures/s2/terrain/0/2/2/1.pbf new file mode 100644 index 00000000..16f6826d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/2/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/2/2/2.pbf b/tests/readers/tile/fixtures/s2/terrain/0/2/2/2.pbf new file mode 100644 index 00000000..6956bf0b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/2/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/2/2/3.pbf b/tests/readers/tile/fixtures/s2/terrain/0/2/2/3.pbf new file mode 100644 index 00000000..5a738d42 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/2/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/2/3/0.pbf b/tests/readers/tile/fixtures/s2/terrain/0/2/3/0.pbf new file mode 100644 index 00000000..087c7a5b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/2/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/2/3/1.pbf b/tests/readers/tile/fixtures/s2/terrain/0/2/3/1.pbf new file mode 100644 index 00000000..608ec732 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/2/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/2/3/2.pbf b/tests/readers/tile/fixtures/s2/terrain/0/2/3/2.pbf new file mode 100644 index 00000000..eac9b974 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/2/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/2/3/3.pbf b/tests/readers/tile/fixtures/s2/terrain/0/2/3/3.pbf new file mode 100644 index 00000000..9a1c1c20 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/2/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/0/0.pbf new file mode 100644 index 00000000..579c2e65 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/0/1.pbf new file mode 100644 index 00000000..a27ae147 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/0/2.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/0/2.pbf new file mode 100644 index 00000000..bfd51c3b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/0/3.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/0/3.pbf new file mode 100644 index 00000000..2fa3376d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/0/4.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/0/4.pbf new file mode 100644 index 00000000..3cb0b560 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/0/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/0/5.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/0/5.pbf new file mode 100644 index 00000000..766ee7ee Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/0/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/0/6.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/0/6.pbf new file mode 100644 index 00000000..6a02f7ca Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/0/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/0/7.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/0/7.pbf new file mode 100644 index 00000000..389eda25 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/0/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/1/0.pbf new file mode 100644 index 00000000..e673a759 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/1/1.pbf new file mode 100644 index 00000000..c517805f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/1/2.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/1/2.pbf new file mode 100644 index 00000000..ca379755 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/1/3.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/1/3.pbf new file mode 100644 index 00000000..d2e7402d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/1/4.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/1/4.pbf new file mode 100644 index 00000000..f0d41954 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/1/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/1/5.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/1/5.pbf new file mode 100644 index 00000000..2f2e1206 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/1/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/1/6.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/1/6.pbf new file mode 100644 index 00000000..bfed36b5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/1/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/1/7.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/1/7.pbf new file mode 100644 index 00000000..abbd1f62 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/1/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/2/0.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/2/0.pbf new file mode 100644 index 00000000..884041aa Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/2/1.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/2/1.pbf new file mode 100644 index 00000000..dfd9cedb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/2/2.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/2/2.pbf new file mode 100644 index 00000000..23542fcb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/2/3.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/2/3.pbf new file mode 100644 index 00000000..0b42cd6e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/2/4.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/2/4.pbf new file mode 100644 index 00000000..fae21012 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/2/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/2/5.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/2/5.pbf new file mode 100644 index 00000000..68d9f77a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/2/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/2/6.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/2/6.pbf new file mode 100644 index 00000000..0cc59684 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/2/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/2/7.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/2/7.pbf new file mode 100644 index 00000000..d0196a03 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/2/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/3/0.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/3/0.pbf new file mode 100644 index 00000000..b051adec Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/3/1.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/3/1.pbf new file mode 100644 index 00000000..2c410675 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/3/2.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/3/2.pbf new file mode 100644 index 00000000..8d60d1e4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/3/3.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/3/3.pbf new file mode 100644 index 00000000..f1980654 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/3/4.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/3/4.pbf new file mode 100644 index 00000000..60a79eda Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/3/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/3/5.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/3/5.pbf new file mode 100644 index 00000000..d0ee7c71 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/3/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/3/6.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/3/6.pbf new file mode 100644 index 00000000..46f22586 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/3/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/3/7.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/3/7.pbf new file mode 100644 index 00000000..33972b12 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/3/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/4/0.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/4/0.pbf new file mode 100644 index 00000000..36193b94 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/4/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/4/1.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/4/1.pbf new file mode 100644 index 00000000..e951f6f5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/4/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/4/2.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/4/2.pbf new file mode 100644 index 00000000..7c7910f5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/4/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/4/3.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/4/3.pbf new file mode 100644 index 00000000..9d514a1e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/4/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/4/4.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/4/4.pbf new file mode 100644 index 00000000..67bd62b5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/4/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/4/5.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/4/5.pbf new file mode 100644 index 00000000..af3e4534 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/4/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/4/6.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/4/6.pbf new file mode 100644 index 00000000..1d4deb41 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/4/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/4/7.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/4/7.pbf new file mode 100644 index 00000000..ea126b49 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/4/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/5/0.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/5/0.pbf new file mode 100644 index 00000000..582671e4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/5/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/5/1.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/5/1.pbf new file mode 100644 index 00000000..0b61e24e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/5/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/5/2.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/5/2.pbf new file mode 100644 index 00000000..dfd9b223 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/5/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/5/3.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/5/3.pbf new file mode 100644 index 00000000..fa154343 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/5/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/5/4.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/5/4.pbf new file mode 100644 index 00000000..37b5788f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/5/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/5/5.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/5/5.pbf new file mode 100644 index 00000000..1fe4b64e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/5/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/5/6.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/5/6.pbf new file mode 100644 index 00000000..8410c682 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/5/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/5/7.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/5/7.pbf new file mode 100644 index 00000000..365bff09 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/5/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/6/0.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/6/0.pbf new file mode 100644 index 00000000..17ba0380 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/6/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/6/1.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/6/1.pbf new file mode 100644 index 00000000..b20f9449 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/6/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/6/2.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/6/2.pbf new file mode 100644 index 00000000..a762d5b0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/6/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/6/3.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/6/3.pbf new file mode 100644 index 00000000..c6c80e63 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/6/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/6/4.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/6/4.pbf new file mode 100644 index 00000000..99aa7121 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/6/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/6/5.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/6/5.pbf new file mode 100644 index 00000000..c3763784 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/6/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/6/6.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/6/6.pbf new file mode 100644 index 00000000..a764e690 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/6/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/6/7.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/6/7.pbf new file mode 100644 index 00000000..c11fb888 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/6/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/7/0.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/7/0.pbf new file mode 100644 index 00000000..db03dc54 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/7/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/7/1.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/7/1.pbf new file mode 100644 index 00000000..f1c9179e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/7/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/7/2.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/7/2.pbf new file mode 100644 index 00000000..263e18c3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/7/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/7/3.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/7/3.pbf new file mode 100644 index 00000000..8d3ba9da Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/7/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/7/4.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/7/4.pbf new file mode 100644 index 00000000..1018767c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/7/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/7/5.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/7/5.pbf new file mode 100644 index 00000000..a4fcb2f3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/7/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/7/6.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/7/6.pbf new file mode 100644 index 00000000..ca84f01c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/7/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/0/3/7/7.pbf b/tests/readers/tile/fixtures/s2/terrain/0/3/7/7.pbf new file mode 100644 index 00000000..88d9ee1c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/0/3/7/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/0/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/1/0/0/0.pbf new file mode 100644 index 00000000..597f4e7a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/0/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/1/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/1/1/0/0.pbf new file mode 100644 index 00000000..607cbc71 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/1/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/1/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/1/1/0/1.pbf new file mode 100644 index 00000000..976b4a9f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/1/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/1/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/1/1/1/0.pbf new file mode 100644 index 00000000..ab1ca7b2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/1/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/1/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/1/1/1/1.pbf new file mode 100644 index 00000000..a7ae1d3e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/1/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/2/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/1/2/0/0.pbf new file mode 100644 index 00000000..6b3e88df Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/2/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/2/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/1/2/0/1.pbf new file mode 100644 index 00000000..6ce4b606 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/2/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/2/0/2.pbf b/tests/readers/tile/fixtures/s2/terrain/1/2/0/2.pbf new file mode 100644 index 00000000..b510cde8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/2/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/2/0/3.pbf b/tests/readers/tile/fixtures/s2/terrain/1/2/0/3.pbf new file mode 100644 index 00000000..b24986d3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/2/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/2/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/1/2/1/0.pbf new file mode 100644 index 00000000..1da0b88e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/2/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/2/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/1/2/1/1.pbf new file mode 100644 index 00000000..3b32bf1d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/2/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/2/1/2.pbf b/tests/readers/tile/fixtures/s2/terrain/1/2/1/2.pbf new file mode 100644 index 00000000..500a5f7d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/2/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/2/1/3.pbf b/tests/readers/tile/fixtures/s2/terrain/1/2/1/3.pbf new file mode 100644 index 00000000..1914b3ed Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/2/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/2/2/0.pbf b/tests/readers/tile/fixtures/s2/terrain/1/2/2/0.pbf new file mode 100644 index 00000000..829cdfc6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/2/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/2/2/1.pbf b/tests/readers/tile/fixtures/s2/terrain/1/2/2/1.pbf new file mode 100644 index 00000000..3d809498 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/2/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/2/2/2.pbf b/tests/readers/tile/fixtures/s2/terrain/1/2/2/2.pbf new file mode 100644 index 00000000..d61ede2e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/2/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/2/2/3.pbf b/tests/readers/tile/fixtures/s2/terrain/1/2/2/3.pbf new file mode 100644 index 00000000..31403c11 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/2/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/2/3/0.pbf b/tests/readers/tile/fixtures/s2/terrain/1/2/3/0.pbf new file mode 100644 index 00000000..edddc342 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/2/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/2/3/1.pbf b/tests/readers/tile/fixtures/s2/terrain/1/2/3/1.pbf new file mode 100644 index 00000000..1db8e678 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/2/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/2/3/2.pbf b/tests/readers/tile/fixtures/s2/terrain/1/2/3/2.pbf new file mode 100644 index 00000000..22716d35 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/2/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/2/3/3.pbf b/tests/readers/tile/fixtures/s2/terrain/1/2/3/3.pbf new file mode 100644 index 00000000..bfc18945 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/2/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/0/0.pbf new file mode 100644 index 00000000..3ccae1b1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/0/1.pbf new file mode 100644 index 00000000..153b77e2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/0/2.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/0/2.pbf new file mode 100644 index 00000000..fc89c5f0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/0/3.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/0/3.pbf new file mode 100644 index 00000000..f2166507 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/0/4.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/0/4.pbf new file mode 100644 index 00000000..58fd385a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/0/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/0/5.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/0/5.pbf new file mode 100644 index 00000000..aba721dd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/0/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/0/6.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/0/6.pbf new file mode 100644 index 00000000..39001a21 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/0/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/0/7.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/0/7.pbf new file mode 100644 index 00000000..02bd8e81 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/0/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/1/0.pbf new file mode 100644 index 00000000..9318df1f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/1/1.pbf new file mode 100644 index 00000000..4b5414c1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/1/2.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/1/2.pbf new file mode 100644 index 00000000..84b1bec1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/1/3.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/1/3.pbf new file mode 100644 index 00000000..f5cc0372 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/1/4.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/1/4.pbf new file mode 100644 index 00000000..35efc43b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/1/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/1/5.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/1/5.pbf new file mode 100644 index 00000000..a6a1c166 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/1/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/1/6.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/1/6.pbf new file mode 100644 index 00000000..2adbf949 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/1/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/1/7.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/1/7.pbf new file mode 100644 index 00000000..d2cd4fb3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/1/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/2/0.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/2/0.pbf new file mode 100644 index 00000000..52a2215c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/2/1.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/2/1.pbf new file mode 100644 index 00000000..68ea2ee2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/2/2.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/2/2.pbf new file mode 100644 index 00000000..acf934bf Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/2/3.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/2/3.pbf new file mode 100644 index 00000000..7b182b72 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/2/4.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/2/4.pbf new file mode 100644 index 00000000..17235b84 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/2/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/2/5.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/2/5.pbf new file mode 100644 index 00000000..24726bde Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/2/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/2/6.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/2/6.pbf new file mode 100644 index 00000000..ef159bd7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/2/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/2/7.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/2/7.pbf new file mode 100644 index 00000000..35bb82ba Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/2/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/3/0.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/3/0.pbf new file mode 100644 index 00000000..797043f7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/3/1.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/3/1.pbf new file mode 100644 index 00000000..e33d7a1b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/3/2.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/3/2.pbf new file mode 100644 index 00000000..199b515f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/3/3.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/3/3.pbf new file mode 100644 index 00000000..37d9bd79 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/3/4.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/3/4.pbf new file mode 100644 index 00000000..2399714c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/3/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/3/5.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/3/5.pbf new file mode 100644 index 00000000..53974a58 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/3/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/3/6.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/3/6.pbf new file mode 100644 index 00000000..e284f202 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/3/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/3/7.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/3/7.pbf new file mode 100644 index 00000000..44797ca1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/3/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/4/0.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/4/0.pbf new file mode 100644 index 00000000..9563abc0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/4/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/4/1.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/4/1.pbf new file mode 100644 index 00000000..aa73b037 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/4/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/4/2.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/4/2.pbf new file mode 100644 index 00000000..c8a5a077 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/4/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/4/3.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/4/3.pbf new file mode 100644 index 00000000..9ef2a00d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/4/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/4/4.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/4/4.pbf new file mode 100644 index 00000000..e415b25e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/4/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/4/5.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/4/5.pbf new file mode 100644 index 00000000..13aa0623 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/4/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/4/6.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/4/6.pbf new file mode 100644 index 00000000..af23c034 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/4/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/4/7.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/4/7.pbf new file mode 100644 index 00000000..6dcfff87 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/4/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/5/0.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/5/0.pbf new file mode 100644 index 00000000..9ef254ca Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/5/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/5/1.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/5/1.pbf new file mode 100644 index 00000000..8158bad8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/5/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/5/2.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/5/2.pbf new file mode 100644 index 00000000..0474b696 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/5/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/5/3.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/5/3.pbf new file mode 100644 index 00000000..97d24c4d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/5/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/5/4.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/5/4.pbf new file mode 100644 index 00000000..c27ad9dd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/5/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/5/5.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/5/5.pbf new file mode 100644 index 00000000..c64d0dc6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/5/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/5/6.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/5/6.pbf new file mode 100644 index 00000000..0993a596 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/5/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/5/7.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/5/7.pbf new file mode 100644 index 00000000..b04d74de Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/5/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/6/0.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/6/0.pbf new file mode 100644 index 00000000..9519955f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/6/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/6/1.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/6/1.pbf new file mode 100644 index 00000000..a37e02ec Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/6/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/6/2.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/6/2.pbf new file mode 100644 index 00000000..17b4b666 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/6/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/6/3.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/6/3.pbf new file mode 100644 index 00000000..37651ac5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/6/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/6/4.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/6/4.pbf new file mode 100644 index 00000000..5f20ab9b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/6/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/6/5.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/6/5.pbf new file mode 100644 index 00000000..d3e63cb5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/6/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/6/6.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/6/6.pbf new file mode 100644 index 00000000..b9c9a406 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/6/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/6/7.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/6/7.pbf new file mode 100644 index 00000000..b5b2a8d4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/6/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/7/0.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/7/0.pbf new file mode 100644 index 00000000..2a45d885 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/7/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/7/1.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/7/1.pbf new file mode 100644 index 00000000..9764a4bc Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/7/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/7/2.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/7/2.pbf new file mode 100644 index 00000000..9febeb12 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/7/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/7/3.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/7/3.pbf new file mode 100644 index 00000000..64a6377e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/7/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/7/4.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/7/4.pbf new file mode 100644 index 00000000..bf87618b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/7/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/7/5.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/7/5.pbf new file mode 100644 index 00000000..41ed1d5e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/7/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/7/6.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/7/6.pbf new file mode 100644 index 00000000..3af69864 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/7/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/1/3/7/7.pbf b/tests/readers/tile/fixtures/s2/terrain/1/3/7/7.pbf new file mode 100644 index 00000000..d0e6f1d0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/1/3/7/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/0/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/2/0/0/0.pbf new file mode 100644 index 00000000..cb3a0fc0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/0/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/1/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/2/1/0/0.pbf new file mode 100644 index 00000000..ba6a9d67 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/1/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/1/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/2/1/0/1.pbf new file mode 100644 index 00000000..d63566d9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/1/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/1/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/2/1/1/0.pbf new file mode 100644 index 00000000..ee53244f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/1/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/1/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/2/1/1/1.pbf new file mode 100644 index 00000000..4fe1e6dc Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/1/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/2/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/2/2/0/0.pbf new file mode 100644 index 00000000..b6957762 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/2/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/2/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/2/2/0/1.pbf new file mode 100644 index 00000000..5b22a4d8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/2/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/2/0/2.pbf b/tests/readers/tile/fixtures/s2/terrain/2/2/0/2.pbf new file mode 100644 index 00000000..694f8d46 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/2/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/2/0/3.pbf b/tests/readers/tile/fixtures/s2/terrain/2/2/0/3.pbf new file mode 100644 index 00000000..018f2fc4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/2/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/2/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/2/2/1/0.pbf new file mode 100644 index 00000000..47e65bfa Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/2/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/2/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/2/2/1/1.pbf new file mode 100644 index 00000000..4db8115b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/2/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/2/1/2.pbf b/tests/readers/tile/fixtures/s2/terrain/2/2/1/2.pbf new file mode 100644 index 00000000..177aced1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/2/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/2/1/3.pbf b/tests/readers/tile/fixtures/s2/terrain/2/2/1/3.pbf new file mode 100644 index 00000000..cc4708bf Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/2/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/2/2/0.pbf b/tests/readers/tile/fixtures/s2/terrain/2/2/2/0.pbf new file mode 100644 index 00000000..ea7c18e5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/2/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/2/2/1.pbf b/tests/readers/tile/fixtures/s2/terrain/2/2/2/1.pbf new file mode 100644 index 00000000..ddf14639 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/2/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/2/2/2.pbf b/tests/readers/tile/fixtures/s2/terrain/2/2/2/2.pbf new file mode 100644 index 00000000..19061c7c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/2/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/2/2/3.pbf b/tests/readers/tile/fixtures/s2/terrain/2/2/2/3.pbf new file mode 100644 index 00000000..46968a4e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/2/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/2/3/0.pbf b/tests/readers/tile/fixtures/s2/terrain/2/2/3/0.pbf new file mode 100644 index 00000000..a52b32dd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/2/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/2/3/1.pbf b/tests/readers/tile/fixtures/s2/terrain/2/2/3/1.pbf new file mode 100644 index 00000000..5a5edaef Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/2/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/2/3/2.pbf b/tests/readers/tile/fixtures/s2/terrain/2/2/3/2.pbf new file mode 100644 index 00000000..25b02c8e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/2/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/2/3/3.pbf b/tests/readers/tile/fixtures/s2/terrain/2/2/3/3.pbf new file mode 100644 index 00000000..c6d5c67c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/2/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/0/0.pbf new file mode 100644 index 00000000..101969a0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/0/1.pbf new file mode 100644 index 00000000..cd47745a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/0/2.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/0/2.pbf new file mode 100644 index 00000000..be5d9ac2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/0/3.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/0/3.pbf new file mode 100644 index 00000000..765052f6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/0/4.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/0/4.pbf new file mode 100644 index 00000000..8435e5a7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/0/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/0/5.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/0/5.pbf new file mode 100644 index 00000000..eb3e10e7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/0/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/0/6.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/0/6.pbf new file mode 100644 index 00000000..11c7563e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/0/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/0/7.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/0/7.pbf new file mode 100644 index 00000000..adce4159 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/0/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/1/0.pbf new file mode 100644 index 00000000..254d6c2d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/1/1.pbf new file mode 100644 index 00000000..6dc6e5c0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/1/2.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/1/2.pbf new file mode 100644 index 00000000..de72a5c6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/1/3.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/1/3.pbf new file mode 100644 index 00000000..84c565cd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/1/4.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/1/4.pbf new file mode 100644 index 00000000..1e1a582c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/1/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/1/5.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/1/5.pbf new file mode 100644 index 00000000..1fc2e8c9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/1/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/1/6.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/1/6.pbf new file mode 100644 index 00000000..c83476ac Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/1/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/1/7.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/1/7.pbf new file mode 100644 index 00000000..7b95d923 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/1/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/2/0.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/2/0.pbf new file mode 100644 index 00000000..d252600d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/2/1.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/2/1.pbf new file mode 100644 index 00000000..4794a9c6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/2/2.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/2/2.pbf new file mode 100644 index 00000000..ddf503cf Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/2/3.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/2/3.pbf new file mode 100644 index 00000000..9ceac714 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/2/4.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/2/4.pbf new file mode 100644 index 00000000..ff834cc9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/2/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/2/5.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/2/5.pbf new file mode 100644 index 00000000..4f3a5a58 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/2/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/2/6.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/2/6.pbf new file mode 100644 index 00000000..176bb5a5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/2/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/2/7.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/2/7.pbf new file mode 100644 index 00000000..d395aa23 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/2/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/3/0.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/3/0.pbf new file mode 100644 index 00000000..c849912a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/3/1.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/3/1.pbf new file mode 100644 index 00000000..905f5656 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/3/2.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/3/2.pbf new file mode 100644 index 00000000..a760eacd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/3/3.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/3/3.pbf new file mode 100644 index 00000000..38dac0c9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/3/4.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/3/4.pbf new file mode 100644 index 00000000..de6c833a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/3/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/3/5.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/3/5.pbf new file mode 100644 index 00000000..1293932e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/3/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/3/6.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/3/6.pbf new file mode 100644 index 00000000..afb711a3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/3/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/3/7.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/3/7.pbf new file mode 100644 index 00000000..596a1046 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/3/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/4/0.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/4/0.pbf new file mode 100644 index 00000000..abe8b641 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/4/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/4/1.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/4/1.pbf new file mode 100644 index 00000000..cedb1eec Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/4/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/4/2.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/4/2.pbf new file mode 100644 index 00000000..221408db Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/4/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/4/3.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/4/3.pbf new file mode 100644 index 00000000..0d6bcd11 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/4/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/4/4.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/4/4.pbf new file mode 100644 index 00000000..275f6f2c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/4/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/4/5.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/4/5.pbf new file mode 100644 index 00000000..d3112870 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/4/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/4/6.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/4/6.pbf new file mode 100644 index 00000000..9967931c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/4/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/4/7.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/4/7.pbf new file mode 100644 index 00000000..0cce7233 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/4/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/5/0.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/5/0.pbf new file mode 100644 index 00000000..2d5db169 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/5/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/5/1.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/5/1.pbf new file mode 100644 index 00000000..0cccf9ce Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/5/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/5/2.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/5/2.pbf new file mode 100644 index 00000000..081abe4f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/5/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/5/3.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/5/3.pbf new file mode 100644 index 00000000..efe1a13d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/5/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/5/4.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/5/4.pbf new file mode 100644 index 00000000..f13d3db8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/5/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/5/5.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/5/5.pbf new file mode 100644 index 00000000..d0c345a9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/5/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/5/6.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/5/6.pbf new file mode 100644 index 00000000..ff23d9ac Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/5/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/5/7.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/5/7.pbf new file mode 100644 index 00000000..a5bed684 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/5/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/6/0.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/6/0.pbf new file mode 100644 index 00000000..0614996f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/6/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/6/1.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/6/1.pbf new file mode 100644 index 00000000..ab928635 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/6/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/6/2.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/6/2.pbf new file mode 100644 index 00000000..9b0a9f80 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/6/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/6/3.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/6/3.pbf new file mode 100644 index 00000000..399c2b87 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/6/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/6/4.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/6/4.pbf new file mode 100644 index 00000000..cf55a8e1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/6/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/6/5.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/6/5.pbf new file mode 100644 index 00000000..654275ec Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/6/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/6/6.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/6/6.pbf new file mode 100644 index 00000000..33cde1f6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/6/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/6/7.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/6/7.pbf new file mode 100644 index 00000000..945847e2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/6/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/7/0.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/7/0.pbf new file mode 100644 index 00000000..05530f15 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/7/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/7/1.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/7/1.pbf new file mode 100644 index 00000000..74376b84 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/7/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/7/2.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/7/2.pbf new file mode 100644 index 00000000..6a599bf0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/7/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/7/3.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/7/3.pbf new file mode 100644 index 00000000..0ad7a673 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/7/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/7/4.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/7/4.pbf new file mode 100644 index 00000000..43c7d095 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/7/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/7/5.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/7/5.pbf new file mode 100644 index 00000000..323a7b15 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/7/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/7/6.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/7/6.pbf new file mode 100644 index 00000000..1b900bb6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/7/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/2/3/7/7.pbf b/tests/readers/tile/fixtures/s2/terrain/2/3/7/7.pbf new file mode 100644 index 00000000..4d26c4c9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/2/3/7/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/0/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/3/0/0/0.pbf new file mode 100644 index 00000000..3d017469 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/0/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/1/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/3/1/0/0.pbf new file mode 100644 index 00000000..d71463e9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/1/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/1/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/3/1/0/1.pbf new file mode 100644 index 00000000..f18049e4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/1/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/1/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/3/1/1/0.pbf new file mode 100644 index 00000000..4f8b8dd7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/1/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/1/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/3/1/1/1.pbf new file mode 100644 index 00000000..136fa2c7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/1/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/2/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/3/2/0/0.pbf new file mode 100644 index 00000000..982f603f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/2/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/2/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/3/2/0/1.pbf new file mode 100644 index 00000000..36a06940 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/2/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/2/0/2.pbf b/tests/readers/tile/fixtures/s2/terrain/3/2/0/2.pbf new file mode 100644 index 00000000..24e52e9f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/2/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/2/0/3.pbf b/tests/readers/tile/fixtures/s2/terrain/3/2/0/3.pbf new file mode 100644 index 00000000..149d7f4f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/2/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/2/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/3/2/1/0.pbf new file mode 100644 index 00000000..42508bda Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/2/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/2/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/3/2/1/1.pbf new file mode 100644 index 00000000..e3a1dacd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/2/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/2/1/2.pbf b/tests/readers/tile/fixtures/s2/terrain/3/2/1/2.pbf new file mode 100644 index 00000000..af33427c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/2/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/2/1/3.pbf b/tests/readers/tile/fixtures/s2/terrain/3/2/1/3.pbf new file mode 100644 index 00000000..52495d9b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/2/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/2/2/0.pbf b/tests/readers/tile/fixtures/s2/terrain/3/2/2/0.pbf new file mode 100644 index 00000000..dcd4c63a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/2/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/2/2/1.pbf b/tests/readers/tile/fixtures/s2/terrain/3/2/2/1.pbf new file mode 100644 index 00000000..22d54fa0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/2/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/2/2/2.pbf b/tests/readers/tile/fixtures/s2/terrain/3/2/2/2.pbf new file mode 100644 index 00000000..6dfcf76a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/2/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/2/2/3.pbf b/tests/readers/tile/fixtures/s2/terrain/3/2/2/3.pbf new file mode 100644 index 00000000..3eb83213 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/2/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/2/3/0.pbf b/tests/readers/tile/fixtures/s2/terrain/3/2/3/0.pbf new file mode 100644 index 00000000..eb2eacf3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/2/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/2/3/1.pbf b/tests/readers/tile/fixtures/s2/terrain/3/2/3/1.pbf new file mode 100644 index 00000000..c06e3f10 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/2/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/2/3/2.pbf b/tests/readers/tile/fixtures/s2/terrain/3/2/3/2.pbf new file mode 100644 index 00000000..7dc301b0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/2/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/2/3/3.pbf b/tests/readers/tile/fixtures/s2/terrain/3/2/3/3.pbf new file mode 100644 index 00000000..8897e4b0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/2/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/0/0.pbf new file mode 100644 index 00000000..4e60aae8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/0/1.pbf new file mode 100644 index 00000000..79b96712 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/0/2.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/0/2.pbf new file mode 100644 index 00000000..4f09fc7d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/0/3.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/0/3.pbf new file mode 100644 index 00000000..49fb147c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/0/4.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/0/4.pbf new file mode 100644 index 00000000..6c90e87e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/0/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/0/5.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/0/5.pbf new file mode 100644 index 00000000..a0a2c694 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/0/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/0/6.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/0/6.pbf new file mode 100644 index 00000000..b3032bb0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/0/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/0/7.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/0/7.pbf new file mode 100644 index 00000000..994e0681 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/0/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/1/0.pbf new file mode 100644 index 00000000..ebafe19a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/1/1.pbf new file mode 100644 index 00000000..a77b2e2b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/1/2.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/1/2.pbf new file mode 100644 index 00000000..86c5f281 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/1/3.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/1/3.pbf new file mode 100644 index 00000000..b156331f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/1/4.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/1/4.pbf new file mode 100644 index 00000000..1cdd76f4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/1/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/1/5.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/1/5.pbf new file mode 100644 index 00000000..a673615b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/1/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/1/6.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/1/6.pbf new file mode 100644 index 00000000..20941ecd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/1/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/1/7.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/1/7.pbf new file mode 100644 index 00000000..6a8f6683 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/1/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/2/0.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/2/0.pbf new file mode 100644 index 00000000..ed795e3f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/2/1.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/2/1.pbf new file mode 100644 index 00000000..4a5d1ffa Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/2/2.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/2/2.pbf new file mode 100644 index 00000000..f904ea18 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/2/3.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/2/3.pbf new file mode 100644 index 00000000..9a5fde66 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/2/4.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/2/4.pbf new file mode 100644 index 00000000..b639e71c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/2/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/2/5.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/2/5.pbf new file mode 100644 index 00000000..c8927385 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/2/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/2/6.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/2/6.pbf new file mode 100644 index 00000000..2dc6ce39 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/2/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/2/7.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/2/7.pbf new file mode 100644 index 00000000..cd2f8476 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/2/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/3/0.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/3/0.pbf new file mode 100644 index 00000000..eb2f866c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/3/1.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/3/1.pbf new file mode 100644 index 00000000..f4ea09f6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/3/2.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/3/2.pbf new file mode 100644 index 00000000..9060858a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/3/3.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/3/3.pbf new file mode 100644 index 00000000..c93e2b12 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/3/4.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/3/4.pbf new file mode 100644 index 00000000..3534a8e3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/3/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/3/5.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/3/5.pbf new file mode 100644 index 00000000..a9caac00 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/3/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/3/6.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/3/6.pbf new file mode 100644 index 00000000..a99bcb84 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/3/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/3/7.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/3/7.pbf new file mode 100644 index 00000000..f7c7f075 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/3/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/4/0.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/4/0.pbf new file mode 100644 index 00000000..90cc9ea3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/4/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/4/1.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/4/1.pbf new file mode 100644 index 00000000..438e6147 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/4/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/4/2.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/4/2.pbf new file mode 100644 index 00000000..b7fc2d05 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/4/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/4/3.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/4/3.pbf new file mode 100644 index 00000000..821efd7a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/4/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/4/4.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/4/4.pbf new file mode 100644 index 00000000..dc6c4624 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/4/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/4/5.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/4/5.pbf new file mode 100644 index 00000000..dc99d86d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/4/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/4/6.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/4/6.pbf new file mode 100644 index 00000000..23475a94 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/4/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/4/7.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/4/7.pbf new file mode 100644 index 00000000..75e102b4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/4/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/5/0.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/5/0.pbf new file mode 100644 index 00000000..90f909e8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/5/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/5/1.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/5/1.pbf new file mode 100644 index 00000000..9924eb8c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/5/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/5/2.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/5/2.pbf new file mode 100644 index 00000000..e45eb223 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/5/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/5/3.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/5/3.pbf new file mode 100644 index 00000000..f082bda0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/5/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/5/4.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/5/4.pbf new file mode 100644 index 00000000..ba6dab30 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/5/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/5/5.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/5/5.pbf new file mode 100644 index 00000000..7445b62f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/5/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/5/6.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/5/6.pbf new file mode 100644 index 00000000..0e001ee5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/5/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/5/7.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/5/7.pbf new file mode 100644 index 00000000..1da5b997 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/5/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/6/0.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/6/0.pbf new file mode 100644 index 00000000..937c85eb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/6/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/6/1.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/6/1.pbf new file mode 100644 index 00000000..b34f72de Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/6/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/6/2.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/6/2.pbf new file mode 100644 index 00000000..5bb8d5d1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/6/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/6/3.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/6/3.pbf new file mode 100644 index 00000000..fc08207c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/6/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/6/4.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/6/4.pbf new file mode 100644 index 00000000..86625984 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/6/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/6/5.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/6/5.pbf new file mode 100644 index 00000000..7364cb58 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/6/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/6/6.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/6/6.pbf new file mode 100644 index 00000000..bb83abee Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/6/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/6/7.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/6/7.pbf new file mode 100644 index 00000000..e53eeaa1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/6/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/7/0.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/7/0.pbf new file mode 100644 index 00000000..f498c508 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/7/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/7/1.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/7/1.pbf new file mode 100644 index 00000000..b49493a2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/7/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/7/2.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/7/2.pbf new file mode 100644 index 00000000..87c4a8b1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/7/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/7/3.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/7/3.pbf new file mode 100644 index 00000000..3623e034 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/7/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/7/4.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/7/4.pbf new file mode 100644 index 00000000..946f4d16 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/7/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/7/5.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/7/5.pbf new file mode 100644 index 00000000..e888643b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/7/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/7/6.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/7/6.pbf new file mode 100644 index 00000000..52c19c38 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/7/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/3/3/7/7.pbf b/tests/readers/tile/fixtures/s2/terrain/3/3/7/7.pbf new file mode 100644 index 00000000..c4f1a5f8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/3/3/7/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/0/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/4/0/0/0.pbf new file mode 100644 index 00000000..f8d97424 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/0/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/1/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/4/1/0/0.pbf new file mode 100644 index 00000000..23db46f2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/1/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/1/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/4/1/0/1.pbf new file mode 100644 index 00000000..762dd8f9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/1/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/1/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/4/1/1/0.pbf new file mode 100644 index 00000000..1460379c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/1/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/1/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/4/1/1/1.pbf new file mode 100644 index 00000000..701d35c6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/1/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/2/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/4/2/0/0.pbf new file mode 100644 index 00000000..138b0ebe Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/2/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/2/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/4/2/0/1.pbf new file mode 100644 index 00000000..59100c5d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/2/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/2/0/2.pbf b/tests/readers/tile/fixtures/s2/terrain/4/2/0/2.pbf new file mode 100644 index 00000000..32928f80 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/2/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/2/0/3.pbf b/tests/readers/tile/fixtures/s2/terrain/4/2/0/3.pbf new file mode 100644 index 00000000..63bbfe5a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/2/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/2/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/4/2/1/0.pbf new file mode 100644 index 00000000..cc3f61b2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/2/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/2/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/4/2/1/1.pbf new file mode 100644 index 00000000..2d3be4fb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/2/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/2/1/2.pbf b/tests/readers/tile/fixtures/s2/terrain/4/2/1/2.pbf new file mode 100644 index 00000000..d83b112c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/2/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/2/1/3.pbf b/tests/readers/tile/fixtures/s2/terrain/4/2/1/3.pbf new file mode 100644 index 00000000..4fc73731 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/2/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/2/2/0.pbf b/tests/readers/tile/fixtures/s2/terrain/4/2/2/0.pbf new file mode 100644 index 00000000..eb76702c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/2/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/2/2/1.pbf b/tests/readers/tile/fixtures/s2/terrain/4/2/2/1.pbf new file mode 100644 index 00000000..0bb32173 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/2/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/2/2/2.pbf b/tests/readers/tile/fixtures/s2/terrain/4/2/2/2.pbf new file mode 100644 index 00000000..8fe82ad0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/2/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/2/2/3.pbf b/tests/readers/tile/fixtures/s2/terrain/4/2/2/3.pbf new file mode 100644 index 00000000..8c7cd601 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/2/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/2/3/0.pbf b/tests/readers/tile/fixtures/s2/terrain/4/2/3/0.pbf new file mode 100644 index 00000000..7017fcf4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/2/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/2/3/1.pbf b/tests/readers/tile/fixtures/s2/terrain/4/2/3/1.pbf new file mode 100644 index 00000000..9fa53acd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/2/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/2/3/2.pbf b/tests/readers/tile/fixtures/s2/terrain/4/2/3/2.pbf new file mode 100644 index 00000000..b89212ce Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/2/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/2/3/3.pbf b/tests/readers/tile/fixtures/s2/terrain/4/2/3/3.pbf new file mode 100644 index 00000000..1d9395a5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/2/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/0/0.pbf new file mode 100644 index 00000000..d23ee94a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/0/1.pbf new file mode 100644 index 00000000..f7a35323 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/0/2.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/0/2.pbf new file mode 100644 index 00000000..d0261179 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/0/3.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/0/3.pbf new file mode 100644 index 00000000..0cfde913 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/0/4.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/0/4.pbf new file mode 100644 index 00000000..3f40b29e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/0/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/0/5.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/0/5.pbf new file mode 100644 index 00000000..eead4be4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/0/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/0/6.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/0/6.pbf new file mode 100644 index 00000000..1585580f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/0/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/0/7.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/0/7.pbf new file mode 100644 index 00000000..b6b9506e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/0/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/1/0.pbf new file mode 100644 index 00000000..bd884311 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/1/1.pbf new file mode 100644 index 00000000..b7a2a4c9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/1/2.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/1/2.pbf new file mode 100644 index 00000000..682ad917 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/1/3.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/1/3.pbf new file mode 100644 index 00000000..0ec4411d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/1/4.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/1/4.pbf new file mode 100644 index 00000000..e252697a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/1/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/1/5.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/1/5.pbf new file mode 100644 index 00000000..da019feb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/1/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/1/6.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/1/6.pbf new file mode 100644 index 00000000..a6c51dac Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/1/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/1/7.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/1/7.pbf new file mode 100644 index 00000000..8ccd221d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/1/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/2/0.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/2/0.pbf new file mode 100644 index 00000000..e5f4aeb4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/2/1.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/2/1.pbf new file mode 100644 index 00000000..fce7ca5f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/2/2.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/2/2.pbf new file mode 100644 index 00000000..99f230b5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/2/3.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/2/3.pbf new file mode 100644 index 00000000..7b50bd66 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/2/4.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/2/4.pbf new file mode 100644 index 00000000..3fc1d9f0 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/2/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/2/5.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/2/5.pbf new file mode 100644 index 00000000..2418ab43 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/2/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/2/6.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/2/6.pbf new file mode 100644 index 00000000..ec9d9d7e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/2/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/2/7.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/2/7.pbf new file mode 100644 index 00000000..3255d5f2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/2/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/3/0.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/3/0.pbf new file mode 100644 index 00000000..ba5c0d0a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/3/1.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/3/1.pbf new file mode 100644 index 00000000..50326003 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/3/2.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/3/2.pbf new file mode 100644 index 00000000..84752163 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/3/3.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/3/3.pbf new file mode 100644 index 00000000..cfe97107 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/3/4.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/3/4.pbf new file mode 100644 index 00000000..7940e54e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/3/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/3/5.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/3/5.pbf new file mode 100644 index 00000000..31546b67 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/3/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/3/6.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/3/6.pbf new file mode 100644 index 00000000..70116bac Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/3/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/3/7.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/3/7.pbf new file mode 100644 index 00000000..4f9324d4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/3/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/4/0.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/4/0.pbf new file mode 100644 index 00000000..96edb95d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/4/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/4/1.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/4/1.pbf new file mode 100644 index 00000000..adbbae94 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/4/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/4/2.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/4/2.pbf new file mode 100644 index 00000000..b751a686 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/4/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/4/3.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/4/3.pbf new file mode 100644 index 00000000..60a61a77 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/4/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/4/4.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/4/4.pbf new file mode 100644 index 00000000..b812b8ae Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/4/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/4/5.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/4/5.pbf new file mode 100644 index 00000000..e37072f9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/4/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/4/6.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/4/6.pbf new file mode 100644 index 00000000..cfea6a04 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/4/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/4/7.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/4/7.pbf new file mode 100644 index 00000000..528806b9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/4/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/5/0.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/5/0.pbf new file mode 100644 index 00000000..be2f94c5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/5/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/5/1.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/5/1.pbf new file mode 100644 index 00000000..f142d5bf Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/5/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/5/2.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/5/2.pbf new file mode 100644 index 00000000..a79c71ca Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/5/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/5/3.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/5/3.pbf new file mode 100644 index 00000000..516d4aa4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/5/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/5/4.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/5/4.pbf new file mode 100644 index 00000000..7dfb407e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/5/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/5/5.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/5/5.pbf new file mode 100644 index 00000000..0594ced8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/5/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/5/6.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/5/6.pbf new file mode 100644 index 00000000..6bdb59f9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/5/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/5/7.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/5/7.pbf new file mode 100644 index 00000000..ff2b3430 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/5/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/6/0.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/6/0.pbf new file mode 100644 index 00000000..8ea9d4b1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/6/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/6/1.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/6/1.pbf new file mode 100644 index 00000000..a747217d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/6/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/6/2.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/6/2.pbf new file mode 100644 index 00000000..875df72d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/6/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/6/3.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/6/3.pbf new file mode 100644 index 00000000..a599a177 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/6/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/6/4.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/6/4.pbf new file mode 100644 index 00000000..111e12ee Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/6/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/6/5.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/6/5.pbf new file mode 100644 index 00000000..76ebe724 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/6/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/6/6.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/6/6.pbf new file mode 100644 index 00000000..a363d303 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/6/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/6/7.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/6/7.pbf new file mode 100644 index 00000000..719c3ce1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/6/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/7/0.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/7/0.pbf new file mode 100644 index 00000000..ebf2be41 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/7/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/7/1.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/7/1.pbf new file mode 100644 index 00000000..c0edc4f6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/7/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/7/2.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/7/2.pbf new file mode 100644 index 00000000..ab4ee551 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/7/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/7/3.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/7/3.pbf new file mode 100644 index 00000000..08b1f4dc Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/7/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/7/4.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/7/4.pbf new file mode 100644 index 00000000..ea5712b7 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/7/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/7/5.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/7/5.pbf new file mode 100644 index 00000000..1dcad96a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/7/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/7/6.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/7/6.pbf new file mode 100644 index 00000000..36a82c80 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/7/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/4/3/7/7.pbf b/tests/readers/tile/fixtures/s2/terrain/4/3/7/7.pbf new file mode 100644 index 00000000..95646042 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/4/3/7/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/0/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/5/0/0/0.pbf new file mode 100644 index 00000000..3f77c987 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/0/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/1/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/5/1/0/0.pbf new file mode 100644 index 00000000..0b582ed1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/1/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/1/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/5/1/0/1.pbf new file mode 100644 index 00000000..ae40632a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/1/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/1/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/5/1/1/0.pbf new file mode 100644 index 00000000..bfe89689 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/1/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/1/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/5/1/1/1.pbf new file mode 100644 index 00000000..9f2435fa Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/1/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/2/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/5/2/0/0.pbf new file mode 100644 index 00000000..3926e94d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/2/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/2/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/5/2/0/1.pbf new file mode 100644 index 00000000..49407fe9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/2/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/2/0/2.pbf b/tests/readers/tile/fixtures/s2/terrain/5/2/0/2.pbf new file mode 100644 index 00000000..aa3b85ac Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/2/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/2/0/3.pbf b/tests/readers/tile/fixtures/s2/terrain/5/2/0/3.pbf new file mode 100644 index 00000000..2fe0413e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/2/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/2/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/5/2/1/0.pbf new file mode 100644 index 00000000..697c21ea Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/2/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/2/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/5/2/1/1.pbf new file mode 100644 index 00000000..7b612681 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/2/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/2/1/2.pbf b/tests/readers/tile/fixtures/s2/terrain/5/2/1/2.pbf new file mode 100644 index 00000000..e53475a2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/2/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/2/1/3.pbf b/tests/readers/tile/fixtures/s2/terrain/5/2/1/3.pbf new file mode 100644 index 00000000..df1b6d99 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/2/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/2/2/0.pbf b/tests/readers/tile/fixtures/s2/terrain/5/2/2/0.pbf new file mode 100644 index 00000000..e65af952 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/2/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/2/2/1.pbf b/tests/readers/tile/fixtures/s2/terrain/5/2/2/1.pbf new file mode 100644 index 00000000..5079e76f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/2/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/2/2/2.pbf b/tests/readers/tile/fixtures/s2/terrain/5/2/2/2.pbf new file mode 100644 index 00000000..7d8f8a7f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/2/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/2/2/3.pbf b/tests/readers/tile/fixtures/s2/terrain/5/2/2/3.pbf new file mode 100644 index 00000000..3c179040 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/2/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/2/3/0.pbf b/tests/readers/tile/fixtures/s2/terrain/5/2/3/0.pbf new file mode 100644 index 00000000..b0ddde14 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/2/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/2/3/1.pbf b/tests/readers/tile/fixtures/s2/terrain/5/2/3/1.pbf new file mode 100644 index 00000000..c0084f7f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/2/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/2/3/2.pbf b/tests/readers/tile/fixtures/s2/terrain/5/2/3/2.pbf new file mode 100644 index 00000000..9468b933 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/2/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/2/3/3.pbf b/tests/readers/tile/fixtures/s2/terrain/5/2/3/3.pbf new file mode 100644 index 00000000..a6f3878a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/2/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/0/0.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/0/0.pbf new file mode 100644 index 00000000..05836c0d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/0/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/0/1.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/0/1.pbf new file mode 100644 index 00000000..26d4c9d5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/0/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/0/2.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/0/2.pbf new file mode 100644 index 00000000..978d7db1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/0/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/0/3.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/0/3.pbf new file mode 100644 index 00000000..48ce0050 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/0/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/0/4.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/0/4.pbf new file mode 100644 index 00000000..4047e805 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/0/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/0/5.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/0/5.pbf new file mode 100644 index 00000000..1728c533 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/0/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/0/6.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/0/6.pbf new file mode 100644 index 00000000..2c57fb95 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/0/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/0/7.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/0/7.pbf new file mode 100644 index 00000000..0927b516 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/0/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/1/0.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/1/0.pbf new file mode 100644 index 00000000..0573a7e1 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/1/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/1/1.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/1/1.pbf new file mode 100644 index 00000000..bcb77325 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/1/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/1/2.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/1/2.pbf new file mode 100644 index 00000000..e5a9ec29 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/1/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/1/3.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/1/3.pbf new file mode 100644 index 00000000..d7e4455c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/1/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/1/4.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/1/4.pbf new file mode 100644 index 00000000..33366370 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/1/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/1/5.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/1/5.pbf new file mode 100644 index 00000000..fe7e4006 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/1/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/1/6.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/1/6.pbf new file mode 100644 index 00000000..c6984338 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/1/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/1/7.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/1/7.pbf new file mode 100644 index 00000000..5ffa6560 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/1/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/2/0.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/2/0.pbf new file mode 100644 index 00000000..60f6f9cd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/2/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/2/1.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/2/1.pbf new file mode 100644 index 00000000..0b2e7533 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/2/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/2/2.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/2/2.pbf new file mode 100644 index 00000000..72b64ea4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/2/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/2/3.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/2/3.pbf new file mode 100644 index 00000000..168ebe1b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/2/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/2/4.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/2/4.pbf new file mode 100644 index 00000000..99be704c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/2/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/2/5.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/2/5.pbf new file mode 100644 index 00000000..85bfce34 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/2/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/2/6.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/2/6.pbf new file mode 100644 index 00000000..299eb0a5 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/2/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/2/7.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/2/7.pbf new file mode 100644 index 00000000..3bc35832 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/2/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/3/0.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/3/0.pbf new file mode 100644 index 00000000..1d0bafc3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/3/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/3/1.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/3/1.pbf new file mode 100644 index 00000000..198366d6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/3/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/3/2.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/3/2.pbf new file mode 100644 index 00000000..95a5ef61 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/3/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/3/3.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/3/3.pbf new file mode 100644 index 00000000..49880a35 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/3/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/3/4.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/3/4.pbf new file mode 100644 index 00000000..6d277539 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/3/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/3/5.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/3/5.pbf new file mode 100644 index 00000000..38589c9d Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/3/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/3/6.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/3/6.pbf new file mode 100644 index 00000000..a7a9499f Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/3/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/3/7.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/3/7.pbf new file mode 100644 index 00000000..e55b3cbd Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/3/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/4/0.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/4/0.pbf new file mode 100644 index 00000000..9b80fef9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/4/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/4/1.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/4/1.pbf new file mode 100644 index 00000000..52502748 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/4/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/4/2.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/4/2.pbf new file mode 100644 index 00000000..5b4b4115 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/4/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/4/3.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/4/3.pbf new file mode 100644 index 00000000..74e9cfa8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/4/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/4/4.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/4/4.pbf new file mode 100644 index 00000000..c4fb55bb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/4/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/4/5.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/4/5.pbf new file mode 100644 index 00000000..361756d9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/4/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/4/6.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/4/6.pbf new file mode 100644 index 00000000..fc227734 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/4/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/4/7.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/4/7.pbf new file mode 100644 index 00000000..6f9570f4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/4/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/5/0.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/5/0.pbf new file mode 100644 index 00000000..5c749229 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/5/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/5/1.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/5/1.pbf new file mode 100644 index 00000000..3e7bce8e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/5/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/5/2.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/5/2.pbf new file mode 100644 index 00000000..41ccfb3b Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/5/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/5/3.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/5/3.pbf new file mode 100644 index 00000000..88aa053a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/5/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/5/4.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/5/4.pbf new file mode 100644 index 00000000..c3735cd8 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/5/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/5/5.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/5/5.pbf new file mode 100644 index 00000000..baa3efd2 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/5/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/5/6.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/5/6.pbf new file mode 100644 index 00000000..2386876a Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/5/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/5/7.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/5/7.pbf new file mode 100644 index 00000000..5447faa4 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/5/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/6/0.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/6/0.pbf new file mode 100644 index 00000000..32ca1fbb Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/6/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/6/1.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/6/1.pbf new file mode 100644 index 00000000..5d7bbb98 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/6/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/6/2.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/6/2.pbf new file mode 100644 index 00000000..ede512ed Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/6/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/6/3.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/6/3.pbf new file mode 100644 index 00000000..dfcde199 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/6/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/6/4.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/6/4.pbf new file mode 100644 index 00000000..afb4d630 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/6/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/6/5.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/6/5.pbf new file mode 100644 index 00000000..b48689a3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/6/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/6/6.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/6/6.pbf new file mode 100644 index 00000000..abb86833 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/6/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/6/7.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/6/7.pbf new file mode 100644 index 00000000..b4162bbe Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/6/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/7/0.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/7/0.pbf new file mode 100644 index 00000000..7b8ac2f9 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/7/0.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/7/1.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/7/1.pbf new file mode 100644 index 00000000..8d1fa70e Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/7/1.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/7/2.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/7/2.pbf new file mode 100644 index 00000000..5e5b3d07 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/7/2.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/7/3.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/7/3.pbf new file mode 100644 index 00000000..b12abbd6 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/7/3.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/7/4.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/7/4.pbf new file mode 100644 index 00000000..6a2dacfa Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/7/4.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/7/5.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/7/5.pbf new file mode 100644 index 00000000..31eb7a1c Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/7/5.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/7/6.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/7/6.pbf new file mode 100644 index 00000000..6e6a5a09 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/7/6.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/5/3/7/7.pbf b/tests/readers/tile/fixtures/s2/terrain/5/3/7/7.pbf new file mode 100644 index 00000000..5cd013c3 Binary files /dev/null and b/tests/readers/tile/fixtures/s2/terrain/5/3/7/7.pbf differ diff --git a/tests/readers/tile/fixtures/s2/terrain/metadata.json b/tests/readers/tile/fixtures/s2/terrain/metadata.json new file mode 100644 index 00000000..91f3f8f0 --- /dev/null +++ b/tests/readers/tile/fixtures/s2/terrain/metadata.json @@ -0,0 +1,544 @@ +{ + "s2tilejson": "1.0.0", + "format": "fzxy", + "type": "vector", + "extension": "pbf", + "encoding": "br", + "minzoom": 0, + "maxzoom": 3, + "version": 1, + "faces": [ + 0, + 1, + 2, + 3, + 4, + 5 + ], + "facesbounds": { + "0": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ], + "6": [ + 0, + 0, + 63, + 63 + ], + "7": [ + 0, + 0, + 127, + 127 + ], + "8": [ + 0, + 13, + 255, + 255 + ], + "9": [ + 0, + 26, + 511, + 511 + ], + "10": [ + 0, + 53, + 1023, + 1023 + ] + }, + "1": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ], + "6": [ + 0, + 0, + 63, + 63 + ], + "7": [ + 0, + 0, + 127, + 127 + ], + "8": [ + 0, + 2, + 255, + 255 + ], + "9": [ + 0, + 4, + 511, + 511 + ], + "10": [ + 0, + 8, + 1023, + 1023 + ] + }, + "2": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ], + "6": [ + 0, + 0, + 63, + 63 + ], + "7": [ + 0, + 0, + 127, + 127 + ], + "8": [ + 0, + 0, + 255, + 255 + ], + "9": [ + 0, + 0, + 511, + 511 + ], + "10": [ + 0, + 0, + 1023, + 1023 + ] + }, + "3": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ], + "6": [ + 0, + 0, + 63, + 63 + ], + "7": [ + 0, + 0, + 127, + 127 + ], + "8": [ + 0, + 0, + 255, + 255 + ], + "9": [ + 0, + 0, + 511, + 511 + ], + "10": [ + 0, + 0, + 1023, + 1023 + ] + }, + "4": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ], + "6": [ + 0, + 0, + 63, + 63 + ], + "7": [ + 0, + 0, + 127, + 127 + ], + "8": [ + 0, + 0, + 255, + 255 + ], + "9": [ + 0, + 0, + 511, + 511 + ], + "10": [ + 0, + 0, + 1023, + 1023 + ] + }, + "5": { + "0": [ + 0, + 0, + 0, + 0 + ], + "1": [ + 0, + 0, + 1, + 1 + ], + "2": [ + 0, + 0, + 3, + 3 + ], + "3": [ + 0, + 0, + 7, + 7 + ], + "4": [ + 0, + 0, + 15, + 15 + ], + "5": [ + 0, + 0, + 31, + 31 + ], + "6": [ + 0, + 0, + 63, + 63 + ], + "7": [ + 0, + 0, + 127, + 127 + ], + "8": [ + 0, + 0, + 250, + 230 + ], + "9": [ + 0, + 0, + 500, + 460 + ], + "10": [ + 0, + 0, + 1001, + 921 + ] + } + }, + "layers": { + "landcover": { + "minzoom": 0, + "maxzoom": 5, + "fields": { + "class": [ + "shrub", + "crop", + "tree", + "wood", + "snow", + "wasteland" + ] + } + }, + "hillshade": { + "minzoom": 0, + "maxzoom": 10, + "fields": { + "class": [ + "shade", + "highlight" + ], + "level": [ + 0, + 1, + 2, + 3 + ] + } + }, + "contours": { + "minzoom": 9, + "maxzoom": 10, + "fields": { + "ele": [ + 200, + 400, + 600, + 800, + 1000, + 1200, + 1400, + 1600, + 1800, + 2000, + 2200, + 2400, + 2600, + 2800, + 3000, + 3200, + 3400, + 3600, + 3800, + 4000, + 4200, + 4400, + 4600, + 4800, + 5000, + 5200, + 5400, + 5600, + 5800, + 100, + 300, + 500, + 700, + 900, + 1100, + 1300, + 1500, + 1700, + 1900, + 2100, + 2300, + 2500, + 2700, + 2900, + 3100, + 3300, + 3500, + 3700, + 3900, + 4100 + ], + "index": [ + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 0 + ] + } + } + }, + "attributions": { + "S2Maps": "https://opens2.com/data" + }, + "description": "Built by S2 MAPS INC.", + "tilestats": { + "0": 497517, + "1": 443005, + "2": 707933, + "3": 103221, + "4": 399534, + "5": 152653, + "total": 2303863 + }, + "name": "Terrain Data" +} \ No newline at end of file diff --git a/tests/readers/tile/fixtures/wm/satellite/0/0/0.webp b/tests/readers/tile/fixtures/wm/satellite/0/0/0.webp new file mode 100644 index 00000000..0a5c64dc Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/0/0/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/1/0/0.webp b/tests/readers/tile/fixtures/wm/satellite/1/0/0.webp new file mode 100644 index 00000000..a43953fb Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/1/0/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/1/0/1.webp b/tests/readers/tile/fixtures/wm/satellite/1/0/1.webp new file mode 100644 index 00000000..f3e7df37 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/1/0/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/1/1/0.webp b/tests/readers/tile/fixtures/wm/satellite/1/1/0.webp new file mode 100644 index 00000000..85090d8c Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/1/1/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/1/1/1.webp b/tests/readers/tile/fixtures/wm/satellite/1/1/1.webp new file mode 100644 index 00000000..3ed42f8e Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/1/1/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/2/0/0.webp b/tests/readers/tile/fixtures/wm/satellite/2/0/0.webp new file mode 100644 index 00000000..53291849 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/2/0/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/2/0/1.webp b/tests/readers/tile/fixtures/wm/satellite/2/0/1.webp new file mode 100644 index 00000000..6690fc7f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/2/0/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/2/0/2.webp b/tests/readers/tile/fixtures/wm/satellite/2/0/2.webp new file mode 100644 index 00000000..b94cedda Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/2/0/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/2/0/3.webp b/tests/readers/tile/fixtures/wm/satellite/2/0/3.webp new file mode 100644 index 00000000..3774d587 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/2/0/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/2/1/0.webp b/tests/readers/tile/fixtures/wm/satellite/2/1/0.webp new file mode 100644 index 00000000..fed7cc49 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/2/1/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/2/1/1.webp b/tests/readers/tile/fixtures/wm/satellite/2/1/1.webp new file mode 100644 index 00000000..39e7a82a Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/2/1/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/2/1/2.webp b/tests/readers/tile/fixtures/wm/satellite/2/1/2.webp new file mode 100644 index 00000000..10a0c80c Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/2/1/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/2/1/3.webp b/tests/readers/tile/fixtures/wm/satellite/2/1/3.webp new file mode 100644 index 00000000..24766958 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/2/1/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/2/2/0.webp b/tests/readers/tile/fixtures/wm/satellite/2/2/0.webp new file mode 100644 index 00000000..fca5c5db Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/2/2/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/2/2/1.webp b/tests/readers/tile/fixtures/wm/satellite/2/2/1.webp new file mode 100644 index 00000000..94a92c2f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/2/2/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/2/2/2.webp b/tests/readers/tile/fixtures/wm/satellite/2/2/2.webp new file mode 100644 index 00000000..73411909 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/2/2/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/2/2/3.webp b/tests/readers/tile/fixtures/wm/satellite/2/2/3.webp new file mode 100644 index 00000000..a71b6e0b Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/2/2/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/2/3/0.webp b/tests/readers/tile/fixtures/wm/satellite/2/3/0.webp new file mode 100644 index 00000000..b9733caa Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/2/3/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/2/3/1.webp b/tests/readers/tile/fixtures/wm/satellite/2/3/1.webp new file mode 100644 index 00000000..11c3312e Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/2/3/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/2/3/2.webp b/tests/readers/tile/fixtures/wm/satellite/2/3/2.webp new file mode 100644 index 00000000..4c350230 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/2/3/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/2/3/3.webp b/tests/readers/tile/fixtures/wm/satellite/2/3/3.webp new file mode 100644 index 00000000..357c2981 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/2/3/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/0/0.webp b/tests/readers/tile/fixtures/wm/satellite/3/0/0.webp new file mode 100644 index 00000000..e54c33b3 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/0/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/0/1.webp b/tests/readers/tile/fixtures/wm/satellite/3/0/1.webp new file mode 100644 index 00000000..751e70a6 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/0/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/0/2.webp b/tests/readers/tile/fixtures/wm/satellite/3/0/2.webp new file mode 100644 index 00000000..4ab58b8f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/0/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/0/3.webp b/tests/readers/tile/fixtures/wm/satellite/3/0/3.webp new file mode 100644 index 00000000..744fd4dc Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/0/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/0/4.webp b/tests/readers/tile/fixtures/wm/satellite/3/0/4.webp new file mode 100644 index 00000000..f9eb652d Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/0/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/0/5.webp b/tests/readers/tile/fixtures/wm/satellite/3/0/5.webp new file mode 100644 index 00000000..f9a5d6e4 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/0/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/0/6.webp b/tests/readers/tile/fixtures/wm/satellite/3/0/6.webp new file mode 100644 index 00000000..b6029b9a Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/0/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/0/7.webp b/tests/readers/tile/fixtures/wm/satellite/3/0/7.webp new file mode 100644 index 00000000..86195696 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/0/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/1/0.webp b/tests/readers/tile/fixtures/wm/satellite/3/1/0.webp new file mode 100644 index 00000000..f20208f7 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/1/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/1/1.webp b/tests/readers/tile/fixtures/wm/satellite/3/1/1.webp new file mode 100644 index 00000000..315a9f83 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/1/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/1/2.webp b/tests/readers/tile/fixtures/wm/satellite/3/1/2.webp new file mode 100644 index 00000000..2ecee1ed Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/1/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/1/3.webp b/tests/readers/tile/fixtures/wm/satellite/3/1/3.webp new file mode 100644 index 00000000..f4e494d4 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/1/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/1/4.webp b/tests/readers/tile/fixtures/wm/satellite/3/1/4.webp new file mode 100644 index 00000000..63480423 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/1/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/1/5.webp b/tests/readers/tile/fixtures/wm/satellite/3/1/5.webp new file mode 100644 index 00000000..7808b84d Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/1/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/1/6.webp b/tests/readers/tile/fixtures/wm/satellite/3/1/6.webp new file mode 100644 index 00000000..ef752bb6 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/1/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/1/7.webp b/tests/readers/tile/fixtures/wm/satellite/3/1/7.webp new file mode 100644 index 00000000..0e6a3b47 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/1/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/2/0.webp b/tests/readers/tile/fixtures/wm/satellite/3/2/0.webp new file mode 100644 index 00000000..ec6f53db Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/2/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/2/1.webp b/tests/readers/tile/fixtures/wm/satellite/3/2/1.webp new file mode 100644 index 00000000..903052a2 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/2/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/2/2.webp b/tests/readers/tile/fixtures/wm/satellite/3/2/2.webp new file mode 100644 index 00000000..50f83b11 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/2/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/2/3.webp b/tests/readers/tile/fixtures/wm/satellite/3/2/3.webp new file mode 100644 index 00000000..155f1762 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/2/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/2/4.webp b/tests/readers/tile/fixtures/wm/satellite/3/2/4.webp new file mode 100644 index 00000000..10bfa3f4 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/2/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/2/5.webp b/tests/readers/tile/fixtures/wm/satellite/3/2/5.webp new file mode 100644 index 00000000..1f23d112 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/2/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/2/6.webp b/tests/readers/tile/fixtures/wm/satellite/3/2/6.webp new file mode 100644 index 00000000..647c2d1f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/2/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/2/7.webp b/tests/readers/tile/fixtures/wm/satellite/3/2/7.webp new file mode 100644 index 00000000..9e005599 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/2/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/3/0.webp b/tests/readers/tile/fixtures/wm/satellite/3/3/0.webp new file mode 100644 index 00000000..6f5a9fcc Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/3/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/3/1.webp b/tests/readers/tile/fixtures/wm/satellite/3/3/1.webp new file mode 100644 index 00000000..5263962a Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/3/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/3/2.webp b/tests/readers/tile/fixtures/wm/satellite/3/3/2.webp new file mode 100644 index 00000000..0ff97730 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/3/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/3/3.webp b/tests/readers/tile/fixtures/wm/satellite/3/3/3.webp new file mode 100644 index 00000000..8623a306 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/3/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/3/4.webp b/tests/readers/tile/fixtures/wm/satellite/3/3/4.webp new file mode 100644 index 00000000..6a0cc27b Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/3/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/3/5.webp b/tests/readers/tile/fixtures/wm/satellite/3/3/5.webp new file mode 100644 index 00000000..12927ed5 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/3/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/3/6.webp b/tests/readers/tile/fixtures/wm/satellite/3/3/6.webp new file mode 100644 index 00000000..cbc6a9f0 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/3/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/3/7.webp b/tests/readers/tile/fixtures/wm/satellite/3/3/7.webp new file mode 100644 index 00000000..a06afb46 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/3/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/4/0.webp b/tests/readers/tile/fixtures/wm/satellite/3/4/0.webp new file mode 100644 index 00000000..0ebf9474 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/4/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/4/1.webp b/tests/readers/tile/fixtures/wm/satellite/3/4/1.webp new file mode 100644 index 00000000..04e66262 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/4/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/4/2.webp b/tests/readers/tile/fixtures/wm/satellite/3/4/2.webp new file mode 100644 index 00000000..f65b9fdc Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/4/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/4/3.webp b/tests/readers/tile/fixtures/wm/satellite/3/4/3.webp new file mode 100644 index 00000000..e5e50bf8 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/4/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/4/4.webp b/tests/readers/tile/fixtures/wm/satellite/3/4/4.webp new file mode 100644 index 00000000..0799433d Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/4/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/4/5.webp b/tests/readers/tile/fixtures/wm/satellite/3/4/5.webp new file mode 100644 index 00000000..f222b954 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/4/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/4/6.webp b/tests/readers/tile/fixtures/wm/satellite/3/4/6.webp new file mode 100644 index 00000000..27274750 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/4/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/4/7.webp b/tests/readers/tile/fixtures/wm/satellite/3/4/7.webp new file mode 100644 index 00000000..52c8544f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/4/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/5/0.webp b/tests/readers/tile/fixtures/wm/satellite/3/5/0.webp new file mode 100644 index 00000000..2c1f5c69 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/5/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/5/1.webp b/tests/readers/tile/fixtures/wm/satellite/3/5/1.webp new file mode 100644 index 00000000..e0343cd0 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/5/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/5/2.webp b/tests/readers/tile/fixtures/wm/satellite/3/5/2.webp new file mode 100644 index 00000000..c9e59ae7 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/5/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/5/3.webp b/tests/readers/tile/fixtures/wm/satellite/3/5/3.webp new file mode 100644 index 00000000..0678426f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/5/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/5/4.webp b/tests/readers/tile/fixtures/wm/satellite/3/5/4.webp new file mode 100644 index 00000000..e6203b72 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/5/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/5/5.webp b/tests/readers/tile/fixtures/wm/satellite/3/5/5.webp new file mode 100644 index 00000000..18ee16b8 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/5/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/5/6.webp b/tests/readers/tile/fixtures/wm/satellite/3/5/6.webp new file mode 100644 index 00000000..5c4a13a2 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/5/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/5/7.webp b/tests/readers/tile/fixtures/wm/satellite/3/5/7.webp new file mode 100644 index 00000000..ce0e2807 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/5/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/6/0.webp b/tests/readers/tile/fixtures/wm/satellite/3/6/0.webp new file mode 100644 index 00000000..e125c79e Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/6/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/6/1.webp b/tests/readers/tile/fixtures/wm/satellite/3/6/1.webp new file mode 100644 index 00000000..aefd9791 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/6/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/6/2.webp b/tests/readers/tile/fixtures/wm/satellite/3/6/2.webp new file mode 100644 index 00000000..22d0312c Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/6/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/6/3.webp b/tests/readers/tile/fixtures/wm/satellite/3/6/3.webp new file mode 100644 index 00000000..78ac2f32 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/6/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/6/4.webp b/tests/readers/tile/fixtures/wm/satellite/3/6/4.webp new file mode 100644 index 00000000..be9ca951 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/6/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/6/5.webp b/tests/readers/tile/fixtures/wm/satellite/3/6/5.webp new file mode 100644 index 00000000..e5bf1a51 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/6/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/6/6.webp b/tests/readers/tile/fixtures/wm/satellite/3/6/6.webp new file mode 100644 index 00000000..c38987a3 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/6/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/6/7.webp b/tests/readers/tile/fixtures/wm/satellite/3/6/7.webp new file mode 100644 index 00000000..8ec6f57f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/6/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/7/0.webp b/tests/readers/tile/fixtures/wm/satellite/3/7/0.webp new file mode 100644 index 00000000..c3d94968 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/7/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/7/1.webp b/tests/readers/tile/fixtures/wm/satellite/3/7/1.webp new file mode 100644 index 00000000..291968ae Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/7/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/7/2.webp b/tests/readers/tile/fixtures/wm/satellite/3/7/2.webp new file mode 100644 index 00000000..25a0efbc Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/7/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/7/3.webp b/tests/readers/tile/fixtures/wm/satellite/3/7/3.webp new file mode 100644 index 00000000..b21efa31 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/7/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/7/4.webp b/tests/readers/tile/fixtures/wm/satellite/3/7/4.webp new file mode 100644 index 00000000..e51346af Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/7/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/7/5.webp b/tests/readers/tile/fixtures/wm/satellite/3/7/5.webp new file mode 100644 index 00000000..bd172bc3 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/7/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/7/6.webp b/tests/readers/tile/fixtures/wm/satellite/3/7/6.webp new file mode 100644 index 00000000..77bdea6f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/7/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/3/7/7.webp b/tests/readers/tile/fixtures/wm/satellite/3/7/7.webp new file mode 100644 index 00000000..9c76a7f4 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/satellite/3/7/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/satellite/metadata.json b/tests/readers/tile/fixtures/wm/satellite/metadata.json new file mode 100644 index 00000000..8dcfa104 --- /dev/null +++ b/tests/readers/tile/fixtures/wm/satellite/metadata.json @@ -0,0 +1,17 @@ +{ + "s2tilejson": "1.0.0", + "bounds": [ + -180, + -85, + 180, + 85 + ], + "name": "Mapbox Satellite", + "scheme": "xyz", + "format": "zxy", + "type": "raster", + "extension": "webp", + "encoding": "none", + "minzoom": 0, + "maxzoom": 3 +} diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/0/0/0.webp b/tests/readers/tile/fixtures/wm/terrain-v2/0/0/0.webp new file mode 100644 index 00000000..893d66be Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/0/0/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/1/0/0.webp b/tests/readers/tile/fixtures/wm/terrain-v2/1/0/0.webp new file mode 100644 index 00000000..b089ffcc Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/1/0/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/1/0/1.webp b/tests/readers/tile/fixtures/wm/terrain-v2/1/0/1.webp new file mode 100644 index 00000000..bc719f33 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/1/0/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/1/1/0.webp b/tests/readers/tile/fixtures/wm/terrain-v2/1/1/0.webp new file mode 100644 index 00000000..8ab3e300 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/1/1/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/1/1/1.webp b/tests/readers/tile/fixtures/wm/terrain-v2/1/1/1.webp new file mode 100644 index 00000000..c87afdc6 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/1/1/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/2/0/0.webp b/tests/readers/tile/fixtures/wm/terrain-v2/2/0/0.webp new file mode 100644 index 00000000..ca4cdcee Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/2/0/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/2/0/1.webp b/tests/readers/tile/fixtures/wm/terrain-v2/2/0/1.webp new file mode 100644 index 00000000..36317a46 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/2/0/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/2/0/2.webp b/tests/readers/tile/fixtures/wm/terrain-v2/2/0/2.webp new file mode 100644 index 00000000..4fceea5b Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/2/0/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/2/0/3.webp b/tests/readers/tile/fixtures/wm/terrain-v2/2/0/3.webp new file mode 100644 index 00000000..89680292 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/2/0/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/2/1/0.webp b/tests/readers/tile/fixtures/wm/terrain-v2/2/1/0.webp new file mode 100644 index 00000000..061c24fc Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/2/1/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/2/1/1.webp b/tests/readers/tile/fixtures/wm/terrain-v2/2/1/1.webp new file mode 100644 index 00000000..532ac08d Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/2/1/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/2/1/2.webp b/tests/readers/tile/fixtures/wm/terrain-v2/2/1/2.webp new file mode 100644 index 00000000..cb9cf84d Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/2/1/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/2/1/3.webp b/tests/readers/tile/fixtures/wm/terrain-v2/2/1/3.webp new file mode 100644 index 00000000..f7755f7f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/2/1/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/2/2/0.webp b/tests/readers/tile/fixtures/wm/terrain-v2/2/2/0.webp new file mode 100644 index 00000000..518e6ebe Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/2/2/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/2/2/1.webp b/tests/readers/tile/fixtures/wm/terrain-v2/2/2/1.webp new file mode 100644 index 00000000..2074d6c6 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/2/2/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/2/2/2.webp b/tests/readers/tile/fixtures/wm/terrain-v2/2/2/2.webp new file mode 100644 index 00000000..dedae764 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/2/2/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/2/2/3.webp b/tests/readers/tile/fixtures/wm/terrain-v2/2/2/3.webp new file mode 100644 index 00000000..e20403ee Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/2/2/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/2/3/0.webp b/tests/readers/tile/fixtures/wm/terrain-v2/2/3/0.webp new file mode 100644 index 00000000..c122a1f5 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/2/3/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/2/3/1.webp b/tests/readers/tile/fixtures/wm/terrain-v2/2/3/1.webp new file mode 100644 index 00000000..69426332 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/2/3/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/2/3/2.webp b/tests/readers/tile/fixtures/wm/terrain-v2/2/3/2.webp new file mode 100644 index 00000000..0d24ce1f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/2/3/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/2/3/3.webp b/tests/readers/tile/fixtures/wm/terrain-v2/2/3/3.webp new file mode 100644 index 00000000..aeec411a Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/2/3/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/0/0.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/0/0.webp new file mode 100644 index 00000000..be86a080 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/0/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/0/1.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/0/1.webp new file mode 100644 index 00000000..b8e1d27b Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/0/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/0/2.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/0/2.webp new file mode 100644 index 00000000..713c9e43 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/0/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/0/3.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/0/3.webp new file mode 100644 index 00000000..03a3a028 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/0/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/0/4.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/0/4.webp new file mode 100644 index 00000000..34b768b2 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/0/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/0/5.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/0/5.webp new file mode 100644 index 00000000..e7f7be0a Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/0/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/0/6.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/0/6.webp new file mode 100644 index 00000000..aa5dddce Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/0/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/0/7.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/0/7.webp new file mode 100644 index 00000000..89c9365c Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/0/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/1/0.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/1/0.webp new file mode 100644 index 00000000..1da5b072 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/1/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/1/1.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/1/1.webp new file mode 100644 index 00000000..11e286cf Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/1/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/1/2.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/1/2.webp new file mode 100644 index 00000000..92e0c23e Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/1/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/1/3.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/1/3.webp new file mode 100644 index 00000000..956df071 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/1/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/1/4.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/1/4.webp new file mode 100644 index 00000000..7a145fda Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/1/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/1/5.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/1/5.webp new file mode 100644 index 00000000..be86a080 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/1/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/1/6.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/1/6.webp new file mode 100644 index 00000000..68659fd0 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/1/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/1/7.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/1/7.webp new file mode 100644 index 00000000..e82409ca Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/1/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/2/0.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/2/0.webp new file mode 100644 index 00000000..2e16966b Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/2/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/2/1.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/2/1.webp new file mode 100644 index 00000000..5fc14291 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/2/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/2/2.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/2/2.webp new file mode 100644 index 00000000..b2fd10e6 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/2/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/2/3.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/2/3.webp new file mode 100644 index 00000000..38e1a244 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/2/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/2/4.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/2/4.webp new file mode 100644 index 00000000..71632070 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/2/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/2/5.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/2/5.webp new file mode 100644 index 00000000..c256d8fb Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/2/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/2/6.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/2/6.webp new file mode 100644 index 00000000..a69631ee Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/2/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/2/7.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/2/7.webp new file mode 100644 index 00000000..4bf0908e Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/2/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/3/0.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/3/0.webp new file mode 100644 index 00000000..91bdc2e3 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/3/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/3/1.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/3/1.webp new file mode 100644 index 00000000..2d6096f7 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/3/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/3/2.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/3/2.webp new file mode 100644 index 00000000..41e9888d Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/3/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/3/3.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/3/3.webp new file mode 100644 index 00000000..77d8ea73 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/3/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/3/4.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/3/4.webp new file mode 100644 index 00000000..de529f6b Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/3/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/3/5.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/3/5.webp new file mode 100644 index 00000000..bdc6a59a Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/3/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/3/6.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/3/6.webp new file mode 100644 index 00000000..e6fb2075 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/3/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/3/7.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/3/7.webp new file mode 100644 index 00000000..d77ecf12 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/3/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/4/0.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/4/0.webp new file mode 100644 index 00000000..6ec13b0f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/4/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/4/1.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/4/1.webp new file mode 100644 index 00000000..0d756596 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/4/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/4/2.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/4/2.webp new file mode 100644 index 00000000..de7eaa9f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/4/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/4/3.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/4/3.webp new file mode 100644 index 00000000..19bcb0a3 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/4/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/4/4.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/4/4.webp new file mode 100644 index 00000000..a5e17e65 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/4/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/4/5.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/4/5.webp new file mode 100644 index 00000000..b6110ce8 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/4/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/4/6.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/4/6.webp new file mode 100644 index 00000000..a0eae99b Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/4/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/4/7.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/4/7.webp new file mode 100644 index 00000000..ccc184e7 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/4/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/5/0.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/5/0.webp new file mode 100644 index 00000000..a62c5107 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/5/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/5/1.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/5/1.webp new file mode 100644 index 00000000..a0a642f7 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/5/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/5/2.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/5/2.webp new file mode 100644 index 00000000..08fdffcb Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/5/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/5/3.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/5/3.webp new file mode 100644 index 00000000..a6a36f5a Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/5/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/5/4.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/5/4.webp new file mode 100644 index 00000000..c6d2e542 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/5/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/5/5.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/5/5.webp new file mode 100644 index 00000000..dd96ce38 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/5/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/5/6.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/5/6.webp new file mode 100644 index 00000000..607577c8 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/5/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/5/7.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/5/7.webp new file mode 100644 index 00000000..0edf29a5 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/5/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/6/0.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/6/0.webp new file mode 100644 index 00000000..5822dec5 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/6/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/6/1.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/6/1.webp new file mode 100644 index 00000000..6f40fedc Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/6/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/6/2.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/6/2.webp new file mode 100644 index 00000000..51718fa7 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/6/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/6/3.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/6/3.webp new file mode 100644 index 00000000..7fb9e0dd Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/6/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/6/4.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/6/4.webp new file mode 100644 index 00000000..390de231 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/6/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/6/5.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/6/5.webp new file mode 100644 index 00000000..2513ddc4 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/6/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/6/6.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/6/6.webp new file mode 100644 index 00000000..ea879772 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/6/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/6/7.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/6/7.webp new file mode 100644 index 00000000..c98c77a9 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/6/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/7/0.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/7/0.webp new file mode 100644 index 00000000..be86a080 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/7/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/7/1.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/7/1.webp new file mode 100644 index 00000000..a05ef6c8 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/7/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/7/2.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/7/2.webp new file mode 100644 index 00000000..21017c62 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/7/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/7/3.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/7/3.webp new file mode 100644 index 00000000..fd4f18dd Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/7/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/7/4.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/7/4.webp new file mode 100644 index 00000000..8e100aaf Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/7/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/7/5.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/7/5.webp new file mode 100644 index 00000000..8c27916b Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/7/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/7/6.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/7/6.webp new file mode 100644 index 00000000..580ea8ed Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/7/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/3/7/7.webp b/tests/readers/tile/fixtures/wm/terrain-v2/3/7/7.webp new file mode 100644 index 00000000..134c33ff Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain-v2/3/7/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain-v2/metadata.json b/tests/readers/tile/fixtures/wm/terrain-v2/metadata.json new file mode 100644 index 00000000..c0afdeef --- /dev/null +++ b/tests/readers/tile/fixtures/wm/terrain-v2/metadata.json @@ -0,0 +1,21 @@ +{ + "s2tilejson": "1.0.0", + "format": "webp", + "name": "Terrain-DEM", + "description": "height = -10000 + ((R * 256 * 256 + G * 256 + B) * 0.1)", + "minzoom": 0, + "maxzoom": 3, + "scheme": "xyz", + "type": "raster", + "extension": "webp", + "encoding": "none", + "attributions": { + "© Mapbox": "https://www.mapbox.com/about/maps/" + }, + "bounds": [ + -180, + -85, + 180, + 85 + ] +} diff --git a/tests/readers/tile/fixtures/wm/terrain/0/0/0.webp b/tests/readers/tile/fixtures/wm/terrain/0/0/0.webp new file mode 100644 index 00000000..79cd303f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/0/0/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/1/0/0.webp b/tests/readers/tile/fixtures/wm/terrain/1/0/0.webp new file mode 100644 index 00000000..89620968 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/1/0/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/1/0/1.webp b/tests/readers/tile/fixtures/wm/terrain/1/0/1.webp new file mode 100644 index 00000000..939ec62f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/1/0/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/1/1/0.webp b/tests/readers/tile/fixtures/wm/terrain/1/1/0.webp new file mode 100644 index 00000000..b1e536b5 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/1/1/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/1/1/1.webp b/tests/readers/tile/fixtures/wm/terrain/1/1/1.webp new file mode 100644 index 00000000..c7f6202e Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/1/1/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/2/0/0.webp b/tests/readers/tile/fixtures/wm/terrain/2/0/0.webp new file mode 100644 index 00000000..0649f22b Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/2/0/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/2/0/1.webp b/tests/readers/tile/fixtures/wm/terrain/2/0/1.webp new file mode 100644 index 00000000..031eccc8 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/2/0/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/2/0/2.webp b/tests/readers/tile/fixtures/wm/terrain/2/0/2.webp new file mode 100644 index 00000000..da4d1cf0 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/2/0/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/2/1/0.webp b/tests/readers/tile/fixtures/wm/terrain/2/1/0.webp new file mode 100644 index 00000000..ee336dd6 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/2/1/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/2/1/1.webp b/tests/readers/tile/fixtures/wm/terrain/2/1/1.webp new file mode 100644 index 00000000..4ed5eaaa Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/2/1/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/2/1/2.webp b/tests/readers/tile/fixtures/wm/terrain/2/1/2.webp new file mode 100644 index 00000000..67e87d6e Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/2/1/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/2/2/0.webp b/tests/readers/tile/fixtures/wm/terrain/2/2/0.webp new file mode 100644 index 00000000..9c39625d Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/2/2/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/2/2/1.webp b/tests/readers/tile/fixtures/wm/terrain/2/2/1.webp new file mode 100644 index 00000000..d2e1b1ad Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/2/2/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/2/2/2.webp b/tests/readers/tile/fixtures/wm/terrain/2/2/2.webp new file mode 100644 index 00000000..cd6af035 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/2/2/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/2/3/0.webp b/tests/readers/tile/fixtures/wm/terrain/2/3/0.webp new file mode 100644 index 00000000..810a4350 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/2/3/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/2/3/1.webp b/tests/readers/tile/fixtures/wm/terrain/2/3/1.webp new file mode 100644 index 00000000..e4e1d3ca Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/2/3/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/2/3/2.webp b/tests/readers/tile/fixtures/wm/terrain/2/3/2.webp new file mode 100644 index 00000000..d69e8dcd Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/2/3/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/0/0.webp b/tests/readers/tile/fixtures/wm/terrain/3/0/0.webp new file mode 100644 index 00000000..4c90ff5d Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/0/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/0/1.webp b/tests/readers/tile/fixtures/wm/terrain/3/0/1.webp new file mode 100644 index 00000000..5c6e07c7 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/0/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/0/2.webp b/tests/readers/tile/fixtures/wm/terrain/3/0/2.webp new file mode 100644 index 00000000..97176207 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/0/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/0/3.webp b/tests/readers/tile/fixtures/wm/terrain/3/0/3.webp new file mode 100644 index 00000000..66a347fa Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/0/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/0/4.webp b/tests/readers/tile/fixtures/wm/terrain/3/0/4.webp new file mode 100644 index 00000000..d115feee Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/0/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/0/5.webp b/tests/readers/tile/fixtures/wm/terrain/3/0/5.webp new file mode 100644 index 00000000..502ec6a9 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/0/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/1/0.webp b/tests/readers/tile/fixtures/wm/terrain/3/1/0.webp new file mode 100644 index 00000000..90bd9c4f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/1/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/1/1.webp b/tests/readers/tile/fixtures/wm/terrain/3/1/1.webp new file mode 100644 index 00000000..12f8c9be Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/1/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/1/2.webp b/tests/readers/tile/fixtures/wm/terrain/3/1/2.webp new file mode 100644 index 00000000..dcb052fa Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/1/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/1/3.webp b/tests/readers/tile/fixtures/wm/terrain/3/1/3.webp new file mode 100644 index 00000000..57883ab5 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/1/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/1/4.webp b/tests/readers/tile/fixtures/wm/terrain/3/1/4.webp new file mode 100644 index 00000000..cc07b0ef Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/1/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/1/5.webp b/tests/readers/tile/fixtures/wm/terrain/3/1/5.webp new file mode 100644 index 00000000..82aa8431 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/1/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/2/0.webp b/tests/readers/tile/fixtures/wm/terrain/3/2/0.webp new file mode 100644 index 00000000..184d38cf Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/2/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/2/1.webp b/tests/readers/tile/fixtures/wm/terrain/3/2/1.webp new file mode 100644 index 00000000..f8ceeb98 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/2/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/2/2.webp b/tests/readers/tile/fixtures/wm/terrain/3/2/2.webp new file mode 100644 index 00000000..7f0c789c Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/2/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/2/3.webp b/tests/readers/tile/fixtures/wm/terrain/3/2/3.webp new file mode 100644 index 00000000..233c2981 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/2/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/2/4.webp b/tests/readers/tile/fixtures/wm/terrain/3/2/4.webp new file mode 100644 index 00000000..54f190bf Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/2/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/2/5.webp b/tests/readers/tile/fixtures/wm/terrain/3/2/5.webp new file mode 100644 index 00000000..fdc2013d Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/2/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/3/0.webp b/tests/readers/tile/fixtures/wm/terrain/3/3/0.webp new file mode 100644 index 00000000..4c90ff5d Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/3/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/3/1.webp b/tests/readers/tile/fixtures/wm/terrain/3/3/1.webp new file mode 100644 index 00000000..e2ae49e9 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/3/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/3/2.webp b/tests/readers/tile/fixtures/wm/terrain/3/3/2.webp new file mode 100644 index 00000000..3b514c02 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/3/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/3/3.webp b/tests/readers/tile/fixtures/wm/terrain/3/3/3.webp new file mode 100644 index 00000000..718ca342 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/3/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/3/4.webp b/tests/readers/tile/fixtures/wm/terrain/3/3/4.webp new file mode 100644 index 00000000..d343d7c2 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/3/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/3/5.webp b/tests/readers/tile/fixtures/wm/terrain/3/3/5.webp new file mode 100644 index 00000000..c92dcc2a Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/3/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/4/0.webp b/tests/readers/tile/fixtures/wm/terrain/3/4/0.webp new file mode 100644 index 00000000..94a8de67 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/4/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/4/1.webp b/tests/readers/tile/fixtures/wm/terrain/3/4/1.webp new file mode 100644 index 00000000..cebac80a Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/4/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/4/2.webp b/tests/readers/tile/fixtures/wm/terrain/3/4/2.webp new file mode 100644 index 00000000..2114b93f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/4/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/4/3.webp b/tests/readers/tile/fixtures/wm/terrain/3/4/3.webp new file mode 100644 index 00000000..571557b9 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/4/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/4/4.webp b/tests/readers/tile/fixtures/wm/terrain/3/4/4.webp new file mode 100644 index 00000000..6bc8908c Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/4/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/4/5.webp b/tests/readers/tile/fixtures/wm/terrain/3/4/5.webp new file mode 100644 index 00000000..f5a92b72 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/4/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/5/0.webp b/tests/readers/tile/fixtures/wm/terrain/3/5/0.webp new file mode 100644 index 00000000..25c71972 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/5/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/5/1.webp b/tests/readers/tile/fixtures/wm/terrain/3/5/1.webp new file mode 100644 index 00000000..37a27018 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/5/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/5/2.webp b/tests/readers/tile/fixtures/wm/terrain/3/5/2.webp new file mode 100644 index 00000000..caa328be Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/5/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/5/3.webp b/tests/readers/tile/fixtures/wm/terrain/3/5/3.webp new file mode 100644 index 00000000..331f659e Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/5/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/5/4.webp b/tests/readers/tile/fixtures/wm/terrain/3/5/4.webp new file mode 100644 index 00000000..8fa65e66 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/5/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/5/5.webp b/tests/readers/tile/fixtures/wm/terrain/3/5/5.webp new file mode 100644 index 00000000..73a7e2fb Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/5/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/6/0.webp b/tests/readers/tile/fixtures/wm/terrain/3/6/0.webp new file mode 100644 index 00000000..81006613 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/6/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/6/1.webp b/tests/readers/tile/fixtures/wm/terrain/3/6/1.webp new file mode 100644 index 00000000..13413708 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/6/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/6/2.webp b/tests/readers/tile/fixtures/wm/terrain/3/6/2.webp new file mode 100644 index 00000000..d6d50c9c Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/6/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/6/3.webp b/tests/readers/tile/fixtures/wm/terrain/3/6/3.webp new file mode 100644 index 00000000..6162463d Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/6/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/6/4.webp b/tests/readers/tile/fixtures/wm/terrain/3/6/4.webp new file mode 100644 index 00000000..126abfb1 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/6/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/6/5.webp b/tests/readers/tile/fixtures/wm/terrain/3/6/5.webp new file mode 100644 index 00000000..82aa8431 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/6/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/7/0.webp b/tests/readers/tile/fixtures/wm/terrain/3/7/0.webp new file mode 100644 index 00000000..4c90ff5d Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/7/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/7/1.webp b/tests/readers/tile/fixtures/wm/terrain/3/7/1.webp new file mode 100644 index 00000000..32d7ce4c Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/7/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/7/2.webp b/tests/readers/tile/fixtures/wm/terrain/3/7/2.webp new file mode 100644 index 00000000..cd710c24 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/7/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/7/3.webp b/tests/readers/tile/fixtures/wm/terrain/3/7/3.webp new file mode 100644 index 00000000..cc99532b Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/7/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/7/4.webp b/tests/readers/tile/fixtures/wm/terrain/3/7/4.webp new file mode 100644 index 00000000..a344b2a5 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/7/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/3/7/5.webp b/tests/readers/tile/fixtures/wm/terrain/3/7/5.webp new file mode 100644 index 00000000..8f74df6c Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrain/3/7/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrain/metadata.json b/tests/readers/tile/fixtures/wm/terrain/metadata.json new file mode 100644 index 00000000..a1b58cf8 --- /dev/null +++ b/tests/readers/tile/fixtures/wm/terrain/metadata.json @@ -0,0 +1,20 @@ +{ + "s2tilejson": "1.0.0", + "name": "Terrain-DEM", + "description": "height = -10000 + ((R * 256 * 256 + G * 256 + B) * 0.1)", + "minzoom": 0, + "maxzoom": 3, + "scheme": "xyz", + "type": "raster", + "extension": "webp", + "encoding": "none", + "attributions": { + "© Mapbox": "https://www.mapbox.com/about/maps/" + }, + "bounds": [ + -180, + -85, + 180, + 85 + ] +} diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/0/0/0.webp b/tests/readers/tile/fixtures/wm/terrarium2x/0/0/0.webp new file mode 100644 index 00000000..505cc8d9 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/0/0/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/1/0/0.webp b/tests/readers/tile/fixtures/wm/terrarium2x/1/0/0.webp new file mode 100644 index 00000000..cd5956f3 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/1/0/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/1/0/1.webp b/tests/readers/tile/fixtures/wm/terrarium2x/1/0/1.webp new file mode 100644 index 00000000..ae0c7906 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/1/0/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/1/1/0.webp b/tests/readers/tile/fixtures/wm/terrarium2x/1/1/0.webp new file mode 100644 index 00000000..cd4cb8b2 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/1/1/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/1/1/1.webp b/tests/readers/tile/fixtures/wm/terrarium2x/1/1/1.webp new file mode 100644 index 00000000..83249a9b Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/1/1/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/2/0/0.webp b/tests/readers/tile/fixtures/wm/terrarium2x/2/0/0.webp new file mode 100644 index 00000000..26d68da3 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/2/0/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/2/0/1.webp b/tests/readers/tile/fixtures/wm/terrarium2x/2/0/1.webp new file mode 100644 index 00000000..2d4e67f9 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/2/0/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/2/0/2.webp b/tests/readers/tile/fixtures/wm/terrarium2x/2/0/2.webp new file mode 100644 index 00000000..cda21834 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/2/0/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/2/0/3.webp b/tests/readers/tile/fixtures/wm/terrarium2x/2/0/3.webp new file mode 100644 index 00000000..c6715d8b Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/2/0/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/2/1/0.webp b/tests/readers/tile/fixtures/wm/terrarium2x/2/1/0.webp new file mode 100644 index 00000000..47df9286 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/2/1/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/2/1/1.webp b/tests/readers/tile/fixtures/wm/terrarium2x/2/1/1.webp new file mode 100644 index 00000000..f94ff0eb Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/2/1/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/2/1/2.webp b/tests/readers/tile/fixtures/wm/terrarium2x/2/1/2.webp new file mode 100644 index 00000000..c6ca90ca Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/2/1/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/2/1/3.webp b/tests/readers/tile/fixtures/wm/terrarium2x/2/1/3.webp new file mode 100644 index 00000000..3d9cae70 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/2/1/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/2/2/0.webp b/tests/readers/tile/fixtures/wm/terrarium2x/2/2/0.webp new file mode 100644 index 00000000..a842e008 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/2/2/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/2/2/1.webp b/tests/readers/tile/fixtures/wm/terrarium2x/2/2/1.webp new file mode 100644 index 00000000..8340a3dc Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/2/2/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/2/2/2.webp b/tests/readers/tile/fixtures/wm/terrarium2x/2/2/2.webp new file mode 100644 index 00000000..7b06cad3 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/2/2/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/2/2/3.webp b/tests/readers/tile/fixtures/wm/terrarium2x/2/2/3.webp new file mode 100644 index 00000000..05f9eb88 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/2/2/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/2/3/0.webp b/tests/readers/tile/fixtures/wm/terrarium2x/2/3/0.webp new file mode 100644 index 00000000..3b3394a9 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/2/3/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/2/3/1.webp b/tests/readers/tile/fixtures/wm/terrarium2x/2/3/1.webp new file mode 100644 index 00000000..bedf7731 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/2/3/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/2/3/2.webp b/tests/readers/tile/fixtures/wm/terrarium2x/2/3/2.webp new file mode 100644 index 00000000..d1bc09b5 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/2/3/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/2/3/3.webp b/tests/readers/tile/fixtures/wm/terrarium2x/2/3/3.webp new file mode 100644 index 00000000..668e9160 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/2/3/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/0/0.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/0/0.webp new file mode 100644 index 00000000..1543a88c Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/0/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/0/1.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/0/1.webp new file mode 100644 index 00000000..3ae68330 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/0/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/0/2.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/0/2.webp new file mode 100644 index 00000000..8edced71 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/0/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/0/3.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/0/3.webp new file mode 100644 index 00000000..bcf1cd8a Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/0/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/0/4.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/0/4.webp new file mode 100644 index 00000000..45c03a07 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/0/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/0/5.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/0/5.webp new file mode 100644 index 00000000..a9e4b319 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/0/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/0/6.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/0/6.webp new file mode 100644 index 00000000..ac43228b Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/0/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/0/7.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/0/7.webp new file mode 100644 index 00000000..ded6c676 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/0/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/1/0.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/1/0.webp new file mode 100644 index 00000000..5388dd0c Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/1/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/1/1.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/1/1.webp new file mode 100644 index 00000000..b684a48c Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/1/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/1/2.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/1/2.webp new file mode 100644 index 00000000..f8ca7f4e Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/1/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/1/3.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/1/3.webp new file mode 100644 index 00000000..64df2753 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/1/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/1/4.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/1/4.webp new file mode 100644 index 00000000..4ef17033 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/1/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/1/5.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/1/5.webp new file mode 100644 index 00000000..2b52eb6d Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/1/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/1/6.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/1/6.webp new file mode 100644 index 00000000..1a01e524 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/1/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/1/7.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/1/7.webp new file mode 100644 index 00000000..6eb3c62e Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/1/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/2/0.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/2/0.webp new file mode 100644 index 00000000..21eb3447 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/2/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/2/1.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/2/1.webp new file mode 100644 index 00000000..db97ad72 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/2/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/2/2.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/2/2.webp new file mode 100644 index 00000000..c30c8cce Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/2/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/2/3.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/2/3.webp new file mode 100644 index 00000000..e3e1bc74 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/2/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/2/4.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/2/4.webp new file mode 100644 index 00000000..6df02c68 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/2/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/2/5.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/2/5.webp new file mode 100644 index 00000000..71928420 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/2/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/2/6.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/2/6.webp new file mode 100644 index 00000000..571b1aaf Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/2/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/2/7.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/2/7.webp new file mode 100644 index 00000000..d57febc4 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/2/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/3/0.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/3/0.webp new file mode 100644 index 00000000..fe0d8d80 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/3/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/3/1.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/3/1.webp new file mode 100644 index 00000000..a5ec4544 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/3/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/3/2.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/3/2.webp new file mode 100644 index 00000000..713c6158 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/3/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/3/3.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/3/3.webp new file mode 100644 index 00000000..43485e23 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/3/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/3/4.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/3/4.webp new file mode 100644 index 00000000..6228703a Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/3/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/3/5.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/3/5.webp new file mode 100644 index 00000000..1d77e9cf Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/3/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/3/6.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/3/6.webp new file mode 100644 index 00000000..54b7649f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/3/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/3/7.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/3/7.webp new file mode 100644 index 00000000..c09661b5 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/3/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/4/0.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/4/0.webp new file mode 100644 index 00000000..4d5c400f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/4/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/4/1.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/4/1.webp new file mode 100644 index 00000000..15ad3940 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/4/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/4/2.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/4/2.webp new file mode 100644 index 00000000..cf3b3fc2 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/4/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/4/3.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/4/3.webp new file mode 100644 index 00000000..266e32a8 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/4/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/4/4.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/4/4.webp new file mode 100644 index 00000000..54cf7478 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/4/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/4/5.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/4/5.webp new file mode 100644 index 00000000..4963651c Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/4/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/4/6.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/4/6.webp new file mode 100644 index 00000000..b53f76e4 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/4/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/4/7.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/4/7.webp new file mode 100644 index 00000000..036300d6 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/4/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/5/0.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/5/0.webp new file mode 100644 index 00000000..4751f018 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/5/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/5/1.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/5/1.webp new file mode 100644 index 00000000..552b5217 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/5/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/5/2.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/5/2.webp new file mode 100644 index 00000000..3132ff5f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/5/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/5/3.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/5/3.webp new file mode 100644 index 00000000..99c4dddb Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/5/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/5/4.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/5/4.webp new file mode 100644 index 00000000..38545336 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/5/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/5/5.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/5/5.webp new file mode 100644 index 00000000..a16d0c3f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/5/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/5/6.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/5/6.webp new file mode 100644 index 00000000..1f4dfb07 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/5/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/5/7.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/5/7.webp new file mode 100644 index 00000000..1a9d145f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/5/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/6/0.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/6/0.webp new file mode 100644 index 00000000..444652cb Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/6/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/6/1.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/6/1.webp new file mode 100644 index 00000000..770fe34f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/6/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/6/2.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/6/2.webp new file mode 100644 index 00000000..dd7a200c Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/6/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/6/3.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/6/3.webp new file mode 100644 index 00000000..24f6e466 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/6/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/6/4.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/6/4.webp new file mode 100644 index 00000000..8fd197a6 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/6/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/6/5.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/6/5.webp new file mode 100644 index 00000000..9b5906b0 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/6/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/6/6.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/6/6.webp new file mode 100644 index 00000000..e20174a0 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/6/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/6/7.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/6/7.webp new file mode 100644 index 00000000..e3f61ebe Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/6/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/7/0.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/7/0.webp new file mode 100644 index 00000000..d28a4c7f Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/7/0.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/7/1.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/7/1.webp new file mode 100644 index 00000000..3295e82e Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/7/1.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/7/2.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/7/2.webp new file mode 100644 index 00000000..9d5303ef Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/7/2.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/7/3.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/7/3.webp new file mode 100644 index 00000000..425a00ef Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/7/3.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/7/4.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/7/4.webp new file mode 100644 index 00000000..195b85d0 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/7/4.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/7/5.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/7/5.webp new file mode 100644 index 00000000..9eb82604 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/7/5.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/7/6.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/7/6.webp new file mode 100644 index 00000000..c35389bc Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/7/6.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/3/7/7.webp b/tests/readers/tile/fixtures/wm/terrarium2x/3/7/7.webp new file mode 100644 index 00000000..ff8998e3 Binary files /dev/null and b/tests/readers/tile/fixtures/wm/terrarium2x/3/7/7.webp differ diff --git a/tests/readers/tile/fixtures/wm/terrarium2x/metadata.json b/tests/readers/tile/fixtures/wm/terrarium2x/metadata.json new file mode 100644 index 00000000..fa602e46 --- /dev/null +++ b/tests/readers/tile/fixtures/wm/terrarium2x/metadata.json @@ -0,0 +1,21 @@ +{ + "s2tilejson": "1.0.0", + "format": "webp", + "name": "Terrain-DEM", + "description": "height = (R * 256. + G + B / 256.) - 32768.", + "minzoom": 0, + "maxzoom": 3, + "scheme": "xyz", + "type": "raster", + "extension": "webp", + "encoding": "none", + "attributions": { + "Terrarium": "https://registry.opendata.aws/terrain-tiles/" + }, + "bounds": [ + -180, + -85, + 180, + 85 + ] +} diff --git a/tests/readers/tile/raster.test.ts b/tests/readers/tile/raster.test.ts new file mode 100644 index 00000000..75743a85 --- /dev/null +++ b/tests/readers/tile/raster.test.ts @@ -0,0 +1,410 @@ +import { buildServer } from '../../server'; +import { RasterTilesReader, S2PMTilesReader } from '../../../src'; +import { expect, test } from 'bun:test'; + +import { RasterTilesFileReader } from '../../../src/file'; + +test('read in wm satellite', async () => { + const server = buildServer(); + const reader = new RasterTilesReader( + `http://localhost:${server.port}/readers/tile/fixtures/wm/satellite`, + 1, + ); + + const metadata = await reader.getMetadata(); + expect(metadata).toEqual({ + // @ts-expect-error - ignore for now + bounds: [-180, -85, 180, 85], + encoding: 'none', + extension: 'webp', + format: 'zxy', + maxzoom: 3, + minzoom: 0, + name: 'Mapbox Satellite', + s2tilejson: '1.0.0', + scheme: 'xyz', + type: 'raster', + }); + + // has tile + expect(await reader.hasTile(0, 0, 0)).toEqual(true); + const tile = await reader.getTile(0, 0, 0); + expect(tile).toBeDefined(); + if (tile === undefined) throw Error('tile is undefined'); + const { image, zoom, x, y, tmsStyle } = tile; + expect(image.width).toEqual(512); + expect(image.height).toEqual(512); + expect(zoom).toEqual(0); + expect(x).toEqual(0); + expect(y).toEqual(0); + expect(tmsStyle).toEqual(false); + + const tileData = await Array.fromAsync(tile); + // @ts-expect-error - for testing + expect(tileData[0].geometry.coordinates.slice(0, 5)).toEqual([ + { + m: { a: 255, b: 28, g: 14, r: 8 }, + x: -179.6484375, + y: 84.88501329390853, + }, + { + m: { a: 255, b: 28, g: 14, r: 8 }, + x: -178.9453125, + y: 84.88501329390853, + }, + { + m: { a: 255, b: 28, g: 14, r: 8 }, + x: -178.2421875, + y: 84.88501329390853, + }, + { + m: { a: 255, b: 28, g: 14, r: 8 }, + x: -177.5390625, + y: 84.88501329390853, + }, + { + m: { a: 255, b: 28, g: 14, r: 8 }, + x: -176.8359375, + y: 84.88501329390853, + }, + ]); + // @ts-expect-error - for testing + expect(tileData[0].geometry.coordinates.slice(-5)).toEqual([ + { + m: { a: 255, b: 244, g: 239, r: 240 }, + x: 176.8359375, + y: -84.88501329390854, + }, + { + m: { a: 255, b: 253, g: 248, r: 249 }, + x: 177.5390625, + y: -84.88501329390854, + }, + { + m: { a: 255, b: 251, g: 246, r: 247 }, + x: 178.2421875, + y: -84.88501329390854, + }, + { + m: { a: 255, b: 255, g: 255, r: 255 }, + x: 178.9453125, + y: -84.88501329390854, + }, + { + m: { a: 255, b: 245, g: 240, r: 241 }, + x: 179.6484375, + y: -84.88501329390854, + }, + ]); + + const tiles = await Array.fromAsync(reader); + expect(tiles.length).toEqual(4); + + await server.stop(); +}); + +test('read in wm satellite file', async () => { + const server = buildServer(); + const reader = new RasterTilesFileReader(`${__dirname}/fixtures/wm/satellite`, 1); + + const metadata = await reader.getMetadata(); + expect(metadata).toEqual({ + // @ts-expect-error - ignore for now + bounds: [-180, -85, 180, 85], + encoding: 'none', + extension: 'webp', + format: 'zxy', + maxzoom: 3, + minzoom: 0, + name: 'Mapbox Satellite', + s2tilejson: '1.0.0', + scheme: 'xyz', + type: 'raster', + }); + + // has tile + expect(await reader.hasTile(0, 0, 0)).toEqual(true); + const tile = await reader.getTile(0, 0, 0); + expect(tile).toBeDefined(); + if (tile === undefined) throw Error('tile is undefined'); + const { image, zoom, x, y, tmsStyle } = tile; + expect(image.width).toEqual(512); + expect(image.height).toEqual(512); + expect(zoom).toEqual(0); + expect(x).toEqual(0); + expect(y).toEqual(0); + expect(tmsStyle).toEqual(false); + + const tiles = await Array.fromAsync(reader); + expect(tiles.length).toEqual(4); + + await server.stop(); +}); + +test('read in s2 modis-mini', async () => { + const server = buildServer(); + const reader = new RasterTilesReader( + `http://localhost:${server.port}/readers/tile/fixtures/s2/modis-mini`, + ); + + const metadata = await reader.getMetadata(); + expect(metadata).toEqual({ + attributions: { + MODIS: 'https://modis.gsfc.nasa.gov', + }, + description: 'NASA Modis Dataset Reprojected by S2 MAPS INC.', + encoding: 'none', + extension: 'webp', + faces: [0, 1, 2, 3, 4, 5], + facesbounds: { + '0': { + '0': [0, 0, 0, 0], + '1': [0, 0, 1, 1], + '2': [0, 0, 3, 3], + '3': [0, 0, 7, 7], + '4': [0, 0, 15, 15], + '5': [0, 0, 31, 31], + }, + '1': { + '0': [0, 0, 0, 0], + '1': [0, 0, 1, 1], + '2': [0, 0, 3, 3], + '3': [0, 0, 7, 7], + '4': [0, 0, 15, 15], + '5': [0, 0, 31, 31], + }, + '2': { + '0': [0, 0, 0, 0], + '1': [0, 0, 1, 1], + '2': [0, 0, 3, 3], + '3': [0, 0, 7, 7], + '4': [0, 0, 15, 15], + '5': [0, 0, 31, 31], + }, + '3': { + '0': [0, 0, 0, 0], + '1': [0, 0, 1, 1], + '2': [0, 0, 3, 3], + '3': [0, 0, 7, 7], + '4': [0, 0, 15, 15], + '5': [0, 0, 31, 31], + }, + '4': { + '0': [0, 0, 0, 0], + '1': [0, 0, 1, 1], + '2': [0, 0, 3, 3], + '3': [0, 0, 7, 7], + '4': [0, 0, 15, 15], + '5': [0, 0, 31, 31], + }, + '5': { + '0': [0, 0, 0, 0], + '1': [0, 0, 1, 1], + '2': [0, 0, 3, 3], + '3': [0, 0, 7, 7], + '4': [0, 0, 15, 15], + '5': [0, 0, 31, 31], + }, + }, + format: 's2', + layers: {}, + maxzoom: 1, + minzoom: 0, + name: 'Modis Raster Dataset', + s2tilejson: '1.0.0', + tilestats: { + '0': 1365, + '1': 1365, + '2': 1365, + '3': 1365, + '4': 1365, + '5': 1365, + total: 8190, + }, + scheme: 'fzxy', + type: 'raster', + // @ts-expect-error - just old spec + version: 1, + }); + + // has tile + expect(await reader.hasTileS2(0, 0, 0, 0)).toEqual(true); + const tile = await reader.getTileS2(0, 0, 0, 0); + expect(tile).toBeDefined(); + if (tile === undefined) throw Error('tile is undefined'); + const { image, face, zoom, x, y } = tile; + expect(image.width).toEqual(512); + expect(image.height).toEqual(512); + expect(face).toEqual(0); + expect(zoom).toEqual(0); + expect(x).toEqual(0); + expect(y).toEqual(0); + + const tiles = await Array.fromAsync(reader); + expect(tiles.length).toEqual(24); + + await server.stop(); +}); + +test('read in s2 modis-mini - file', async () => { + const server = buildServer(); + const reader = new RasterTilesFileReader(`${__dirname}/fixtures/s2/modis-mini`, 0); + + const metadata = await reader.getMetadata(); + expect(metadata).toEqual({ + attributions: { + MODIS: 'https://modis.gsfc.nasa.gov', + }, + description: 'NASA Modis Dataset Reprojected by S2 MAPS INC.', + encoding: 'none', + extension: 'webp', + faces: [0, 1, 2, 3, 4, 5], + facesbounds: { + '0': { + '0': [0, 0, 0, 0], + '1': [0, 0, 1, 1], + '2': [0, 0, 3, 3], + '3': [0, 0, 7, 7], + '4': [0, 0, 15, 15], + '5': [0, 0, 31, 31], + }, + '1': { + '0': [0, 0, 0, 0], + '1': [0, 0, 1, 1], + '2': [0, 0, 3, 3], + '3': [0, 0, 7, 7], + '4': [0, 0, 15, 15], + '5': [0, 0, 31, 31], + }, + '2': { + '0': [0, 0, 0, 0], + '1': [0, 0, 1, 1], + '2': [0, 0, 3, 3], + '3': [0, 0, 7, 7], + '4': [0, 0, 15, 15], + '5': [0, 0, 31, 31], + }, + '3': { + '0': [0, 0, 0, 0], + '1': [0, 0, 1, 1], + '2': [0, 0, 3, 3], + '3': [0, 0, 7, 7], + '4': [0, 0, 15, 15], + '5': [0, 0, 31, 31], + }, + '4': { + '0': [0, 0, 0, 0], + '1': [0, 0, 1, 1], + '2': [0, 0, 3, 3], + '3': [0, 0, 7, 7], + '4': [0, 0, 15, 15], + '5': [0, 0, 31, 31], + }, + '5': { + '0': [0, 0, 0, 0], + '1': [0, 0, 1, 1], + '2': [0, 0, 3, 3], + '3': [0, 0, 7, 7], + '4': [0, 0, 15, 15], + '5': [0, 0, 31, 31], + }, + }, + format: 's2', + layers: {}, + maxzoom: 1, + minzoom: 0, + name: 'Modis Raster Dataset', + s2tilejson: '1.0.0', + tilestats: { + '0': 1365, + '1': 1365, + '2': 1365, + '3': 1365, + '4': 1365, + '5': 1365, + total: 8190, + }, + scheme: 'fzxy', + type: 'raster', + // @ts-expect-error - just old spec + version: 1, + }); + + // has tile + expect(await reader.hasTileS2(0, 0, 0, 0)).toEqual(true); + const tile = await reader.getTileS2(0, 0, 0, 0); + expect(tile).toBeDefined(); + if (tile === undefined) throw Error('tile is undefined'); + const { image, face, zoom, x, y } = tile; + expect(image.width).toEqual(512); + expect(image.height).toEqual(512); + expect(face).toEqual(0); + expect(zoom).toEqual(0); + expect(x).toEqual(0); + expect(y).toEqual(0); + + const tiles = await Array.fromAsync(reader); + expect(tiles.length).toEqual(6); + + await server.stop(); +}); + +test('read in pmtiles s2', async () => { + const pmtiles = new S2PMTilesReader( + await Bun.file(`${__dirname}/../pmtiles/fixtures/s2.s2pmtiles`).arrayBuffer(), + ); + const reader = new RasterTilesReader(pmtiles); + + const metadata = await reader.getMetadata(); + // @ts-expect-error - just for testing + expect(metadata).toEqual({ metadata: true }); + expect(await reader.hasTileS2(0, 0, 0, 0)).toEqual(true); + + // TODO: We need a pmtiles using S2 that has raster data in it. + // const tile = await reader.getTileS2(0, 0, 0, 0); + // console.log(tile); +}); + +test('read in pmtiles wm', async () => { + const pmtiles = new S2PMTilesReader( + await Bun.file(`${__dirname}/../pmtiles/fixtures/test_fixture_1.pmtiles`).arrayBuffer(), + ); + const reader = new RasterTilesReader(pmtiles); + + const metadata = await reader.getMetadata(); + expect(metadata).toEqual({ + description: 'test_fixture_1.pmtiles', + generator: 'tippecanoe v2.5.0', + generator_options: './tippecanoe -zg -o test_fixture_1.pmtiles --force', + name: 'test_fixture_1.pmtiles', + tilestats: { + // @ts-expect-error - just for testing + layerCount: 1, + layers: [ + { + attributeCount: 0, + attributes: [], + count: 1, + geometry: 'Polygon', + layer: 'test_fixture_1pmtiles', + }, + ], + }, + type: 'overlay', + vector_layers: [ + { + description: '', + fields: {}, + id: 'test_fixture_1pmtiles', + maxzoom: 0, + minzoom: 0, + }, + ], + version: '2', + }); + expect(await reader.hasTile(0, 0, 0)).toEqual(true); + + // TODO: We need a pmtiles using WM that has raster data in it. + // const tile = await reader.getTileS2(0, 0, 0, 0); + // console.log(tile); +}); diff --git a/tests/readers/xml/parsering.test.ts b/tests/readers/xml/parsering.test.ts index f3447e14..41fe1903 100644 --- a/tests/readers/xml/parsering.test.ts +++ b/tests/readers/xml/parsering.test.ts @@ -1,14 +1,14 @@ import { - countSubstring, - findTagByName, - findTagByPath, - findTagsByName, - findTagsByPath, - getAttribute, - indexOfMatch, - indexOfMatchEnd, - removeComments, - removeTagsByName, + xmlCountSubstring, + xmlFindTagByName, + xmlFindTagByPath, + xmlFindTagsByName, + xmlFindTagsByPath, + xmlGetAttribute, + xmlIndexOfMatch, + xmlIndexOfMatchEnd, + xmlRemoveComments, + xmlRemoveTagsByName, } from '../../../src/readers/xml/parsing'; import { beforeAll, expect, test } from 'bun:test'; @@ -51,97 +51,97 @@ id="container" `; test('tmx', () => { - expect(getAttribute(tmx, 'version')).toEqual('1.4'); - const header: XMLTag = findTagByName(tmx, 'header') ?? { + expect(xmlGetAttribute(tmx, 'version')).toEqual('1.4'); + const header: XMLTag = xmlFindTagByName(tmx, 'header') ?? { inner: '', outer: '', start: 0, end: 0, }; - expect(getAttribute(header, 'srclang')).toEqual('en'); - expect(getAttribute(header, 'o-tmf')).toEqual('ABCTransMem'); - const tu = findTagByName(tmx, 'tu', { debug: false }); + expect(xmlGetAttribute(header, 'srclang')).toEqual('en'); + expect(xmlGetAttribute(header, 'o-tmf')).toEqual('ABCTransMem'); + const tu = xmlFindTagByName(tmx, 'tu', { debug: false }); expect((tu?.inner ?? '').trim()).toEqual( '\n Hello world!\n \n \n Bonjour tout le monde!\n ', ); - const tuvs = findTagsByName(tmx, 'tuv'); + const tuvs = xmlFindTagsByName(tmx, 'tuv'); expect(tuvs.length).toEqual(2); }); test('svg', () => { - const tag: XMLTag = findTagByName(svg, 'svg') ?? { inner: '', outer: '', start: 0, end: 0 }; - expect(getAttribute(tag, 'height')).toEqual('391'); - expect(getAttribute(tag, 'width')).toEqual('391'); - expect(getAttribute(tag, 'viewBox')).toEqual('-70.5 -70.5 391 391'); - expect(getAttribute(tag, 'xmlns:xlink')).toEqual('http://www.w3.org/1999/xlink'); - expect(getAttribute(findTagByPath(svg, ['g']) ?? '', 'opacity')).toEqual('0.8'); - expect(getAttribute(findTagByName(svg, 'rect') ?? '', 'fill')).toEqual('#fff'); - const rect = findTagByPath(svg, ['g', 'rect'])?.outer; - expect(getAttribute(rect ?? '', 'x')).toEqual('25'); - expect(getAttribute(rect ?? '', 'stroke-width')).toEqual('4'); + const tag: XMLTag = xmlFindTagByName(svg, 'svg') ?? { inner: '', outer: '', start: 0, end: 0 }; + expect(xmlGetAttribute(tag, 'height')).toEqual('391'); + expect(xmlGetAttribute(tag, 'width')).toEqual('391'); + expect(xmlGetAttribute(tag, 'viewBox')).toEqual('-70.5 -70.5 391 391'); + expect(xmlGetAttribute(tag, 'xmlns:xlink')).toEqual('http://www.w3.org/1999/xlink'); + expect(xmlGetAttribute(xmlFindTagByPath(svg, ['g']) ?? '', 'opacity')).toEqual('0.8'); + expect(xmlGetAttribute(xmlFindTagByName(svg, 'rect') ?? '', 'fill')).toEqual('#fff'); + const rect = xmlFindTagByPath(svg, ['g', 'rect'])?.outer; + expect(xmlGetAttribute(rect ?? '', 'x')).toEqual('25'); + expect(xmlGetAttribute(rect ?? '', 'stroke-width')).toEqual('4'); }); test('support multi-line tags', () => { - const container = findTagByName(multiline, 'div'); + const container = xmlFindTagByName(multiline, 'div'); expect(container?.outer).toEqual( `\n \n`, ); expect(container?.inner).toEqual(`\n \n`); - expect(getAttribute(container?.outer ?? '', 'id')).toEqual('container'); - expect(getAttribute(container?.outer ?? '', 'data-foo')).toBeUndefined(); - expect(getAttribute((container?.inner ?? '').trim(), 'data-foo', { debug: false })).toEqual( + expect(xmlGetAttribute(container?.outer ?? '', 'id')).toEqual('container'); + expect(xmlGetAttribute(container?.outer ?? '', 'data-foo')).toBeUndefined(); + expect(xmlGetAttribute((container?.inner ?? '').trim(), 'data-foo', { debug: false })).toEqual( 'bar', ); }); test('should get gmd:code and avoid gmd:codeSpace', () => { - const index = indexOfMatch(iso, `]`, 0); + const index = xmlIndexOfMatch(iso, `]`, 0); expect(iso.slice(index).startsWith(' { +test('xmlIndexOfMatchEnd', () => { const xml = ``; - const index = indexOfMatchEnd(xml, '[ /]items>', 0); + const index = xmlIndexOfMatchEnd(xml, '[ /]items>', 0); expect(index).toEqual(xml.length - 1); }); test('removing comments', () => { - expect(removeComments(commented)).toEqual('\n\n\n'); - expect(removeComments('')).toEqual(''); + expect(xmlRemoveComments(commented)).toEqual('\n\n\n'); + expect(xmlRemoveComments('')).toEqual(''); }); test('count substring', () => { - expect(countSubstring(nested, '')).toEqual(3); + expect(xmlCountSubstring(nested, '')).toEqual(3); }); test('should find all the urls in iso.xml', () => { - const urls = findTagsByName(iso, 'gmd:URL'); + const urls = xmlFindTagsByName(iso, 'gmd:URL'); expect(urls[0].inner).toEqual('http://geomap.arpa.veneto.it/layers/geonode%3Aatlanteil'); expect(urls.length).toEqual(29); }); test('should get only tags with full string match on tag name', () => { - const urls = findTagsByName(iso, 'gmd:code'); + const urls = xmlFindTagsByName(iso, 'gmd:code'); expect(urls.length).toEqual(1); }); test('should get info from iso.xml file', () => { - const tag = findTagByPath(iso, ['gmd:RS_Identifier', 'gmd:code', 'gco:CharacterString']); + const tag = xmlFindTagByPath(iso, ['gmd:RS_Identifier', 'gmd:code', 'gco:CharacterString']); const projection = parseInt(tag!.inner!); expect(projection).toEqual(4326); - const longitude = Number(findTagByPath(iso, ['gmd:westBoundLongitude', 'gco:Decimal'])!.inner); + const longitude = Number(xmlFindTagByPath(iso, ['gmd:westBoundLongitude', 'gco:Decimal'])!.inner); expect(longitude).toEqual(10.2822923743907); }); test('should get raster size from a .mrf file', () => { - const rasterSize = findTagByPath(mrf, ['MRF_META', 'Raster', 'Size'], { + const rasterSize = xmlFindTagByPath(mrf, ['MRF_META', 'Raster', 'Size'], { debug: false, })!; expect(rasterSize?.outer).toEqual(''); @@ -149,48 +149,48 @@ test('should get raster size from a .mrf file', () => { }); test('should get all character strings', () => { - const tags = findTagsByPath(iso, ['gmd:RS_Identifier', 'gmd:code']); + const tags = xmlFindTagsByPath(iso, ['gmd:RS_Identifier', 'gmd:code']); expect(tags.length).toEqual(1); expect(tags[0]?.inner === '').toEqual(false); }); test('should get all metadata for bands from .tif.aux.xml', () => { const debug = false; - const mdis = findTagsByPath(tiffAux, ['Metadata', 'MDI'], { debug }); + const mdis = xmlFindTagsByPath(tiffAux, ['Metadata', 'MDI'], { debug }); expect(mdis.length).toEqual(15); }); test('should get attributes from metadata', () => { - const mdi = findTagByPath(tiffAux, ['Metadata', 'MDI'], { debug: false }); - const key = getAttribute(mdi!, 'key', { debug: false }); + const mdi = xmlFindTagByPath(tiffAux, ['Metadata', 'MDI'], { debug: false }); + const key = xmlGetAttribute(mdi!, 'key', { debug: false }); expect(key).toEqual('SourceBandIndex'); }); test('should get raster width from a .mrf file', () => { const rasterSize = ''; - expect(getAttribute(rasterSize, 'x')).toEqual('6638'); - expect(getAttribute(rasterSize, 'y')).toEqual('7587'); - expect(getAttribute(rasterSize, 'c')).toEqual('4'); + expect(xmlGetAttribute(rasterSize, 'x')).toEqual('6638'); + expect(xmlGetAttribute(rasterSize, 'y')).toEqual('7587'); + expect(xmlGetAttribute(rasterSize, 'c')).toEqual('4'); }); test('should get first tag', () => { const xml = ` `; - const tag = findTagByName(xml, 'field', { debug: false })!; + const tag = xmlFindTagByName(xml, 'field', { debug: false })!; expect(tag.outer).toEqual(``); - const tag2 = findTagByName(xml, 'field', { debug: false, nested: false })!; + const tag2 = xmlFindTagByName(xml, 'field', { debug: false, nested: false })!; expect(tag2.outer).toEqual(``); }); test('should get all tags (self-closing and not)', () => { const xml = ` `; - const tags = findTagsByName(xml, 'field', { debug: false }); + const tags = xmlFindTagsByName(xml, 'field', { debug: false }); expect(tags.length).toEqual(5); }); test('should get self-closing with immediate close and without interior space', () => { const xml = ``; - const tag = findTagByName(xml, 'Kitchen')!; + const tag = xmlFindTagByName(xml, 'Kitchen')!; expect(tag.outer).toEqual(''); expect(tag.inner).toEqual(null); }); @@ -198,45 +198,45 @@ test('should get self-closing with immediate close and without interior space', test('should handle nested tags', () => { const xml = `AB`; - expect(findTagByName(xml, 'Thing')!.outer).toEqual(xml); - expect(findTagByName(xml, 'Thing')!.outer).toEqual(xml); + expect(xmlFindTagByName(xml, 'Thing')!.outer).toEqual(xml); + expect(xmlFindTagByName(xml, 'Thing')!.outer).toEqual(xml); - expect(findTagsByName(xml, 'Thing').length).toEqual(3); - expect(findTagsByName(xml, 'Thing')[0].outer).toEqual(xml); - expect(findTagsByName(xml, 'Thing', { nested: true }).length).toEqual(3); - expect(findTagsByName(xml, 'Thing', { nested: true })[0].outer).toEqual(xml); - expect(findTagsByName(xml, 'Thing', { nested: false }).length).toEqual(1); - expect(findTagsByName(xml, 'Thing', { nested: false })[0].outer).toEqual(xml); + expect(xmlFindTagsByName(xml, 'Thing').length).toEqual(3); + expect(xmlFindTagsByName(xml, 'Thing')[0].outer).toEqual(xml); + expect(xmlFindTagsByName(xml, 'Thing', { nested: true }).length).toEqual(3); + expect(xmlFindTagsByName(xml, 'Thing', { nested: true })[0].outer).toEqual(xml); + expect(xmlFindTagsByName(xml, 'Thing', { nested: false }).length).toEqual(1); + expect(xmlFindTagsByName(xml, 'Thing', { nested: false })[0].outer).toEqual(xml); - expect(findTagsByPath(xml, ['Thing']).length).toEqual(1); - expect(findTagsByPath(xml, ['Thing'])[0].outer).toEqual(xml); - expect(findTagsByPath(xml, ['Thing', 'Thing'])).toEqual([ + expect(xmlFindTagsByPath(xml, ['Thing']).length).toEqual(1); + expect(xmlFindTagsByPath(xml, ['Thing'])[0].outer).toEqual(xml); + expect(xmlFindTagsByPath(xml, ['Thing', 'Thing'])).toEqual([ { inner: 'A', outer: 'A', start: 7, end: 28 }, { inner: 'B', outer: 'B', start: 28, end: 49 }, ]); - expect(findTagByPath(xml, ['Thing'])!.outer).toEqual(xml); + expect(xmlFindTagByPath(xml, ['Thing'])!.outer).toEqual(xml); }); -test('removeTagsByName', () => { - expect(removeTagsByName('
  • A
  • B
', 'li')).toEqual('
    '); +test('xmlRemoveTagsByName', () => { + expect(xmlRemoveTagsByName('
    • A
    • B
    ', 'li')).toEqual('
      '); }); -test('check immutability of findTagsByPath', () => { +test('check immutability of xmlFindTagsByPath', () => { const path = ['gmd:RS_Identifier', 'gmd:code'] as const; - const tags = findTagsByPath(iso, path); + const tags = xmlFindTagsByPath(iso, path); expect(tags.length).toEqual(1); expect(tags[0].inner === '').toEqual(false); expect(path.length).toEqual(2); }); -test('simple check findTagsByPath with index', () => { +test('simple check xmlFindTagsByPath with index', () => { const xml = 'ABCD'; - const tags = findTagsByPath(xml, [{ name: 'tag', index: 2 }]); + const tags = xmlFindTagsByPath(xml, [{ name: 'tag', index: 2 }]); expect(tags).toEqual([{ outer: 'C', inner: 'C', start: 24, end: 36 }]); }); -test('findTagsByPath with larger source', () => { - const tags = findTagsByPath(iso, [ +test('xmlFindTagsByPath with larger source', () => { + const tags = xmlFindTagsByPath(iso, [ 'gmd:MD_DigitalTransferOptions', { name: 'gmd:onLine', index: 10 }, 'gmd:CI_OnlineResource', @@ -254,7 +254,7 @@ test('findTagsByPath with larger source', () => { ]); }); -test('check findTagsByPath with index (multi-level)', () => { +test('check xmlFindTagsByPath with index (multi-level)', () => { const xml = ` @@ -267,15 +267,15 @@ test('check findTagsByPath with index (multi-level)', () => { `; - expect(findTagsByPath(xml, [{ name: 'tag', index: 2 }])).toEqual([ + expect(xmlFindTagsByPath(xml, [{ name: 'tag', index: 2 }])).toEqual([ { inner: 'C', outer: 'C', start: 89, end: 101 }, ]); expect( - findTagsByPath(xml, ['outer', { name: 'pair', index: 1 }, { name: 'tag', index: 0 }]), + xmlFindTagsByPath(xml, ['outer', { name: 'pair', index: 1 }, { name: 'tag', index: 0 }]), ).toEqual([{ inner: 'C', outer: 'C', start: 89, end: 101 }]); expect( - findTagsByPath(xml, ['outer', { name: 'pair', index: 1 }, { name: 'tag', index: 1 }]), + xmlFindTagsByPath(xml, ['outer', { name: 'pair', index: 1 }, { name: 'tag', index: 1 }]), ).toEqual([{ inner: 'D', outer: 'D', start: 108, end: 120 }]); }); diff --git a/tests/tools/polylabel.test.ts b/tests/tools/polylabel.test.ts index 64fa3a27..43a60969 100644 --- a/tests/tools/polylabel.test.ts +++ b/tests/tools/polylabel.test.ts @@ -1,5 +1,5 @@ -import { polylabel } from '../../src'; import { expect, test } from 'bun:test'; +import { polylabel, polylabels } from '../../src'; import type { Polygon, VectorPolygon } from '../../src/geometry'; @@ -21,6 +21,28 @@ test('finds pole of inaccessibility for water1 and precision 1', async () => { }); }); +test('finds pole of inaccessibility for water1 and precision 1 as a collection', async () => { + const water1: Polygon = await Bun.file(`${__dirname}/fixtures/water1.json`).json(); + const vectorWater1 = convertGeometry(water1); + const polylabelHighPrecision = polylabels([vectorWater1], 1); + expect(polylabelHighPrecision).toEqual([ + { + x: 3865.85009765625, + y: 2124.87841796875, + m: { distance: 288.8493574779127 }, + }, + ]); + + const polylabelLowPrecision = polylabels([vectorWater1], 50); + expect(polylabelLowPrecision).toEqual([ + { + x: 3854.296875, + y: 2123.828125, + m: { distance: 278.5795872381558 }, + }, + ]); +}); + test('finds pole of inaccessibility for water2 and default precision 1', async () => { const water2: Polygon = await Bun.file(`${__dirname}/fixtures/water2.json`).json(); const vectorWater2 = convertGeometry(water2); diff --git a/tests/util/gzip.test.ts b/tests/util/gzip.test.ts index 08892db3..5cdcefea 100644 --- a/tests/util/gzip.test.ts +++ b/tests/util/gzip.test.ts @@ -1,4 +1,4 @@ -import { iterItems } from '../../src/util/gzip'; +import { compressStream, decompressStream, iterItems } from '../../src/util/gzip'; import { expect, test } from 'bun:test'; test('iter', async () => { @@ -24,3 +24,16 @@ test('decompressStream', async () => { const file = await items[0].read(); expect(new TextDecoder().decode(file)).toEqual('Hello!\n'); }); + +test('compressStream', async () => { + const data = new TextEncoder().encode('Hello!\n'); + const compressed = await compressStream(data); + expect(compressed).toEqual( + new Uint8Array([ + 31, 139, 8, 0, 0, 0, 0, 0, 0, 19, 243, 72, 205, 201, 201, 87, 228, 2, 0, 158, 216, 66, 176, 7, + 0, 0, 0, + ]), + ); + const decompressed = await decompressStream(compressed); + expect(new TextDecoder().decode(decompressed)).toEqual('Hello!\n'); +}); diff --git a/tests/util/polyfills/image.test.ts b/tests/util/polyfills/image.test.ts index d1ce1a37..7e941629 100644 --- a/tests/util/polyfills/image.test.ts +++ b/tests/util/polyfills/image.test.ts @@ -29,6 +29,7 @@ test('createImageBitmap', async () => { const imageData = ctx.getImageData(0, 0, imageBitmap.width, imageBitmap.height); expect(imageData.data).toEqual(new Uint8ClampedArray(rgbImage)); + // just pull out red and green: const sliceData = ctx.getImageData(0, 0, 2, 1); expect(sliceData.data).toEqual(new Uint8ClampedArray([255, 0, 0, 255, 0, 255, 0, 255])); }); diff --git a/tests/writers/pmtiles/writer.test.ts b/tests/writers/pmtiles/writer.test.ts index 32fb9a5a..abbbf527 100644 --- a/tests/writers/pmtiles/writer.test.ts +++ b/tests/writers/pmtiles/writer.test.ts @@ -1,6 +1,11 @@ -import { TileType } from '../../../src/readers/pmtiles'; import tmp from 'tmp'; -import { BufferReader, BufferWriter, S2PMTilesReader, S2PMTilesWriter } from '../../../src'; +import { + BufferReader, + BufferWriter, + S2PMTilesReader, + S2PMTilesWriter, + TileType, +} from '../../../src'; import { FileReader, FileWriter } from '../../../src/file'; import { expect, test } from 'bun:test'; @@ -24,9 +29,9 @@ test('File Writer WM', async () => { const buf2 = Buffer.from(str2, 'utf8'); const uint8_2 = new Uint8Array(buf2.buffer, buf2.byteOffset, buf2.byteLength); // write data in tile - await writer.writeTileXYZ(0, 0, 0, uint8); - await writer.writeTileXYZ(1, 0, 1, uint8); - await writer.writeTileXYZ(5, 2, 9, uint8_2); + await writer.writeTileWM(0, 0, 0, uint8); + await writer.writeTileWM(1, 0, 1, uint8); + await writer.writeTileWM(5, 2, 9, uint8_2); // finish await writer.commit({ metadata: true } as unknown as Metadata); @@ -71,12 +76,11 @@ test('File Writer S2', async () => { const tmpFile1 = tmp.tmpNameSync({ prefix: 'S2' }); const writer = new S2PMTilesWriter(new FileWriter(tmpFile1), TileType.Pbf); // setup data + const txtEncoder = new TextEncoder(); const str = 'hello world'; - const buf = Buffer.from(str, 'utf8'); - const uint8 = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength); + const uint8 = txtEncoder.encode(str); const str2 = 'hello world 2'; - const buf2 = Buffer.from(str2, 'utf8'); - const uint8_2 = new Uint8Array(buf2.buffer, buf2.byteOffset, buf2.byteLength); + const uint8_2 = txtEncoder.encode(str2); // write data in tile await writer.writeTileS2(0, 0, 0, 0, uint8); await writer.writeTileS2(1, 0, 0, 0, uint8); @@ -166,7 +170,7 @@ testFunc( const str = `${zoom}-${x}-${y}`; const buf = Buffer.from(str, 'utf8'); const uint8 = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength); - await writer.writeTileXYZ(zoom, x, y, uint8); + await writer.writeTileWM(zoom, x, y, uint8); } } } diff --git a/tools/buildBundles.ts b/tools/buildBundles.ts index 56886b70..02c38087 100644 --- a/tools/buildBundles.ts +++ b/tools/buildBundles.ts @@ -60,6 +60,7 @@ await build({ `${__dirname}/builds/readers/pmtiles.ts`, `${__dirname}/builds/readers/protobuf.ts`, `${__dirname}/builds/readers/shapefile.ts`, + `${__dirname}/builds/readers/tile.ts`, `${__dirname}/builds/readers/wkt.ts`, // SPACE `${__dirname}/builds/space/sat.ts`, diff --git a/tools/builds/geometry/planets.ts b/tools/builds/geometry/planets.ts index 948adabf..fe7c9e67 100644 --- a/tools/builds/geometry/planets.ts +++ b/tools/builds/geometry/planets.ts @@ -1 +1 @@ -export * from '../../../src/geometry/planets'; +export * from '../../../src/space/planets'; diff --git a/tools/builds/readers/tile.ts b/tools/builds/readers/tile.ts new file mode 100644 index 00000000..abc8f10a --- /dev/null +++ b/tools/builds/readers/tile.ts @@ -0,0 +1 @@ +export * from '../../../src/readers/tile';