我正在尝试将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
答案 0 :(得分:2)
HoloViews元素对数据的坐标系一无所知,而图块源在Mercator坐标系中定义。因此,当您将hv.Points叠加在图块源的顶部时,将假定您的坐标已经在Mercator坐标中。因此,为了覆盖位于不同坐标系中的数据,您应该使用GeoViews元素,例如您的情况gv.Points
,如in this user guide所述。这样可以确保将点正确解释为经纬度对,并可以自动将其投影到与图块源相同的坐标系中。
答案 1 :(得分:1)
您正在尝试将PlateCarree坐标中的HoloViews对象与Web Mercator坐标中的GeoViews对象结合在一起,两者相差几百万倍。您可以通过将hv.Points()更改为gv.Points()来修复该问题,这将是PlateCaree坐标中的一个GeoViews对象,在显示时,GeoViews会将其投影到与图块图层相同的坐标系中。您还可以考虑在开始时使用gv.project_points()进行一次投影,而不是每次显示时都重新投影一次。