当前位置: 首页 > 知识库问答 >
问题:

Geopandas-与多边形相交的分割线,在新的链接属性中保留多边形ID

夏景同
2023-03-14

我有两个地理数据帧:一个包含许多线性字符串,另一个包含许多多边形。这些线和多边形相互交叉。我试图实现的输出是一个新的地理数据帧,包含在它们相交多边形的任何位置被分割的链接。

简化测试代码如下:

import geopandas
from shapely.geometry import Polygon, LineString

#Create geodataframe containing 2 links:
linkID = ['1','2']
link_geom = [LineString([(0, 0), (10, 10)]),LineString([(10, 10), (20, 10)])]
a = {'linkID':linkID,'geometry':link_geom}
gdf_links = geopandas.GeoDataFrame(a)

#Create geodataframe containing 2 polygons:
polyID = ['100','200']
poly_geom = [Polygon([(2, 1), (2, 3), (4, 3), (4, 1)]),Polygon([(15, 7), (15, 13), (18, 13), (18, 7)])]
b = {'polyID':polyID,'geometry':poly_geom}
gdf_poly = geopandas.GeoDataFrame(b)

通过运行以下代码,可以看到直线与多边形相交:

links = gdf_links.unary_union
polys = gdf_poly.unary_union
geopandas.GeoSeries([links,polys]).plot(cmap='tab10')

它生成下图(注释以红色/绿色添加,以显示所涉及的各种元素):

将两条线拆分为6段(如上图中绿色标记)。

理想情况下,我想要实现的输出如下所示,带有一个“poly_intersect”列,列出发生拆分的多边形的ID。请注意,项目2和5列出了两个多边形ID,因为它们与多边形相交两次。

共有1个答案

华宪
2023-03-14

您可以通过对带有多边形的线条进行“覆盖”(覆盖时使用“联合”操作)来获得这些线串。但是,它不会给出您为“poly_intersect”列描述的预期结果:

>> geopandas.overlay(gdf_links, gdf_poly, how='union').explode().reset_index(drop=True)

  linkID polyID                   geometry
0      1    100      LINESTRING (2 2, 3 3)
1      2    200  LINESTRING (15 10, 18 10)
2      1    NaN      LINESTRING (0 0, 2 2)
3      1    NaN    LINESTRING (3 3, 10 10)
4      2    NaN  LINESTRING (10 10, 15 10)
5      2    NaN  LINESTRING (18 10, 20 10)

一些评论:

  • 我使用的是explode(),因为overlay()操作会在与多边形相交之前和之后为一条线字符串的部分返回多行字符串。分解将拆分这些“多”几何体
  • “polyID”列表示哪些线串源自与多边形相交的线串。但它没有它们所接触的多边形的其他线串的信息

因此,如果您还需要该信息(完整的“poly_intersect”列),可以进行后续分析,检查哪些线串与哪些多边形接触。

 类似资料:
  • 我不熟悉geopandas,只想绘制多边形的轮廓,类似于PostGIS中的函数 我有一个地理数据框包含每个状态的多边形 当我按一个状态划分子集时,我能够绘制该状态: 我只对轮廓感兴趣,但在留档中不清楚如何将多边形转换为线几何。在或其他空间库中是否有有用的方法可以帮助将多边形转换为线性字符串?

  • 我有一个geopandas数据框,由一个id和一个由2D点填充的几何列组成。我想为每个唯一id连接点以创建一个多边形,以便我的新数据帧将多边形作为其几何体。我的代码当前看起来像这样: 它创建了一个多边形,但当我指定新变量时,它会显示 这很有意义,因为它仍然只是一个坐标列表,而不是实际的多边形对象。有人知道如何将它变成一个实际的多边形对象,我可以将它添加到geopandas上的列中吗 提前感谢:)

  • 我有一个对象。该对象有一个功能,即多边形对象,它本身由多个多边形对象组成。 我想子集空间多边形对象,以便多边形对象只有一个多边形对象,即面积最大的多边形。 我已经尝试了许多不同的方法,但都不知道如何在子多边形层次上设置子集。 下面是一个例子: 在此示例中,SpP有一个多边形对象。多边形对象的第一个子多边形具有面积5.5,第二个子多边形具有区域1.5。我希望将SpatialPolygons对象子集化

  • 我有一个横跨各种多边形的线串,存储为GeoJsons。我想在每个多边形区域内将线条分割成单独的部分。然而,我还没能做到这一点。这是我到目前为止的一个可复制的例子: 然后我尝试通过多边形分割直线,如下所示: 但我得到了以下输出,这似乎不正确: 我期望有三条线,一条存在于正方形多边形内,然后两条分别存在于多边形外。

  • 假设我有两个不相交的多边形组/“岛屿”(想想两个不相邻县的人口普查区)。我的数据可能看起来像这样: 我希望每个岛内的多边形采用表示其组的ID(可以是任意的)。例如,左下角的3个多边形的IslandID为1,右上角的3个多边形的IslandID为2。 我已经开发了一种方法来做到这一点,但我想知道这是否是最好/最有效的方法。我做以下工作: 1) 创建一个几何体等于多多边形一元并集内多边形的地理数据框。

  • 我有两个形状多边形实例(由lon,lat点组成),在不同的部分相交。我试图遍历,确定两个多边形之间是否有交集,然后创建一个新的多边形,排除该交集。从所附的图像来看,我基本上不希望红色的圆圈与黄色的轮廓重叠,我希望边缘正好是黄色轮廓开始的地方。 我已经尝试按照这里的说明,但它根本没有改变我的输出,而且我不想将它们合并到一个级联的联合中。我没有得到任何错误消息,但是当我将这些多边形添加到一个KML文件