使用 folium 绘制具有一定半径缓冲区的多边形无法正常工作

Plot polygons with buffer of some radius using folium not working properly

我正在尝试绘制缓冲区圆与某个半径(在本例中为 80 公里)的圆内的网格块(或边界)之间的交点。

我使用 sjoin() 得到了交集,如下所示:

intersection_MeshBlock = gpd.sjoin(buffer_df, rest_VIC, how='inner', predicate='intersects')

我的缓冲区变量如下所示: buffer_df 十字路口看起来像这样: intersection

问题是我无法绘制相交多边形。 这是我使用 folium 中的多边形绘图绘制后得到的图:

for _, r in intersection_MeshBlock.iterrows():
    # Without simplifying the representation of each borough,
    # the map might not be displayed
    sim_geo = gpd.GeoSeries(r['geometry']).simplify(tolerance=0.00001)
    geo_j = sim_geo.to_json()
    geo_j = folium.GeoJson(data=geo_j,
                           style_function=lambda x: {'fillColor': 'orange'} )
    folium.Popup(r['SA1_CODE21']).add_to(geo_j)
    geo_j.add_to(m)
m

剧情: color filled maps

我做错了什么?

编辑: 我可能已经部分解决了这个问题。现在,我可以在一些缓冲区半径内绘制多边形。这就是我的情节的样子:

如果你看到图像,你会发现有一些网格块穿过圆形边界区域。我如何摆脱那个圆形区域之外的所有东西?

  • 已找到墨尔本的一些几何图形来演示
  • 基本上,您想使用 overlay() 而不是 sjoin()
  • 使用 GeoPandas 0.10 功能 explore()
  • folium 地图的生成要简单得多
import geopandas as gpd
import numpy as np
import shapely.geometry
import folium

rest_VIC = gpd.read_file(
    "https://raw.githubusercontent.com/codeforgermany/click_that_hood/main/public/data/melbourne.geojson"
)

# select a point randomly from total bounds of geometry
buffer_df = gpd.GeoDataFrame(
    geometry=[
        shapely.geometry.Point(
            np.random.uniform(*rest_VIC.total_bounds[[0, 2]], size=1)[0],
            np.random.uniform(*rest_VIC.total_bounds[[1, 3]], size=1)[0],
        )
    ],
    crs=rest_VIC.crs,
)

buffer_df = gpd.GeoDataFrame(
    geometry=buffer_df.to_crs(buffer_df.estimate_utm_crs())
    .buffer(8 * 10**3)
    .to_crs(buffer_df.crs)
)


# need overlay not sjoin
intersection_MeshBlock = gpd.overlay(buffer_df, rest_VIC, how="intersection")

m = rest_VIC.explore(name="base", style_kwds={"fill":False}, width=400, height=300)
m = buffer_df.explore(m=m, name="buffer", style_kwds={"fill":False})
m = intersection_MeshBlock.explore(m=m, name="intersection", style_kwds={"fillColor":"orange"})
folium.LayerControl().add_to(m)

m