Kepler.gl - инструмент для визуализации геоданных на Python

Если вы когда-либо работали с геоданными, то знаете, насколько нецелесообразно просматривать их в формате CSV, таблицы или JSON. Геоданные необходимо нанести на карту для последующего изучения и выявления закономерностей. Процесс сбора информации не ограничивается только этими действиями и обязательно требует выполнения качественного анализа или/и запуска моделей МО. 

Введение в Kepler.gl

Kepler.gl  —  проект от Uber с открытым ПО (ссылка на GitHub). Он позволяет создавать высокопроизводительные веб-приложения, обрабатывающие любые форматы данных. Этот инструмент, разработанный на базе Mapbox, отлично справляется с большими датасетами и обеспечивает гибкие настройки визуализации. 

В качестве основных строительных блоков Kepler.gl использует слои, позволяющие создавать интерактивные карты. С этими слоями вы можете выполнять разные действия: добавлять, удалять, показывать, скрывать, менять их внешний вид. Ниже представлен базовый пример с применением общедоступного датасета по авиарейсам, взятым с сайта data.world:

Как видно, вы можете задействовать слои сеток, точек, дуг/линий, многоугольников, а также создавать 3D-карту. В ваше распоряжение предоставляются разные способы детализированной фильтрации в той мере, в которой позволяет датасет: 

Рассматриваемый в статье датасет содержит всего 37042 строки. Но опыт показывает, что Kepler.gl успешно обрабатывает датасеты с миллионами строк. Для повышения производительности геовычисления выполняются с ускорением GPU.  

Способы применения Kepler.gl

  • Загрузить датасет на демостраницу Kepler.gl. Воспользуйтесь указанным способом, если хотите получить представление о работе данного инструмента или быстро визуализировать средний объем неконфиденциальных данных. 
  • Использовать в качестве компонента React. Рекомендован в случае необходимости встроить данную функциональность в существующий проект. Так вы получаете больше возможностей для управления состоянием, потоком данных, внешним видом и т. д. Просто выполняем: 
npm install kepler.gl
  • Задействовать как модуль Python. Данный способ оптимален для тех, кто: 1) не является экспертом в области фронтенд-разработки; 2) хочет быстро получить результаты, не заморачиваясь со множеством сложных компонентов UI, помимо карт. Для начала выполняем:
pip install keplergl

Далее мы рассмотрим 3-й способ. Вы увидите, насколько быстро можно создать и запустить в работу впечатляющее MVP-приложение, а также наглядно представить данные нетерпеливым клиентам и заинтересованным сторонам проекта. 

Создание веб-приложения с помощью модуля Kepler в Python 

Для дальнейшей работы требуются базовые знания Python, Pandas и FastAPI.

1) Импортируем все необходимое: 

import uvicorn
import pandas as pd
from keplergl import KeplerGl
from fastapi import FastAPI
from fastapi.responses import HTMLResponse

2) Загружаем данные:

# загрузка файла csv
df = pd.read_csv('my_data.csv')
# или файла json
df = pd.read_json('my_data.json')

Скорее всего, потребуется загрузка не одного, а нескольких файлов. Поэтому сделаем это в цикле и объединим датафреймы dataframes, полученные из каждого файла, следующим образом:

all_data = pf.concat([all_data, df])

3) Инициализируем карту Kepler.gl:

kepler = KeplerGl(config=my_map_config)

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

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

Приведем пример конфигурации: 

config = {
"version": "v1",
"config": {
"visState": {
"filters": [
{
"dataId": ["my_data"],
"id": "11111",
"name": ["some_col_name"],
"type": "multiSelect",
"value": [],
"enlarged": False,
"plotType": "histogram",
"animationWindow": "free",
"yAxis": None,
"speed": 1,
}
],
"layers": [
{
"id": "22222",
"type": "point",
"config": {
"dataId": "my_data",
"label": "my_data",
"color": [30, 150, 190],
"highlightColor": [252, 242, 26, 255],
"isVisible": True,
"visConfig": {
"radius": 5,
"fixedRadius": False,
"opacity": 0.8,
"outline": False,
"thickness": 2,
"strokeColor": None,
...
},
"hidden": False
}
}
],
"interactionConfig": {
"tooltip": {
"fieldsToShow": {
"my_data": [
{"name": "col_1", "format": None},
{"name": "col_2", "format": None}
]
},
"compareMode": False,
"compareType": "absolute",
"enabled": True,
},
"brush": {"size": 0.5, "enabled": False},
"geocoder": {"enabled": False},
"coordinate": {"enabled": False},
},
"layerBlending": "normal",
"splitMaps": [],
"animationConfig": {"currentTime": None, "speed": 1},
},
"mapState": {
"bearing": 0,
"dragRotate": False,
"latitude": 40.710394,
"longitude": -74.000288,
"pitch": 0,
"zoom": 12.41,
"isSplit": False,
},
"mapStyle": {
"styleType": "dark",
"topLayerGroups": {},
"visibleLayerGroups": {
"label": True,
"road": True,
"border": False,
"building": True,
"water": True,
"land": True,
"3d building": False,
},
"threeDBuildingColor": [
9.665468314072013,
17.18305478057247,
31.1442867897876,
],
"mapStyles": {},
},
},
}

Главным образом код содержит 3 основных раздела: visState, mapState и mapStyle.

MapState определяет место на карте мира, которое является отправной точкой при каждой перезагрузке страницы, начальным/предустановленным местоположением. 

MapStyles устанавливает общую тему приложения KeplerGl и включает такие предустановленные варианты, как темный, приглушенный темный, светлый, приглушенный светлый и сопутствующие им. 

VizState представляет для нас больший интерес. Он определяет слои, будь то слои точек, шестиугольников, линий и т. д., и датасет для каждого из них. Обратите внимание, что dataId выделен жирным шрифтом. Именно так данные связываются с конфигурацией, и мы наглядно это рассмотрим в следующем пункте. Допускается определять фильтры, применяемые для одного или более датасетов и установленные на одном или нескольких полях в этих датасетах. Помимо этого, здесь вы можете определить, что и как вы хотите показать во всплывающей подсказке (или другой интерактивной опции).  

4) Передаем данные в Kepler:

# указанное здесь имя должно соответствовать dataId в конфигурации 
kepler.add_data(data=all_data, name="my_data")

5) Преобразуем карту в HTML:

kepler_html = kepler._repr_html_()

6) Запускаем приложение и возвращаем сгенерированный HTML:

app = FastAPI()@app.get("/")
async def index():
return HTMLResponse(content=kepler_html, status_code=200)if __name__ == "__main__":
uvicorn.run("web_app:app", host="X", port="X")

7) Наслаждаемся результатами работы!

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Ivelina Yordanova: Python Geo Data Visualization With Kepler.gl

Предыдущая статьяСекреты эффективного управления разработкой
Следующая статьяСоздание многократно используемых компонентов React оптимальным способом