【问题标题】:How to create an accurate buffer of 5 miles around a coordinate in python?如何在python中围绕坐标创建5英里的精确缓冲区?
【发布时间】:2018-11-16 06:38:00
【问题描述】:

我想在一个坐标周围创建一个 5 英里的精确缓冲区,我当前的代码是:

cpr_gdf['p_buffer']=cpr_gdf['coordinates'].buffer(5*(1/60))

坐标列是使用以下代码创建的:

cpr_df['coordinates']=list(zip(cpr_df.sample_longitude_decimal,cpr_df.sample_latitude_decimal))
cpr_df['coordinates']=cpr_df['coordinates'].apply(Point)
cpr_gdf=gpd.GeoDataFrame(cpr_df,geometry='coordinates',crs={'init' :'epsg:4326'})

感谢您的帮助!

【问题讨论】:

  • 你能澄清一下你的问题是什么吗?您展示的代码示例不起作用(按预期)怎么办?
  • 根据代码的注释:您的数据是经度/纬度。如果您想要一个以英里(米)为单位的精确缓冲区,您可能需要将您的数据转换为另一个以米为单位的坐标参考系统。
  • 嗨,代码已经过调整,所以它可以工作了:) 我应该在这里发布还是删除问题。
  • 你可以回答你自己的问题。

标签: python-3.x geopandas


【解决方案1】:

您需要转换为最精确到缓冲区位置的等面积投影(https://epsg.io/ 上的好资源)

例如,我正在密歇根州制作地图,所以我使用的是 EPSG:3174(我相信它以米为单位,如有错误请纠正我)。鉴于您已经将数据帧转换为 GeoPandas 数据帧,您可以将当前投影转换为 3174,然后创建缓冲区(将英里转换为米)

cpr_gdf= cpr_gdf.to_crs({'init': 'epsg:3174'})  
buffer_length_in_meters = (5 * 1000) * 1.60934
cpr_gdf['geometry'] = cpr_gdf.geometry.buffer(buffer_length_in_meters)

【讨论】:

    【解决方案2】:

    在赤道,一分钟的纬度或经度约为 1.84 公里或 1.15 英里 (ref)。

    因此,如果您将您的点定义为P = [y, x],那么您可以在它周围创建一个缓冲区,比如说 4 分钟,大约 5 英里:buffer = 0.04。然后可以很容易地获得边界框

    minlat = P[0]-(P[0]*buffer)
    maxlat = P[0]+(P[0]*buffer)
    minlon = P[1]-(P[1]*buffer)
    maxlon = P[1]+(P[1]*buffer)
    

    【讨论】:

    • 这仅适用于某些纬度,充其量只是一个近似值。结果将在两极出现严重偏差。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 2012-01-03
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多