【问题标题】:Filter a GeoPandas dataframe within a polygon and remove from the dataframe the ones who are not there过滤多边形内的 GeoPandas 数据框,并从数据框中删除不存在的数据框
【发布时间】:2020-12-01 19:12:34
【问题描述】:

我有一个 .csv 文件,其中包含一些点(经度、纬度)。我使用以下代码将其转换为 DataFrame 并从 DataFrame 转换为 GeoDataFrame:

CSV 文件:

日期;用户 ID;经度;纬度

2020-01-02;824664;-79.8831613;-2.1811152000000003

2020-03-01;123456;80.8831613;2.1811

2020-01-15;147835;-80.78035200000001;-1.4845725

我用来将 .csv 转换为 gdf ​​的代码:

df = pd.read_csv('datos25.csv', sep=';', low_memory=False, decimal='.')
gdf = geopandas.GeoDataFrame(
      df, geometry=geopandas.points_from_xy(df.Longitud, df.Latitud)) 

然后,我使用这段代码来定义我的多边形,它是一个国家:

world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
ec = world[world.name == 'Ecuador'] 

现在,我想做的是 gdf ​​中的每个 POINT,验证它是否在多边形/国家中,如果不是,从 DataFrame 中删除该行

例如,在这种情况下,几何列中的第二个值是:

点 (80.8831613 2.1811)

应该从数据框中删除该值所在的行,因为它不在多边形/国家/地区中

我该怎么做?

【问题讨论】:

    标签: python-3.x pandas geopandas


    【解决方案1】:

    需要空间操作within 来识别点几何是否位于多边形几何内。在下面的代码中,所有必要的步骤都是为了识别落在多边形(厄瓜多尔)内的所有点的目标而执行的。在最后一步,创建一个绘图以可视化/检查结果。

    import pandas as pd
    import geopandas
    from shapely.geometry import Point  #Polygon
    
    df = pd.read_csv('ecuador_data.csv', sep=';', low_memory=False, decimal='.')
    world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
    ecuador = world[world.name == 'Ecuador'] 
    
    # add new column to df
    df['withinQ'] = ""
    
    withinQlist = []
    for lon,lat in zip(df.Longitude, df.Latitude):
        pt = Point(lon, lat)
        withinQ = pt.within(ecuador['geometry'].values[0])
        #print( withinQ )
        withinQlist.append(withinQ)
    
    # update values in the that column, values: True/False
    df['withinQ'] = withinQlist
    
    # uncomment next line to see content of `df`
    #print(df)
    
    #          Date  User_ID  Longitude  Latitude  withinQ
    # 0  2020-01-02   824664   -79.8832   -2.1811     True
    # 1  2020-03-01   123456    80.8832    2.1811    False
    # 2  2020-01-15   147835   -80.7804   -1.4845     True
    
    # select points within ecuador, assign to `result_df` dataframe
    result_df = df[df.withinQ==True]
    # select points outside ecuador, assign to `xresult_df` dataframe
    xresult_df = df[df.withinQ==False]
    
    # for checking/visualization, create a plot of relevant geometries
    ax1 = ecuador.plot(color='pink')
    ax1.scatter(result_df.Longitude, result_df.Latitude, s=50, color='green')
    #ax1.scatter(xresult_df.Longitude, xresult_df.Latitude, s=30, color='red')
    

    剧情:

    对于生成的数据框result_df,其内容将如下所示:

             Date  User_ID  Longitude  Latitude  withinQ
    0  2020-01-02   824664   -79.8832   -2.1811     True
    2  2020-01-15   147835   -80.7804   -1.4845     True
    

    【讨论】:

      【解决方案2】:

      您可以使用link 中的文档以供将来参考,我发现它很有帮助!

      您正在寻找的过程称为多边形中的点,正如其他答案所提到的,您可以使用函数 .within()

      现在,用你已经拥有的东西我会做:

      #find point in polygon
      #code below returns a series with boolean values
      #if value is True it means the point in that index location is within the polygon we are evaluating
      
      pip = gdf.within(ec.loc[0, 'geometry'])
      
      #creating a new geoDataFrame that will have only the intersecting records
      
      ec_gdf = gdf.loc[pip].copy()
      
      #resetting index(optional step if you don't need to keep the original index values)
      ec_gdf.reset_index(inplace=True, drop=True)
      
      

      【讨论】:

        猜你喜欢
        • 2021-08-02
        • 2023-03-14
        • 2022-01-15
        • 2020-07-22
        • 1970-01-01
        • 1970-01-01
        • 2020-02-19
        • 2020-09-15
        • 2021-09-09
        相关资源
        最近更新 更多