2015-11-22 37 views
1

我有一个数据帧A和点的列点:返回邮编,如果在多边形(匀称)

points      Code 
0 Point(1.23, 1.34)   ? 
1 Point(1.32, 3.56)   ? 
2 Point(-1.09, 2.11)   ? 
. 
. 

我也有另外一个数据帧B带多边形的列:

Code Polygon 
0 123 Polygon((-2,3),(1,4),(3,3),(-1,-2)) 
1 203 Polygon((-1,2),(0,2),(4,1),(-2,-1)) 
. 
. 

如何当点在多边形内时,我可以将B中的代码传递给A吗?

回答

0

假设你有两个dataframes:

df1 = GeoDataFrame(
    [[Point(1.23, 1.34)], 
    [Point(1.32, 3.56)], 
    [Point(-1.09, 2.11)]], 
    columns=['geometry'], 
    geometry='geometry') 

df2 = GeoDataFrame(
    [[Polygon([(-2,3),(1,4),(3,3),(-1,-2)]), 123], 
    [Polygon([(-1,2),(0,2),(4,1),(-2,-1)]), 203]], 
    columns=['geometry', 'Code'], 
    geometry='geometry') 

您可以手动做到这一点:

# add the Code column: 
df1.loc[:,'Code'] = [None]*len(df1.geometry) 
# compute the intersections 
for i, p in enumerate(df1.geometry): 
    for j, pol in enumerate(df2.geometry): 
     if pol.contains(p): 
      df1['Code'][i] = df2['Code'][j] 
      break 

或者你也可以用做空间加入:

df1 = gpd.sjoin(df1, df2, how="inner", op='intersects') 
# remove the index_right extra column that is generated: 
df1.drop('index_right', axis=1, inplace=True) 

当心,该如果一个点与多列相交,第二种方法将重复点行,第一种方法不会。

相关问题