使用datashader、holoviews和bokeh进行地理映射出现问题

4

我正在尝试使用holoviews、datashader和bokeh将谷歌电话历史位置映射到地图上。这与datashader网站上给出的示例非常相似。但是当我进行地图叠加时,由于纬度/经度被搞乱了,所以无法正常工作。

import datashader as ds
import geoviews as gv
import holoviews as hv
from holoviews.operation.datashader import datashade, dynspread
from datashader import transfer_functions as tf
from colorcet import fire
hv.extension('bokeh')

> df2.head()

lat long
0   -37.7997515 144.9636466
1   -37.7997515 144.9636466
2   -37.7997369 144.9636036
3   -37.7997387 144.9636358
4   -37.7997515 144.9636466

这可以生成数据的一张图片。
ds_viz = ds.Canvas().points(df2,'lat','long')  
tf.set_background(tf.shade(ds_viz, cmap=fire),"black")

然而,当我试图将其与地图叠加时,它无法正常工作。 来自bokeh.models的WMTSTileSource。
url = 'https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{Z}/{Y}/{X}.jpg'
tile_opts  = dict(width=1000,height=600,bgcolor='black',show_grid=False)
map_tiles  = gv.WMTS(url).opts(style=dict(alpha=0.5), plot=tile_opts)
points     = hv.Points(df2, kdims=['long','lat'])
trips = datashade(points, cmap=fire,width=1000, height=600)

map_tiles * trips

我做错了什么?
1个回答

9

看起来你的点是在经纬度坐标系下,但是你的地图是在Web Mercator坐标系下,因此你需要在叠加点之前将它们投影到Web Mercator坐标系中。GeoViews提供了全面的投影支持,但是对于这种特殊情况,Datashader提供了专门的函数datashader.utils.lnglat_to_meters。以下代码应该可以解决问题:

df2.loc[:, 'lon'], df.loc[:, 'lat'] = lnglat_to_meters(df2.lon,df2.lat)

投影可能会很慢,因此您可能希望将结果df2保存到Parquet文件中,这样您只需要执行一次。


我发现这个方法非常有效,但我想知道您如何确定地图是Web Mercator坐标系?当我只绘制瓦片时,轴范围似乎显示从-180到180(x)和-90到90(y)的坐标,这些似乎是以度为单位的“常规”纬度/经度数字。 - Saaru Lindestøkke
Bokeh的地图通常都是在Web Mercator投影下的,目前不支持其他投影方式。Bokeh包含特殊代码来映射和从Web Mercator进行轴标签和悬停操作,以便大多数用户不会看到像9000290这样的底层值,但如果您使用Python或JavaScript检查叠加数据的实际列,您将看到原始的Web Mercator值。 - James A. Bednar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接