Holoviews与geoviews.tile_sources组合会导致轴比例误差

时间:2018-11-15 18:38:27

标签: python bokeh holoviews datashader geoviews

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

Incorrect axis

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

shader + EsriImagery

enter image description here

2 个答案:

答案 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()进行一次投影,而不是每次显示时都重新投影一次。