Holoviews в сочетании с geoviews.tile_sources вызывает ошибку масштаба оси
Я пытаюсь объединить 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
2 ответа
Элементы HoloViews ничего не знают о системе координат ваших данных, в то время как источники листов определены в системе координат Mercator. Поэтому, когда вы накладываете hv.Points поверх источника плитки, предполагается, что ваши координаты уже находятся в координатах Mercator. Поэтому для наложения данных, расположенных в разных системах координат, следует использовать элементы GeoViews, например, в вашем случае gv.Points
, как описано в этом руководстве пользователя. Это гарантирует, что ваши точки будут правильно интерпретироваться как пары широта / долгота и могут автоматически проецироваться в ту же систему координат, что и источник тайла.
Вы пытаетесь объединить объект HoloViews в координатах PlateCarree с объектом GeoViews в координатах Web Mercator, которые отличаются в несколько миллионов раз. Вы можете исправить это, изменив hv.Points() на gv.Points(), который будет объектом GeoViews в координатах PlateCaree, которые GeoViews будут проецировать в ту же систему координат, что и слой листов при его отображении. Вы также можете рассмотреть возможность использования gv.project_points(), чтобы выполнить проекцию один раз в начале, вместо того, чтобы по умолчанию перепроецировать ее каждый раз, когда она отображается.