Неправильные координаты в mbtiles, созданные с помощью Tippecanoe
Я сгенерировал mbtiles
файл с помощью Tippecanoe с просто -zg
а также --drop-densest-as-needed
в качестве дополнительных параметров. Я загрузил файл в Mapbox Studio, и все работает хорошо, как в Studio, так и при загрузке плиток через мобильное приложение.
Затем я попытал счастья в самостоятельном размещении плиток, используя очень простой HTTP-сервер в Go. Плитки были перенесены из SQLite в базу данных PostgreSQL (причина этого в том, что Go + PSQL - это существующий стек для приложения).
По некоторым причинам функции смещены в зависимости от уровня масштабирования. На уровне 1 данные, которые должны быть в США, находятся в Антарктике, на уровне масштабирования 2 - у побережья Чили и т. Д. Единственно правильно работающий уровень - это уровень 0, так как есть только одна плитка.
Я проверил, какие листы запрашивал Mapbox, когда в Сан-Франциско для уровня масштабирования 11: столбец 327, строка 791. Не существует плитки для этой комбинации строки / столбца в .mbtiles
файл, хотя там есть данные.
Есть ли что-то, что нужно сделать с mbtiles, кроме поиска их в базе данных с помощью z/x/y? Или, может быть, вещи для настройки на стороне приложения?
Код сервера:
row := db.QueryRow(`
SELECT tile_data FROM tiles
WHERE
zoom_level = $1
AND tile_column = $2
AND tile_row = $3
`,
z, x, y,
)
На Android:
map.addSource(
VectorSource(
"tiles",
TileSet("2.2.0", "http://my.local.server:4000/tiles/{z}/{x}/{y}.mvt?key=2448A697EACDDC41432AAD9A1833E")
)
)
Я пытался установить VectorSource
"s center
а также bounds
найдено в mbtiles
метаданные, но это ничего не изменило.
1 ответ
Итак, я посмотрел на существующие реализации сервера, и оказалось, что смещение связано с тем, что mbtile хранятся в формате TMS, в котором перевернута координата Y. Так что нам просто нужно конвертировать Y из формата XYZ, чтобы получить правильную плитку:
Из собственной реализации Node Mapbox:
// Flip Y coordinate because MBTiles files are TMS.
y = (1 << z) - 1 - y;
1 << z
это число строк для данного уровня масштабирования, или два в степени z.
Более подробную информацию о XYZ против TMS также можно найти здесь.