Неверные координаты в 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")
        )
)

Я попытался установить center и bounds VectorSource, найденные в метаданных mbtiles, но это ничего не изменило.


person Jukurrpa    schedule 19.10.2017    source источник


Ответы (1)


Итак, я изучил существующие реализации сервера, и оказалось, что смещение связано с тем, что mbtiles хранятся в формате TMS, в котором координата Y переворачивается. Итак, нам просто нужно преобразовать Y из формата XYZ, чтобы получить правильную плитку:

Из собственной реализации узла Mapbox:

// Flip Y coordinate because MBTiles files are TMS.
y = (1 << z) - 1 - y;

1 << z — это количество строк для заданного уровня масштабирования, или два в степени z.

Дополнительную информацию о XYZ и TMS также можно найти здесь.

person Jukurrpa    schedule 19.10.2017