Python 错误:尝试在多边形中查找点时,float()参数必须是字符串或数字,而不是“多边形”

Python 错误:尝试在多边形中查找点时,float()参数必须是字符串或数字,而不是“多边形”,python,python-3.x,pandas,matplotlib,Python,Python 3.x,Pandas,Matplotlib,我有一个命名多边形列表: 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)])],

我有一个命名多边形列表:

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')
我试图找出哪些点位于哪些多边形中,并向点数据框中添加一列“真”或“假”

我之前已经展示了一些方法,这些方法展示了一些快速执行此操作的方法,并获得了脚本:

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')
然而,这里我也得到了一个错误:值的长度和索引的长度不匹配


如果您有任何帮助,我们将不胜感激

我没有得到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

谢谢你。“True,False column”基本上是添加到points数据框的列,如果某个点位于多边形a或b内,则该点旁边的列将为True。这是因为在实际的数据集中,我有1000个点要在100个多边形内检查,我不想添加一列,明白了吗。那么这个:points['inside']=points.geometry.maplambda x:True如果reducelambda a,b:a+b,listmaplambda p:p.containsx,df.geometry.values否则False