Python:如何创建以米为单位的点周围的正方形缓冲区?

6

我有一个 geopandas 数据框 gdf

gdf
    ID  longitude   latitude    geometry
0   80  103.619501  1.2810      POINT (103.619500987 1.281)
1   81  103.619501  1.2855      POINT (103.619500987 1.2855)

根据这个建议,我创建了一个正方形的缓冲区,并且定义了距离为bd

bd = abs((gdf['latitude'][0]-gdf['latitude'][1])/2)

最后我能够得到以下内容:
buffer = gdf.buffer(bd)
envelope = buffer.envelope

f, ax = plt.subplots(figsize=(7.5, 7.5))
envelope.plot(color='white', edgecolor='gray',ax=ax)
gdf.plot(ax=ax)

enter image description here

我该如何设置一个对应于500米的距离 bd


这个链接有帮助吗?它是关于计算5个城市之间所有可能组合的地理距离的。 - ComplicatedPhenomenon
2个回答

7

您需要将数据重新投影到使用米作为坐标的CRS。因为您正在使用经度和纬度,所以您的值是以度为单位的,包括缓冲距离。如果您想要创建一个正方形缓冲区,您不需要使用envelope,只需将cap_style设置为3即可(请参见shapely文档)。

gdf.crs = 'epsg:4326' # I am assuming here
gdf = gdf.to_crs(epsg=3395)

buffer = gdf.buffer(500, cap_style=3) # you might want to use 250, guessing from your image

更多详情请参考Geopandas用户指南


在对点进行缓冲处理后,您是否丢失了属性表信息? - Roger Almengor
如果您将包含缓冲区的GeoSeries分配为列,就不会被替换原始的"geometry"列或新增一个。 - martinfleis

2

这是我的函数,具有高精度。数据是一个包含shapely的几何类型的DataFrame。

def generate_buffer_meter(data, radiu, geometry='geometry', crs='epsg:4326'):
    data = gpd.GeoDataFrame(data, geometry=geometry, crs=crs)
    data = data.to_crs('+proj=aeqd +units=m  +x_0=0 +y_0=0')
    data[geometry] = data[geometry].buffer(radiu)
    data = data.to_crs(crs)
    return data


你的方法返回圆形,而不是正方形。你可以像上面的答案一样使用 cap_style=3 - VB_
我认为你想要使用.to_crs(epsg=3395)而不是aeqd。另外,.buffer(radius, cap_style=3) - jonincanada

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接