Geopandas线多边形相交


11

我正在尝试查找多条线与两个不同地理数据框的多边形相交的位置:

from shapely.geometry import Polygon, LineString
import geopandas as gpd

polygon = Polygon([(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)])
line1 = LineString([(0.5, 0.5), (0.7, 0.7)])
line2 = LineString([(0.9, 0.9), (0.2, 0.6)])


poly_gdf = gpd.GeoDataFrame(geometry=[polygon])
line_gdf = gpd.GeoDataFrame(geometry=[line1, line2])

这就是上面的地理数据框的样子(一个具有多边形,另一个具有两条线)。在我看来,两条线都与多边形相交:

多边形和线

但是,相交的输出非常令人困惑:

print(line_gdf.intersects(poly_gdf))

0真实

1错误

print(line1.intersects(polygon))
print(line2.intersects(polygon))

真正

真正

为什么该geopandas intersect方法与标准方法输出不同shapely

我在Anaconda上都使用Python 3.5.3和Geopandas 0.2.1。


当您说print(line.intersects(polygon))要访问的变量时,据我所知,该变量尚未定义。你定义line1line2前面的代码。我不知道为什么会返回True。
Paul

2
我也想知道答案。似乎只能将单个几何列分配给地理数据框。我认为您的line_gdf数据框尝试添加两个几何列。请查看 geopandas.org/data_structures.html#geodataframe
Paul

@保罗,我很抱歉,print(line.intersects(polygon))是一个错字。我已经更新了问题,以指代line1我最初的意思。
bgordon '17

@Paul我可以从文档中看到有两个几何列将如何引起问题,但是我不太确定为什么要首先添加两个几何列。
bgordon '17

line_gdf.info确认您只有一个几何列。我很困惑 如果发现任何问题,我会跟进。
保罗

Answers:


7

在Geopandas中比较地理数据框和几何操作时,首先按索引匹配几何。如果没有匹配的索引(例如,因为您只有一个多边形),则结果将为False

如果要比较中的每个对象,则GeoSeries需要取回一个具有布尔值的完整矩形数据框,这可能效率很低。

如果确实要比较所有几何形状,则有两个选择。第一种(可能是最简单的)是使用geopandas sjoin方法:

gpd.sjoin(line_gdf, poly_gdf, op='intersects')

这将返回一个新GeoDataFrame的对象,其左侧数据框中的每个对象的几何形状对于它们在右侧相交的每个几何形状重复,其对象的索引在右侧,即:

                        geometry  index_right
0  LINESTRING (0.5 0.5, 0.7 0.7)            0
1  LINESTRING (0.9 0.9, 0.2 0.6)            0

第二种方法是对我们的pandas apply方法GeoSeries返回矩形数据框:

line_gdf.geometry.apply(lambda g: poly_gdf.intersects(g))

依次返回(随着数据帧的增长,效率越来越低):

index_right     0
index_left
0            True
1            True

通常,除非需要平方矩阵,否则我的建议是坚持使用该sjoin方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.