我有两个线要素地理数据框。对于第一个数据框中的每一行,我想计算出第二个数据框中有多少行与它相交,并将该数字附加到数据框中的新列。
例如,如果我有两个像这样的地理数据框:
from shapely.geometry import LineString
import geopandas as gpd
df = gpd.GeoDataFrame([['a',LineString([(1, 0.25), (2,1.25)])], ['b', LineString([(1.2, 1.0), (1.4, 1.5)])]], columns = ['name','geometry'])
df = gpd.GeoDataFrame(df, geometry = 'geometry')
df2 = gpd.GeoDataFrame([['c', LineString([(2.0, 0.5), (1.0, .75)])], ['d', LineString([(2, 0.75), (1.25, 0.8)])]], columns = ['name', 'geometry'])
df2 = gpd.GeoDataFrame(df2, geometry = 'geometry')
我想要一个看起来像这样的输出:
运行脚本后。
我发现this question几年前问的是类似的问题。我喜欢尝试使用缓冲区减少处理时间的想法。但是,当我尝试使用我的行数据来实现它时,最终结果列表是空白的。有没有人对迭代这些数据框的方法有任何想法?
我想我想出了一个带有嵌套 for 循环的解决方案:
#empty list to add counts
results_list = []
#iterate through geometries of both dataframes
for otherlines in df["geometry"]:
count = 0
for lines in df2["geometry"]:
if lines.intersects(otherlines):
count += 1
results_list.append(count)
df['intersections'] = results_list
最初,我只能让它在我上面发布的地理数据框上工作,它不适用于我更复杂的地理数据框。那是因为它有空几何,我可以在 ArcMap 中修复它们(尽管我确信在 Python 中有一个检查和修复空几何的函数)。
另一种使用更少代码的方法。
df['intersections'] = df['geometry'].apply(lambda line1: sum(line1.intersects(line2) for line2 in df2['geometry']))