使用 Folium 在绘制的 Geopandas Dataframe 上添加位置标记

Add location marker on plotted Geopandas Dataframe using Folium

上下文

我有一个合并的地理数据框 1)。邮政编码区和 2)。在名为 results 的格罗宁根市该邮政编码区域内的交付总量。地理数据框包括包含多边形和多边形的几何图形,可视化城市内的不同邮政编码区域。

我是 GeoPandas 的新手,因此我尝试了不同的教程,包括来自 geopandas 官方网站的 this one,我在其中介绍了我非常喜欢的交互式 Folium 地图。我能够使用 result.explore() 绘制我的地理数据框,从而生成以下地图

问题

到目前为止一切顺利,但现在我只想使用 folium libarty 放置一个标记,目的是计算标记和邮政编码区域之间的距离。在互联网上看了一些之后,我在 quickstart guild 中发现您需要创建一个 folium.Map,然后您需要 folium.Choropleth 用于我的地理数据框和 folium.Marker 并将它们添加到folium.Map.

m = folium.Map(location=[53.21917, 6.56667], zoom_start=15)

folium.Marker(
    [53.210903, 6.598276], 
    popup="My marker"
).add_to(m)

folium.Choropleth(results, data=results, columns="Postcode", fill_color='OrRd', name="Postalcode areas").add_to(m)
folium.LayerControl().add_to(m)
m

但是当尝试 运行 上面的代码时,我得到以下错误:

(可能的)最佳方法是什么?

除了我的失败代码(如果有人能帮助我,那就太好了)。我很好奇这是否是这样做的方法(Folium 地图 + 标记 + choropleth)。是否无法调用 geodataframe.explore() 结果进入第二张图片中的地图,然后仅在同一张地图上添加标记?我觉得我做得太难了,一定有更好的解决方案使用Geopandas。

  • 您还没有提供几何图形。已找到荷兰邮区并使用
  • explore() 支持将绘制一个点作为带有适当参数的标记
  • 因此有两层,
    • 一个是使用投递数量着色的邮政区域
    • 第二个是点,计算了到每个区域的距离
import geopandas as gpd
import shapely.geometry
import pandas as pd
import numpy as np

geo_url = "https://geodata.nationaalgeoregister.nl/cbsgebiedsindelingen/wfs?request=GetFeature&service=WFS&version=2.0.0&typeName=cbs_provincie_2017_gegeneraliseerd&outputFormat=json"

gdf = gpd.read_file(geo_url).assign(
    deliveries=lambda d: np.random.randint(10**4, 10**6, len(d))
)

p = gpd.GeoSeries(shapely.geometry.Point(6.598276, 53.210903), crs="epsg:4386")

# calc distances to point
gdf["distance"] = gdf.distance(p.to_crs(gdf.crs).values[0])

# dataframe of flattened distances
dfp = pd.DataFrame(
    [
        "<br>".join(
            [f"{a} - {b:.2f}" for a, b in gdf.loc[:, ["statcode", "distance"]].values]
        )
    ],
    columns=["info"],
)

# generate colored choropleth
m = gdf.explore(
    column="deliveries", categorical=True, legend=False, height=400, width=400
)
# add marker with distances
gpd.GeoDataFrame(
    geometry=p,
    data=dfp,
).explore(m=m, marker_type="marker")