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

Juk*_*rpa 1 mapbox mbtiles tippecanoe

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

然后我尝试使用 Go 中的一个非常基本的 HTTP 服务器来自托管这些图块。图块从 SQLite 转移到 PostgreSQL 数据库(原因是 Go + PSQL 是应用程序的现有堆栈)。

由于某种原因,这些功能会根据缩放级别而变化。在级别 1 上,本应位于美国的数据位于南极洲,在缩放级别 2 上,数据位于智利海岸附近,等等。唯一正常工作的是级别 0,因为只有一个图块。

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

除了使用 z/x/y 在数据库中查找 mbtile 之外,还需要对它们执行其他操作吗?或者也许需要在应用程序端配置一些东西?

服务器代码:

row := db.QueryRow(`
    SELECT tile_data FROM tiles
    WHERE
        zoom_level = $1
        AND tile_column = $2
        AND tile_row = $3
    `,
    z, x, y,
)
Run Code Online (Sandbox Code Playgroud)

在安卓上:

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

我尝试设置并在VectorSource元数据中找到,但它没有改变任何内容。centerboundsmbtiles

Juk*_*rpa 6

因此,我研究了现有的服务器实现,结果发现偏移是因为 mbtiles 以 TMS 格式存储,其中 Y 坐标被翻转。因此,我们只需将 XYZ 格式转换为 Y 即可获得正确的图块:

来自 Mapbox 自己的Node 实现

// Flip Y coordinate because MBTiles files are TMS.
y = (1 << z) - 1 - y;
Run Code Online (Sandbox Code Playgroud)

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

有关 XYZ 与 TMS 的更多信息也可以在此处找到。