Python 通过循环将多边形内的所有点作为值添加到字典对象

Python 通过循环将多边形内的所有点作为值添加到字典对象,python,geopandas,shapely,Python,Geopandas,Shapely,我有一个包含13个多边形的shapefile,还有一个地址列表,其中有来自与多边形相同的一般区域的~33K个地址。我通过谷歌地理编码API对地址进行了地理编码,现在正试图查看哪些地址位于哪些多边形中,并根据多边形的名称对它们进行分组 我可以一次处理一个多边形,但是我在循环中遗漏了一些东西 到目前为止,我的情况如下: # Import shapefile and convert coordinates to match address file sf = gpd.read_file(MY_SHAP

我有一个包含13个多边形的shapefile,还有一个地址列表,其中有来自与多边形相同的一般区域的~33K个地址。我通过谷歌地理编码API对地址进行了地理编码,现在正试图查看哪些地址位于哪些多边形中,并根据多边形的名称对它们进行分组

我可以一次处理一个多边形,但是我在循环中遗漏了一些东西

到目前为止,我的情况如下:

# Import shapefile and convert coordinates to match address file
sf = gpd.read_file(MY_SHAPEFILE)
sf_geo = sf.to_crs(epsg=4326)

# Import geocoded addresses
address_data = pd.read_csv(ADDRESS_FILE)
# Create points from lat/lon coordinate columns in address file
geometry_points = [Point(xy) for xy in zip(address_data['longitude'], 
                   address_data['latitude'])]

# Create object from one of the Polygons
p = sf_geo.iloc[0].geometry

i = 0
for point in geometry_points:
    if point.within(p):
        i += 1
        print(i)
    else:
        continue   
上述方法在所有多边形上都很有效。然而,我真正希望的是能够更新dict,其中键是多边形的实际名称,值是该多边形内匹配的所有点。然后,我可以将多边形名称添加到地址列表中

# Extract the names of each polygon
area_names = list(sf_geo['Name'])
# Create dict of polygon name : geometry
for r in sf_geo:
    shape_dict = dict(zip(area_names, sf['geometry']))

# Initialize empty dict to hold list of all addresses within each polygon
polygon_contains_dict = {k: [] for k in area_names}
上述内容在打印时创建此格式的dict:

{'10 ppm': <shapely.geometry.polygon.Polygon object at 0x7fea194225d0>, '20 ppm': <shapely.geometry.polygon.Polygon object at 0x7fe9f2e23590>, ETC}
但是,这既不向包含列表中添加任何内容,也不向多边形中的值添加任何内容(显然)。所有点都会转储到不包含列表中

因为我知道点实际上在一些多边形中,我知道我遗漏了一些东西。几何图形中的所有点都是点对象,而形状值中的所有多边形都是多边形对象


我错过了什么?谢谢您的帮助。

我建议您避免完全循环,为坐标和地址数据创建第二个geopandas数据框,然后进行空间连接:

# Import geocoded addresses
address_data = pd.read_csv(ADDRESS_FILE)
# Create points from lat/lon coordinate columns in address file
geometry_points = [Point(xy) for xy in zip(address_data['longitude'], 
               address_data['latitude'])]
address_gpd=gpd.GeoDataFrame(address_data,crs={'init': 'epsg:4326'},geometry=geometry_points) # second geopandas frame

# inner spatial join with shapefile 
df=gpd.sjoin(sf_geo,address_gpd,how='inner',op='intersects') 
df
数据框现在将具有每个多边形内的所有地址,然后要“更新一个dict,其中键是多边形的实际名称,值是该多边形内匹配的所有点”,您可以使用groupby和to_dict

df=df.groupby(['Name'])['address'].apply(list)
polygon_contains_dict=df.to_dict('index') 
我为您的地址计算的列名是
address
,如果不是这样,请更改

有关空间连接的详细信息,请参见

df=df.groupby(['Name'])['address'].apply(list)
polygon_contains_dict=df.to_dict('index')