首页 > 解决方案 > 使用 python 的 plotly cloropleth 绘制 GeoJSON 问题

问题描述

我正在尝试从具有以下结构的 geojson 进行绘图:

import geopandas as gpd
states = gpd.read_file('diamante.geojson')
display(states.head())

在此处输入图像描述

这是通过使用 mygeoconverter 从 .shp、shx、prj 等转换获得的。链接列是我稍后使用适当标签与另一个数据框合并的参考。当我从 geopandas 获得基本图时,形状信息似乎很好。

states.plot(aspect=1)

在此处输入图像描述

我不知道为什么我需要 aspect=1 参数才能使其工作。当尝试使用 plotly 绘制我的地图时,我得到以下信息:

import pyproj
#states.to_crs(pyproj.CRS.from_epsg(4326), inplace=True)
fig = px.choropleth(states, geojson=states['geometry'], locations=states.index, color=states.varon)
fig.show()

在此处输入图像描述

评论行是试图根据另一篇帖子解决问题,这似乎没有做任何事情。我是地图新手,所以我不知道要寻找什么。链接到我的 geojson 文件

此外,从文档中添加以下行会显示一个空白图表。

fig.update_geos(fitbounds="locations", visible=False)

标签: pythonmatplotlibgeojsongeopandas

解决方案


  • 你需要制定你的CRS。下面的代码假定您的多边形在 UK UTM CRS 系统中表示。这是对 WSG84 的投影,以便plotly可以使用它
  • 你的 CRS 有数百万个单位,所以不是 WSG84
  • 没有fitbounds我在世界地图上找不到geojson
import requests, json
import geopandas as gpd
import plotly.express as px

gdf = gpd.GeoDataFrame.from_features(requests.get("https://pastebin.com/raw/GwUsskWs").json()["features"])

gdf = gdf.set_crs("EPSG:32630").to_crs("EPSG:4326").set_index("link", drop=False)

fig = px.choropleth(gdf, geojson=json.loads(gdf.geometry.to_json()), locations="link", color="varon")
fig.update_geos(fitbounds="locations", visible=False)

在此处输入图像描述


推荐阅读