我正在绘制澳大利亚各州的区域边界。
这渲染速度极其缓慢(10 分钟以上),并且根据 Juputerlab 的说法,它正在耗尽大量内存(4Gb+)。
我已将 df 过滤为单一状态,以减少要绘制的边界数量。将颜色设置为其中一列进行绘图会占用更多的时间和内存。如果我不设置颜色,那么它会在一分钟左右加载。
这是可以预料的吗?或者我可以对代码做些什么,以便它在合理的时间内渲染地图?
使用的形状文件可以在这里找到:
import geopandas as gpd
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly.graph_objects as go
import plotly.express as px
import plotly.offline as pyo
og_sa4_df = gpd.read_file()
sa4_df = og_sa4_df.copy(deep = True)
sa4_df = sa4_df[sa4_df['STE_NAME21'] == 'New South Wales']
sa4_df.dropna(axis = 0, subset = 'geometry', how = 'any', inplace = True)
sa4_df.set_index('SA4_NAME21')
sa4_df = sa4_df.to_crs(epsg = 4326)
geojson = sa4_df.__geo_interface__
fig = px.choropleth_mapbox(sa4_df,
geojson = sa4_df.geometry,
locations = sa4_df.index,
color = sa4_df.SA4_NAME21,
center={"lat": -33.865143, "lon": 151.209900},
mapbox_style="carto-positron",
zoom=8,
width = 800,
height = 500)
fig.show()
解决方案
在评论中使用 Robs 解决方案,这极大地加快了渲染速度:
import geopandas as gpd
import pandas as pd
import plotly.express as px
og_sa4_df = gpd.read_file('/Users/kamila/Downloads/SA4_2021_AUST_SHP_GDA94/SA4_2021_AUST_GDA94.shp')
sa4_df = og_sa4_df.copy(deep = True)
geocol = sa4_df.pop('geometry')
sa4_df.insert(0, 'geometry', geocol)
sa4_df = sa4_df[sa4_df['STE_NAME21'] == 'New South Wales']
sa4_df.dropna(axis = 0, subset = 'geometry', how = 'any', inplace = True) #need to drop None value rows for the geometry to be simplified below
sa4_df["geometry"] = (sa4_df.to_crs(sa4_df.estimate_utm_crs()).simplify(1000).to_crs(sa4_df.crs))
sa4_df.set_index('SA4_NAME21')
sa4_df = sa4_df.to_crs(epsg = 4326)
geojson = sa4_df.__geo_interface__
fig = px.choropleth_mapbox(sa4_df,
geojson = sa4_df.geometry,
locations = sa4_df.index,
color = sa4_df.SA4_NAME21,
color_discrete_map={'Central West': 'red'},
center={"lat": -33.865143, "lon": 151.209900},
mapbox_style="carto-positron",
zoom=8,
width = 1600,
height = 800)
fig.show()
我经常发现 Mapbox 由于几何图形过于精确而显着减慢速度。刚刚采取措施简化到 1000m 的精度,然后一切都运行得很快。
import geopandas as gpd
import plotly.express as px
sa4_df = gpd.read_file("https://www.abs.gov.au/statistics/standards/australian-statistical-geography-standard-asgs-edition-3/jul2021-jun2026/access-and-downloads/digital-boundary-files/SA4_2021_AUST_SHP_GDA94.zip")
sa4_df = sa4_df[sa4_df["STE_NAME21"] == "New South Wales"]
# simplify geometry to 1000m accuracy
sa4_df["geometry"] = (
sa4_df.to_crs(sa4_df.estimate_utm_crs()).simplify(1000).to_crs(sa4_df.crs)
)
sa4_df.dropna(axis=0, subset="geometry", how="any", inplace=True)
sa4_df.set_index("SA4_NAME21")
sa4_df = sa4_df.to_crs(epsg=4326)
geojson = sa4_df.__geo_interface__
fig = px.choropleth_mapbox(
sa4_df,
geojson=sa4_df.geometry,
locations=sa4_df.index,
color=sa4_df.SA4_NAME21,
center={"lat": -33.865143, "lon": 151.209900},
mapbox_style="carto-positron",
zoom=8,
width=800,
height=500,
)
fig.show()
确保您使用正确的位置 ID。如果您有重复的几何图形,请为每个几何图形创建一个唯一的 id,并将其用作
locations
的参数