1

我正在尝试将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

在此处输入图像描述

4

2 回答 2

3

HoloViews 元素对数据的坐标系一无所知,而瓦片源是在墨卡托坐标系中定义的。因此,当您在瓦片源上覆盖 hv.Points 时,它假定您的坐标已经在墨卡托坐标中。因此,为了覆盖位于不同坐标系中的数据,您应该使用 GeoViews 元素,例如在您的情况下gv.Points,如本用户指南中所述。这将确保您的点被正确解释为纬度/经度对,并且可以自动投影到与瓦片源相同的坐标系中。

于 2018-11-15T19:08:37.297 回答
2

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

于 2018-11-15T19:12:14.557 回答