使用Datashader,holoviews和bokeh进行麻烦的地理映射

时间:2018-07-17 07:04:03

标签: pandas datashader geoviews

我正在尝试使用holoviews,datashader和bokeh将google电话历史记录位置映射到地图上。大多数情况下与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 个答案:

答案 0 :(得分:2)

看起来您的点在lon,lat中,但是地图在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文件中,这样您只需要执行一次即可。