pandas - 使用数据着色器、全息视图和散景进行地理映射的麻烦
问题描述
我正在尝试使用全息视图、数据着色器和散景将谷歌手机历史位置映射到地图上。大部分与 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
我究竟做错了什么?
解决方案
看起来您的点位于 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 文件中,这样您只需执行一次。
推荐阅读
- c# - 将 gridview 导出到 Excel 时遇到问题
- python - Python从日期时间索引计算每天的小时数
- python - Wx.stc.StyledTextCtrl 滚动条
- python - Errno 2 没有这样的文件或目录:'ffprobe':'ffprobe'
- c# - C# 中的语句之间是否存在延迟?
- firebase - 在 gunicorn 上的 Flask 中使用 eventlet 和 Firebase 时,关键工作人员超时
- ios - 自己的警报控制器
- c# - 使用反射设置工具提示
- typescript - 如何使用 react-native-webview-leaflet?
- json - 在 Elm 中,如何解码嵌套 JSON 中的 JSON 对象