Ошибка: аргумент float() должен быть строкой или числом, а не 'Polygon' при попытке найти точки в многоугольниках
У меня есть список именованных полигонов:
import pandas as pd
import geopandas as gp
from shapely.geometry import Polygon
from shapely.geometry import Point
import matplotlib.path as mpltPath
df = gp.GeoDataFrame([['a', Polygon([(1, 0), (1, 1), (2,2), (1,2)])],
['b', Polygon([(1, 1), (2,2), (3,1)])]],
columns = ['name','geometry'])
df = gp.GeoDataFrame(df, geometry = 'geometry')
и список пунктов:
points = gp.GeoDataFrame( [['box', Point(1.5, 1.75)],
['cone', Point(3.0,2.0)],
['triangle', Point(2.5,1.25)]],
columns=['id', 'geometry'],
geometry='geometry')
Я пытаюсь выяснить, какие точки находятся в каких полигонах, и добавить столбец к точечному кадру данных с помощью "True" или "False".
Ранее мне были показаны методы, которые показывают некоторые способы быстрого выполнения этого, и я получил скрипт:
point = points['geometry']
path = mpltPath.Path(df['geometry'])
points['inside'] = path.contains_points(point)
но я получаю ошибку: аргумент float() должен быть строкой или числом, а не 'Polygon'
Как это исправить?
В качестве альтернативы я пытался этот метод:
points['inside'] = []
for geo1 in df['geometry']:
for geo2 in points['geometry']:
if geo1.contains(geo2):
points['inside'].append('True')
однако здесь я также получаю ошибку: длина значений не соответствует длине индекса
Любая помощь с любым из них будет принята с благодарностью!
1 ответ
Решение
Я не получил "столбец true/false", но это должно сделать работу:
points.apply(lambda row: (row['id'], list(map(lambda e: e[0], list(filter(lambda p: p[1].contains(row['geometry']), df.values))))), axis=1)
Для каждой точки вы получите полигоны, которые ее содержат, выведите:
0 (box, [a])
1 (cone, [])
2 (triangle, [b])
dtype: object