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(), чтобы выполнить проекцию один раз в начале, вместо того, чтобы по умолчанию перепроецировать ее каждый раз, когда она отображается.

Другие вопросы по тегам