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

如何在同一地理数据框中获得多边形与其他多边形的交点?

孔飞舟
2023-03-14

我有一个包含数千个多边形的形状文件。他们中的许多人接触但不交叉。我需要接电话的公用线路。

我尝试使用下面的函数来达到我的目的,但是输出显示了一些MultiLineString,其中的行只有两个点,这应该是一个整体LineString

def calcu_intersect_lines(cgidf):

    intersection = gpd.GeoDataFrame(columns=['geometry'], crs=cgidf.crs)

    while len(cgidf) > 1:
        choose = cgidf.iloc[0]
        cgidf.drop(cgidf.index[0], inplace=True)
        for i in range(len(cgidf.index)):
            cgids = cgidf.iloc[i]
            if choose.geometry.exterior.intersects(cgids.geometry.exterior):
                intersects = choose.geometry.exterior.intersection(cgids.geometry.exterior)
                index = len(intersection)
                intersection.loc[index] = [intersects]

            else:
                continue

        return intersection

对于MultiLineString,我尝试使用shapely.geometry.LineString.union()函数在同一个MultiLineString中连接两个短行,如果它们彼此接触。但是结果也显示了一个MultiLineString

geopandas本身的交叉功能似乎也会导致多重限制。

是否有任何方法返回正常结果(LineStringnotMultiLineString用于连续公用线路)?

下面是一个输入和输出数据的小例子:

a = Polygon(((0, 0), (0, 0.5), (0.5, 1), (1, 0.5), (1, 0), (0.5, -0.5), (0, 0)))
b = Polygon(((0, 0.5), (0.5, 1), (1, 0.5), (1, 2), (0, 0.5)))
c = Polygon(((1, 0.5), (1, 0), (0.5, -0.5), (1.5, -1), (1, 0.5)))
gdf = gpd.GeoDataFrame(columns=['geometry'], data = [a, b, c])
h = calcu_intersect_lines(gdf)

下面是h的值:

index  geometry
0      MULTILINESTRING ((0 0.5, 0.5 1), (0.5 1, 1 0.5))
1      MULTILINESTRING ((1 0.5, 1 0), (1 0, 0.5 -0.5))

两个多字符串中的行字符串分别具有公共点(0.5,1)(1,0)

我想要的结果如下所示:

index  geometry
0      LINESTRING (0 0.5, 0.5 1, 1 0.5))
1      LINESTRING (1 0.5, 1 0, 0.5 -0.5))

可能的解决办法:

在评论中,建议我替换以下行

intersection.loc[index] = [intersects]

通过

intersection.loc[index] = [LineString([*intersects[0].coords, *map(lambda x: x.coords[1], intersects[1:])])]

它在我的简单例子中运行良好。然而,对于真正的shapefile,它将比这复杂得多。可能有以下几种情况:

>

  • 具有多条公共线的两个多边形。

    from shapely.geometry import Polygon
    
    a = Polygon(((0., 0.), (0., 0.5), (0.5, 1.), (1., 0.5), (1., 0.), (0.5, -0.5), (0., 0.)))
    b = Polygon(((0., 0.5), (0.5, 1.), (1.2, 0.7), (1., 0.), (0.5, -0.5), (2., 0.5), (0., 2.)))
    

    对于ab,它们有两个pubilc行LineString(((0., 0.5), (0.5, 1.)))LineString(((1., 0.), (0.5, -0.5)))。在这种情况下,我可以简单地使用intersects函数来测试行是否接触。但是还有另一个问题:

    多行线中的行不整齐。

    from shapely.geometry import MultiLineString
    
    ml = MultiLineString((((2, 3), (3, 4)), ((0, 2), (2, 3))))
    

    对于ml,此建议将返回错误的结果。你对上面的第二个例子有什么想法吗?


  • 共有1个答案

    管梓
    2023-03-14

    感谢乔治和其他贡献者的帮助,我已经解决了我的问题。函数shapely。行动计划。这里介绍的linemerge()是我解决方案的关键点。

    我在这里发布我的解决方案:

    from shapely import ops
    
    def union_multils(ml):
    
        '''Union touched LineStrings in MultiLineString or GeometryCollection.
    
        Parameter
        ---------
        ml: GeometryCollection, MultiLineString or LineString
    
        return
        ------
        ul: MultiLineString or LineString: a MultiLineString suggest the LineStrings 
            in input ml is not connect entitly.
        '''
    
        # Drop Point and other geom_type(if exist) out
        ml = list(ml)
        ml = [l for l in ml if l.geom_type == 'LineString']
    
        # Union
        if len(ml) ==  1 and ml[0].geom_type == 'LineString':
            ul = ml[0]
        else:
            ul = ops.linemerge(ml)
    
        return ul
    
     类似资料:
    • 如何从多个地理位置(长,晚值)创建多边形地理围栏。也可以在Android上跟踪用户进入或退出该地理区域的情况。

    • 返回顶点的输入数组,并且附有一些其他方法,如下面所描述 polygon.area() 返回此多边形的标定区域。如果顶点是逆时针顺序,面积为正,否则为负。 polygon.centroid() 返回一个表示此多边形的质心的两元素数组。 polygon.clip(subject) 对这个多边形剪切主题多边形。换句话说,返回一个多边形表示这个多边形和主题多边形的交集。假定剪切的多边形是逆时针方向以及凸多

    • 我们是否可以使用符合以下条件的mongodb地理空间查询来查询和获取位置数据? 获取两个框或一般两个多边形之间交集的所有位置。 例如,在下面,我们能在查询输出中只获得那些位于黄色区域内的位置吗?黄色区域实际上是紫色和红色几何对象[多边形]的公共区域?

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

    • 我正在寻找一种方法来创建一组多边形(rechtangles),沿着一条线在多个多边形中创建一组多边形(rechtangles),并将其水平隔开,如图所示。 我尝试生成点并将其用作多边形的中点,但问题是,通过创建等间距的点光栅,除了180度之外,不可能以任何其他方向旋转。 例子 给出了一个多多边形形状的对象和由宽度和高度以及每个多边形之间的垂直和水平间距定义的多边形。多边形应仅放置在多多边形内,且不

    • 我目前正在使用JavaFX研究不同形状之间的边界相交。我想检测两个多边形在它们的点上的碰撞,而不是在它们的边界上(即2个多边形)。 请参阅图1:不期望的行为,以及图2:期望的行为。 是否有任何现有的算法可以帮助我或使用任何库?提前感谢:) 在这里找到我的解决方案: 输出: 它似乎工作正常,我将使用Path对象进行测试以替换多边形objets。