我正在使用 Mapbox 矢量切片从后端进程收集特定数据。 在示例中,他们提供了曼哈顿图块的链接:
http://a.tiles.mapbox.com/v3/examples.map-zr0njcqy/14/4823/6160.png
是图块 z/x/y 坐标 14/4823/6160
通过导航地图,我知道纬度 40.706119 和经度 -74.017554 的位置位于该图块内。
我还从地图如何工作中推断出,使用缩放 14 时,整个地图由 16384 x 16384 个图块组成,即左上角图块 14/0/0。
然而,将 180 度纬度和 360 度经度与总图块列数和行数计算得出 14/7464/4486,这不是同一个图块。 (除非我没做对?)
问题
如何获取知道纬度和经度的图块坐标?
在mapbox-studio源代码中挖掘我发现了这个小辅助对象:
可以这样使用:
> var a = new SphericalMercator()
> a.xyz([-74.017554, 40.706119], 14)
Object { minX: 4823, minY: NaN, maxX: NaN, maxY: 6160 }
14/4823/6160
您可以使用以下功能:
def deg2num(lat_deg, lon_deg, zoom):
lat_rad = math.radians(lat_deg)
n = 2.0 ** zoom
xtile = int((lon_deg + 180.0) / 360.0 * n)
ytile = int((1.0 - math.asinh(math.tan(lat_rad)) / math.pi) / 2.0 * n)
return (xtile, ytile)
以上是python的实现。您可以检查Slippy map lat/long totile number以获取实施细节和说明。
使用mercantile python库将mapbox xyz瓦片转换为坐标
https://github.com/mapbox/mercantile
示例:
对于那块瓷砖 https://api.tiles.mapbox.com/v4/mapbox.satellite/18/150973/100697.png
import mercantile
mercantile.ul(150973, 100697, 18)
"LngLat(lng=-9.140625, lat=53.33087298301705)"