Тревожное гео-картирование с даташадером, holoviews и боке

Я пытаюсь сопоставить местоположения истории телефона Google на карте, используя 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 ответ

Решение

Похоже, что ваши точки в долготе, но ваша карта в координатах 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, так что вам придется сделать это только один раз.

Другие вопросы по тегам