python - 错误:尝试在多边形中查找点时,float() 参数必须是字符串或数字,而不是“多边形”
问题描述
我有一个命名多边形列表:
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() 参数必须是字符串或数字,而不是“多边形”
我该如何解决?
或者我一直在尝试这种方法:
points['inside'] = []
for geo1 in df['geometry']:
for geo2 in points['geometry']:
if geo1.contains(geo2):
points['inside'].append('True')
但是在这里我也得到一个错误:值的长度与索引的长度不匹配
对于其中任何一个的任何帮助将不胜感激!
解决方案
我没有得到“真/假列”,但这应该可以完成工作:
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
推荐阅读
- html - input class="comment-btn" 背景颜色超出边界
- c# - 无法将数据表转换为c#中的列表
- python-3.x - 如何对每组迭代地 groupby() 列和 sum()
- excel - 根据条件动态地将数据加载到多个 Excel 工作表中
- jquery - 为什么 JQuery 函数会自行移动元素
- uitextfield - 单元测试 UITextField
- javascript - 未捕获的错误:无法解析 SignupComponent 的所有参数:([object Object],?)。在 syntaxError (compiler.js:2175)
- c# - 在 C# 中将产品版本和文件版本设置为不同的数字
- python - 如何测试亚马逊 API?
- ruby-on-rails - Rails ExceptionNotifier -> 基于标题的通知器