У меня есть DataFrame
, содержащий столбцы lat
и lng
.У меня также есть FeatureCollection
геойсон, который содержит многоугольник.Учитывая этот многоугольник, как я могу сегментировать мой df
и выбирать только те строки, которые находятся внутри данного многоугольника эффективным способом?Я хочу избежать зацикливания на df
и проверки каждого элемента вручную.
d = {'lat' : [0,0.1,-0.1,0.4],
'lng' : [50,50.1,49.6,49.5]}
df = pd.DataFrame(d)
Это коллекция объектов, которая отображает 1 многоугольник и 4 точки.Как видите, только последний пункт находится снаружи.
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
0,
49
],
[
0.6,
50
],
[
0.1,
52
],
[
-1,
51
],
[
0,
49
]
]
]
}
},
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Point",
"coordinates": [
0,
50
]
}
},
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Point",
"coordinates": [
0.1,
50.1
]
}
},
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Point",
"coordinates": [
-0.1,
49.6
]
}
},
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Point",
"coordinates": [
0.4,
49.5
]
}
}
]
}
эта карта отображает многоугольник и точки.
Редактировать: Ниже приведен код, который у меня есть на данный момент, но, как вы можете ожидать, он очень медленный.
from shapely.geometry import shape, Point
# check each polygon to see if it contains the point
for feature in feature_collection['features']:
polygon = shape(feature['geometry'])
for index, row in dfr.iterrows():
point = Point(row.location_lng, row.location_lat)
if polygon.contains(point):
print('Found containing polygon:', feature)
, где dfr
- мой DataFrame
, содержащий location_lat
и location_lng
.feature_collection
является коллекцией объектов geojson, в которой есть только многоугольники (обратите внимание, что приведенный выше пример geojson предназначен только для объяснения вопроса, он имеет только 1 многоугольник и имеет несколько точек для иллюстрации вопроса).