bokeh - построение карты шейп-файла с помощью datashader

Первоначально я создал интерактивную карту области почтового индекса Великобритании, где отдельная область представлена ​​цветом в зависимости от ее значения (например, численность населения в этой области почтового индекса), как показано ниже.

from bokeh.plotting import figure
from bokeh.palettes import Viridis256 as palette
from bokeh.models import LinearColorMapper
from bokeh.models import ColumnDataSource
import geopandas as gpd

shp = 'file_path_to_the_downloaded_shapefile'
#read shape file into dataframe using geopandas
df = gpd.read_file(shp)

def expandMultiPolygons(row, geometry):
    if row[geometry].type = 'MultiPolygon':
       row[geometry] = [p for p in row[geometry]]
    return row
#Some rows were in MultiPolygons instead of Polygons.
#Expand MultiPolygons to multi rows of Polygons
df = df.apply(expandMultiPolygons, geometry='geometry', axis=1)
df = df.set_index('Area')['geometry'].apply(pd.Series).stack().reset_index()

#Visualize the polygons. To visualize different colors for different post areas, I added another column called 'value' which has some random integer value. 

p = figure()
color_mapper = LinearColorMapper(palette=palette)
source = ColumnDataSource(df)
p.patches('x', 'y', source=source,\
            fill_color={'field': 'value', 'transform': color_mapper},\
            fill_alpha=1.0, line_color="black", line_width=0.05)

где df - фрейм данных из четырех столбцов: область почтового индекса, координата x, координата y, значение (т. е. численность населения).

Приведенный выше код создает интерактивную карту в веб-браузере, что здорово, но я заметил, что интерактивность не очень гладкая по скорости. Если я увеличиваю масштаб или перемещаю карту, она отображается медленно. Размер фрейма данных составляет всего 1106 строк, поэтому я не понимаю, почему он такой медленный.

В качестве одного из возможных решений я наткнулся на datashader (https://datashader.readthedocs.io/en/latest/), но я считаю, что пример сценария довольно сложен, и большинство из них имеют пакет holoview в блокноте Jupyter, но я хочу создать информационную панель с использованием боке.

Кто-нибудь посоветует мне включить даташейдер в приведенный выше скрипт боке? Нужна ли мне другая функция в datashader для создания карты формы вместо использования функции исправлений боке?

Любое предложение будет высоко оценено !!!


person user4279562    schedule 25.09.2017    source источник
comment
Размер фрейма данных мне не кажется проблемой. Как вы создавали свои патчи? Вы используете шейп-файл или геоджсон? Я предполагаю, что построение очень сложных полигонов может снизить скорость. Вы можете попробовать упростить свои многоугольники.   -  person mc51    schedule 26.09.2017
comment
Я использовал граничные многоугольники почтового индекса Великобритании в формате шейп-файла из opendoorlogistics.com/downloads. Многоугольники области почтового индекса Великобритании слишком сложны? Мне нужно использовать область для визуализации, и, возможно, есть файлы формы почтового индекса Великобритании с низким разрешением?   -  person user4279562    schedule 27.09.2017


Ответы (3)


Без задействованного файла данных я не могу напрямую ответить на ваш вопрос, но могу предложить некоторые наблюдения:

  1. Datashader вряд ли будет полезен для этой цели, потому что в настоящее время Datashader не поддерживает рендеринг полигонов. Как правило, Datashader предназначен для агрегирования ваших данных, и если они уже агрегированы, Datashader обычно не поможет. Здесь ваши данные агрегируются по почтовому индексу, который даташейдер не может обработать, но если бы у вас были исходные данные на человека, он был бы рад их отобразить.
  2. Если вы предпочитаете работать с боке напрямую, а не через интерфейс более высокого уровня HoloViews / GeoViews, я бы порекомендовал последовать за работой Мэтта Роклина над ускорение геопанд; его подход должен быть очень быстрым для вашей цели.
  3. При этом HoloViews и GeoViews должен быть удобным способом работы с боке в целом, независимо от того, хотите ли вы создать информационную панель. Например. 2017 JupyterCon tutorial показывает, как создать простую панель управления Bokeh с использованием обеих библиотек. Он не распространяется на файлы форм, но они описаны в других примерах GeoViews.
person James A. Bednar    schedule 26.09.2017
comment
Я отредактировал приведенный выше скрипт, который объясняет, как я получил файл формы в функции исправлений боке. Не могли бы вы объяснить, почему в этом приложении необходимо использовать либо HoloViews / GeoViews, а не только Bokeh? Спасибо. - person user4279562; 27.09.2017
comment
Здесь нет необходимости использовать GeoViews; это просто удобно. Например. Построение хороплет на основе формы с учетом шейп-файла похоже на gv.Shape.from_records(shapes.records(), data, on='code', value='column', index='name', crs=crs.PlateCarree()), тогда как соответствующий код Bokeh длиннее и сложнее. Но результат в любом случае будет один и тот же график боке, поэтому используйте любой API, который вам больше нравится! - person James A. Bednar; 30.09.2017
comment
Обновление: Datashader теперь поддерживает многоугольники в паре со SpatialPandas; см. github.com/holoviz/datashader/pull/826. - person James A. Bednar; 04.12.2020

Как упоминалось в моем комментарии, я считаю, что сложность ваших полигонов может вызвать вашу проблему. Файл, с которым вы связались, содержит несколько шейп-файлов разного размера и сложности. Вы можете упростить их, то есть уменьшить количество точек для каждого многоугольника. Это может изменить их внешний вид. Он может варьироваться от почти полного отсутствия разницы до чуть большей «резкости» и заканчивая угловатым внешним видом. Это зависит от выбранного вами уровня упрощения. В зависимости от ваших потребностей вы можете выбрать разные уровни простоты.

Я знаю три простых способа сделать это:

  1. Графический интерфейс: попробуйте QGis. Это отличный инструмент с открытым исходным кодом для обработки геопространственных данных. Загрузите ваш шейп-файл как новый слой. Затем используйте инструмент «Упростить геометрию» в меню «Вектор».
  2. Командная строка: GDAL - это библиотека с открытым исходным кодом. Он поставляется с полезным инструментом командной строки. Вы можете использовать это так: ogr2ogr outfile.shp infile.shp -simplify 0.000001
  3. В Интернете: посетите mapshader. Импортируйте ваш файл. Выберите «Упростить» и выберите свой уровень. Затем экспортируйте результат. Что мне здесь действительно нравится, так это то, что ваш файл отображается мгновенно. Следовательно, вы сразу можете увидеть результат вашего упрощения.

Помимо этого, вам также следует обновить версию боке. Он регулярно обновляется, и с тех пор были некоторые улучшения производительности.

Использование HoloViews или GeoViews не повлияет положительно на вашу производительность. Таким образом, это не связано с вашими проблемами. Думаю, @ Джеймс А. Беднар просто давал здесь какой-то побочный совет.

person mc51    schedule 27.09.2017

Я нашел способ ускорить интерактивную визуализацию карты Великобритании при перемещении ползунка.

Сначала я создал отдельное изображение (в 2D) для другого значения ползунка и обновил карту, используя 2D-изображения вместо использования функции патчей боке.

Поскольку изображения имеют формат массива, гораздо быстрее обновлять изображение, изменяя значения в ползунке. одним из недостатков этого метода является то, что я больше не могу использовать функцию наведения курсора на карту Великобритании.

Я сослался на следующий URL-адрес для преобразования информации о многоугольнике в массивы: person user4279562    schedule 29.09.2017