Holoviews 与 geoviews.tile_sources 结合导致轴比例错误

Holoviews combined with geoviews.tile_sources causes axis scale error

我正在尝试将 geoviews.tile_sources 图层与 datashade 图层合并。这两层单独产生正确的轴(见图像),但当组合(使用 *)时,比例变得扭曲。

import numpy as np
import pandas as pd
import holoviews as hv
from geoviews.tile_sources import EsriImagery
from holoviews.operation.datashader import datashade

hv.extension('bokeh')

lats = np.random.uniform(51.111, 51.222, 10000)
longs = np.random.uniform(1.31, 1.33, 10000)

df = pd.DataFrame({"latitude": lats, "longitude": longs})

points = hv.Points(df, ['longitude', 'latitude'])
shader = datashade(points)

EsriImagery * shader

但是,两个单独的图都是正确的:

shader + EsriImagery

HoloViews 元素对数据的坐标系一无所知,而图块源是在墨卡托坐标系中定义的。因此,当您在图块源上叠加 hv.Points 时,它会假定您的坐标已经在墨卡托坐标中。因此,为了叠加位于不同坐标系中的数据,您应该使用 GeoViews 元素,例如在您的情况下 gv.Points,如所述 in this user guide。这将确保您的点被正确解释为 lat/lon 对,并且可以自动投影到与图块源相同的坐标系中。

您正在尝试将 PlateCarree 坐标中的 HoloViews 对象与 Web 墨卡托坐标中的 GeoViews 对象组合在一起,两者相差几百万倍。您可以通过将 hv.Points() 更改为 gv.Points() 来修复它,这将是 PlateCaree 坐标中的 GeoViews 对象,当显示时,GeoViews 将投影到与图块图层相同的坐标系中。您还可以考虑使用 gv.project_points() 在开始时进行一次投影,而不是每次显示时都重新投影的默认设置。