使用 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
我正在尝试绘制缓冲区圆与某个半径(在本例中为 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