用Kepler.gl实现Python地理数据可视化

513 阅读5分钟

[

Ivelina Yordanova

](medium.com/@ivs.yordan…)

伊夫林娜-约丹诺娃

关注

6月11日

-

5分钟阅读

[

拯救

](medium.com/m/signin?ac…)

用Kepler.gl实现Python地理数据可视化

在几分钟内建立并运行一个Python网络服务

照片:Killian CartigniesonUnsplash

如果你曾经处理过任何种类的地理数据,你就会知道仅仅盯着CSV、表格或JSON格式的数据是不太有用的。你需要把它放在地图上,以审查它并发现任何模式。这可能不是收集洞察力的全部方式,你仍然需要做一个适当的分析或/和在上面运行你的ML模型,但这是一个绝对的必须。

什么是Kepler.gl?

Kepler.gl是Uber的开源项目(GitHub链接在此),用于创建高性能的、与数据无关的网络应用。它建立在Mapbox之上,可以处理大型数据集,在配置你想可视化的内容和方式方面提供了很大的灵活性。

它使用图层作为基本构件,允许你创建互动地图--你可以添加、删除、显示和隐藏图层,并改变它们的外观。这是一个超级基本的例子,使用来自data.world的公共飞行数据集。

正如你所看到的,你可以将网格、点、弧线/线、多边形分层,甚至做一个3D地图。有一些方法可以让你做非常精细的过滤(在你的数据集允许的范围内)。

我在这里展示的数据集只有37,042行,但我试过它有数百万行,它处理得很好。地理计算是由GPU加速的,以提高性能。

Uber的工程博客中也有一篇很好的文章,其中有很多关于如何表示数据的例子和关于Kepler本身的更多细节。

使用Kepler.gl的方法?

  • 在他们的网站上上传一个数据集 演示页面- 如果你想看看这是什么,或者如果你需要一个一次性的快速方法来可视化适量的非敏感数据,这是个好办法。
  • 作为一个 反应组件 - 如果你想把这个功能嵌入到你现有的项目中,这将给你很多控制权(对状态、数据流、外观等)。就这样做。
npm install kepler.gl
  • 作为 python模块- 如果你是一个非前端专家,而且你需要快速完成工作,除了地图之外没有太多花哨的UI组件,这就是你的选择。首先,运行。
pip install keplergl

最后一个是我要快速浏览的,以展示你如何令人印象深刻地快速获得一个令人印象深刻的MVP应用程序,并将你的数据展示给没有耐心的利益相关者或客户。

用开普勒的Python模块创建一个Web应用程序

我将做一些简单的假设--你对Python、pandas和快速API有一定的了解(不需要成为专家来跟随)。

  1. 让我们导入我们需要的东西。

import uvicornimport pandas as pdfrom keplergl import KeplerGl from fastapi import FastAPIfrom fastapi.responses import HTMLResponse
  1. 载入你的数据。

# load a csv filedf = pd.read_csv('my_data.csv')# or a json filedf = 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,mapStatemapStyle

**MapState**是用来定义你每次重新加载页面时在世界地图上的起始位置,即起始/默认位置。

**MapStyles**设置KeplerGl应用程序的一般主题。它有几个预设选项,如黑暗、静夜、光明、静光和卫星。

**VizState**是更有趣的一个。它定义了 层数(无论是点、六边形、线等),以及每一层要使用的数据集--注意,我把dataId放在了黑体中,那是你如何将你的数据与配置绑定在一起的,在下一节中会展示一个例子。你还可以定义 滤波器你可以应用于一个或多个集合,并以该数据集的一个或多个字段为基础。此外,在这里你可以定义你想在你的工具提示(或其他互动选项)中显示什么以及如何显示。

  1. 将你的数据传递给开普勒

# the name here should match the dataId in the configkepler.add_data(data=all_data, name="my_data")
  1. 将地图变成HTML

kepler_html = kepler._repr_html_()
  1. 启动你的应用程序并返回生成的HTML

app = FastAPI()
  1. 享受它的乐趣

...并感谢您的阅读!