GeoPandas: проверить, находится ли точка в многоугольнике - PullRequest
1 голос
/ 23 октября 2019

Я искал свою проблему и нашел этот вопрос , который отличается от моей проблемы.

У меня есть два фрейма геоданных, один из которых содержит местоположения домов как points (~ 700 баллов), а другой содержит suburbs names и их polygon (~ 2973 полигонов). Я хочу связать каждую точку с полигоном, чтобы назначить каждый дом правильному пригороду.

образец моего гео-фрейма данных

ploygon

import geopandas as gpd
from shapely.geometry import Point
from shapely.geometry.polygon import Polygon

#creating geo series
polys = gpd.GeoSeries({
    '6672': Polygon([(142.92288, -37.97886,), (141.74552, -35.07202), (141.74748, -35.06367)]),
    '6372': Polygon([(148.66850, -37.40622), (148.66883, -37.40609), (148.66920, -37.40605)]),
})

#creating geo dataframe
polysgdf = gpd.GeoDataFrame(geometry=gpd.GeoSeries(polys))
polysgdf

, который выдает следующее (мой исходный гео-фрейм данных также содержит столбец suburb, который содержит название пригорода, но яне удалось добавить его в мой образец, вы можете видеть только идентификатор пригорода ниже)

        geometry
6672    POLYGON ((142.92288 -37.97886, 141.74552 -35.07202, 141.74748 -35.06367, 142.92288 -37.97886))
6372    POLYGON ((148.66850 -37.40622, 148.66883 -37.40609, 148.66920 -37.40605, 148.66850 -37.40622))

образец точек гео-данных

точек

points=[Point(145.103,-37.792), Point(145.09720, -37.86400), 
        Point(145.02190, -37.85450)]

pointsDF = gpd.GeoDataFrame(geometry=points,
                                  index=['house1_ID', 'house2_ID', 'house3_ID'])

pointsDF

Какиепроизводит следующее

            geometry
house1_ID   POINT (145.10300 -37.79200)
house2_ID   POINT (145.09720 -37.86400)
house3_ID   POINT (145.02190 -37.85450)

Я бы хотел, чтобы конечным результатом был pointsDF гео-фрейм данных с каждым домом, назначенным соответствующему пригороду. В результате сопоставления точек и многоугольников.

Пример:

suburbID subrubName    house_ID
6672      south apple  house1_ID
6372      water garden house2_ID

Я новичок в GeoPandas, я попытался объяснить свой вопрос как можно яснее. Я рад уточнить любой момент. Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Я нашел способ сделать это, объединив два фрейма данных, используя пространственное соединение

joinDF=gpd.sjoin(pointsDF, polysgdf, how='left',op="within")
0 голосов
/ 23 октября 2019

Используйте анализ Point-in-Polygon с помощью функции .contains следующим образом.

import geopandas as gpd
from shapely.geometry import Point
from shapely.geometry.polygon import Polygon

polys = gpd.GeoSeries({
    '6672': Polygon([(0, 0), (0, 1), (1, 0)]),
    '6372': Polygon([(0, 1), (1, 1), (1, 0)]),
})

#creating geo dataframe
polysgdf = gpd.GeoDataFrame(geometry=gpd.GeoSeries(polys))
polysgdf
Out[48]: 
                            geometry
6672  POLYGON ((0 0, 0 1, 1 0, 0 0))
6372  POLYGON ((0 1, 1 1, 1 0, 0 1))

points=[Point(0.25,0.25), Point(0.75,0.75), 
        Point(145.02190, -37.85450)]

pointsDF = gpd.GeoDataFrame(geometry=points,
                                  index=['house1_ID', 'house2_ID', 'house3_ID'])

pointsDF
Out[49]: 
                            geometry
house1_ID          POINT (0.25 0.25)
house2_ID          POINT (0.75 0.75)
house3_ID  POINT (145.0219 -37.8545)

polysgdf['house_ID'] = ''
for i in range(0,len(pointsDF)):
    print('Check for house '+str(pointsDF.index.values.astype(str)[i]))
    for j in range(0,len(polysgdf)):
        print('Check for suburb '+str(polysgdf.index.values.astype(str)[j]))
        if polysgdf['geometry'][j].contains(pointsDF['geometry'][i]) == True:
            polysgdf['house_ID'][j] = pointsDF.index.values.astype(str)[i]

print(polysgdf)
                            geometry   house_ID
6672  POLYGON ((0 0, 0 1, 1 0, 0 0))  house1_ID
6372  POLYGON ((0 1, 1 1, 1 0, 0 1))  house2_ID
...