1

ポイントの列を持つ DataFrame A があります。

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

Polygon の列を持つ別の DataFrame 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 に渡すにはどうすればよいですか?

4

1 に答える 1

0

次の 2 つのデータフレームがあるとします。

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)

ポイントが複数の列と交差する場合、2 番目の方法ではポイント行が繰り返されますが、最初の方法では繰り返されないことに注意してください。

于 2016-10-20T13:32:01.117 に答える