如何遍历两个地理数据框以找到一个 gdf 中的给定线与另一个 gdf 中的所有线之间的交点数?

问题描述 投票:0回答:2

我有两个线要素地理数据框。对于第一个数据框中的每一行,我想计算出第二个数据框中有多少行与它相交,并将该数字附加到数据框中的新列。

例如,如果我有两个像这样的地理数据框:

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')

(df = 蓝色,df2 = 红色)

我想要一个看起来像这样的输出:

运行脚本后。

我发现this question几年前问的是类似的问题。我喜欢尝试使用缓冲区减少处理时间的想法。但是,当我尝试使用我的行数据来实现它时,最终结果列表是空白的。有没有人对迭代这些数据框的方法有任何想法?

python geopandas shapely
2个回答
0
投票

我想我想出了一个带有嵌套 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 中有一个检查和修复空几何的函数)。


0
投票

另一种使用更少代码的方法。

df['intersections'] = df['geometry'].apply(lambda line1: sum(line1.intersects(line2) for line2 in df2['geometry']))

© www.soinside.com 2019 - 2024. All rights reserved.