Неправильные координаты в 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 также можно найти здесь.

Другие вопросы по тегам