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

时间:2017-10-19 02:42:49

标签: mapbox mbtiles tippecanoe

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

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

由于某种原因,功能会根据缩放级别而移动。在1级,应该在美国的数据是在南极,在缩放级别2,它在智利海岸附近等。唯一正常工作的是0级,因为那里&#39 ;只有一块瓷砖。

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

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

服务器代码:

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元数据中找到的center boundsmbtiles,但它没有改变任何内容。

1 个答案:

答案 0 :(得分:3)

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

来自Mapbox自己的Node implementation

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

1 << z是给定缩放级别的行数,或者是z的幂的两行。

有关XYZ vs TMS的更多信息,请访问here