使用 Tippecanoe 生成的 mbtiles 中的坐标不正确

Incorrect coordinates in mbtiles generated with Tippecanoe

我使用 Tippecanoe 生成了一个 mbtiles 文件,仅将 -zg--drop-densest-as-needed 作为额外参数。我将文件上传到 Mapbox Studio,一切正常,无论是在 Studio 中还是通过移动应用程序加载图块时。

然后,我尝试使用 Go 中非常基本的 HTTP 服务器自行托管磁贴。 Tiles 从 SQLite 转移到 PostgreSQL 数据库(原因是 Go + PSQL 是应用程序的现有堆栈)。

由于某些原因,功能会根据缩放级别进行移动。在第 1 级,应该在美国的数据在南极,在缩放级别 2 它在智利海岸外,等等。唯一正常工作的是 0 级,因为只有一个图块。

我检查了在旧金山缩放级别 11 时 Mapbox 请求的图块:第 327 列,第 791 行。.mbtiles 文件中不存在此 row/col 组合的图块,尽管那里有数据.

除了使用 z/x/y 在数据库中查找 mbtiles 之外,是否还有其他事情要做?或者可能需要在应用程序端进行配置?

服务器代码:

row := db.QueryRow(`
    SELECT tile_data FROM tiles
    WHERE
        zoom_level = 
        AND tile_column = 
        AND tile_row = 
    `,
    z, x, y,
)

在 Android:

map.addSource(
        VectorSource(
                "tiles",
                TileSet("2.2.0", "http://my.local.server:4000/tiles/{z}/{x}/{y}.mvt?key=2448A697EACDDC41432AAD9A1833E")
        )
)

我尝试设置在 mbtiles 元数据中找到的 VectorSourcecenterbounds,但没有任何改变。

所以我查看了现有的服务器实现,结果发现偏移量是因为 mbtiles 以 TMS 格式存储,其中 Y 坐标被翻转。所以我们只需要将 Y 从 XYZ 格式转换为正确的图块:

来自 Mapbox 自己的 Node implementation:

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

1 << z 是给定缩放级别的行数,或 z 的 2 次方。

还可以找到有关 XYZ 与 TMS 的更多信息here