数据融合工具(10)线重叠检查修复

一、需求背景

        先明确一下“线重叠”的定义。

        ArcGIS拓扑工具集中的拓扑规则:

  • 不能自重叠(线) —线要素不得与自身重叠。这些线要素可以交叉或接触但不得有重合的线段。此规则适用于街道等线段可能接触闭合线的要素,但同一街道不得出现两次相同的路线。

  • 不能重叠(线) —线不得与同一要素类(或子类型)中的线重叠。例如,当河流要素类中线段不能重复时,使用此规则。线可以交叉或相交,但不能共享线段。

图片

 1.1 拓扑错误修复

        对于“不能自重叠”错误,使用“简化”(从要素中移除导致错误的自重叠或自相交的线段),此修复可以应用到一个或多个错误。

        对于“不能重叠”错误,使用“移除重叠”(移除导致错误的要素重叠部分),此修复只能一条记录一条记录修复。

        需求来了,能不能,一个工具,解决所有的“重叠”错误,并记录修复情况呢?

        毕竟,重叠错误可能是这样的?多如烟海……

图片

1.2 剖析一下

        01 说一说?自重叠

        我们知道,线是由一系列点按给定的顺序依次连接构成的。线自重叠,只需要线节点连接出现往复或压盖即可发生,如下图所示。

图片

 

 

        在理想数据下,实现线自重叠的判断,自重叠部分的查找以及自重叠的修复代码如下:

图片

from shapely.geometry import LineString, Point, MultiLineString
from shapely.ops import linemerge
import numpy as np
from itertools import combinations


# 将折线转换为线段
def create_segments(polyline):
    segments = []

    # 如果输入是列表或ndarray
    if isinstance(polyline, (list, np.ndarray)):
        coords = polyline if isinstance(polyline, list) else polyline.tolist()
        for i in range(len(coords) - 1):
            line = LineString([coords[i], coords[i + 1]])
            segments.append(line)

    # 如果输入是LineString
    elif isinstance(polyline, LineString):
        coords = list(polyline.coords)
        for i in range(len(coords) - 1):
            line = LineString([coords[i], coords[i + 1]])
            segments.append(line)

    # 如果输入是MultiLineString
    elif isinstance(polyline, MultiLineString):
        for line_string in polyline.geoms:
            coords = list(line_string.coords)
            for i in range(len(coords) - 1):
                line = LineString([coords[i], coords[i + 1]])
                segments.append(line)

    else:
        raise TypeError("当前数据类型不支持!")

    return segments


def calculate_slope(line):
    x1, y1 = line.coords[0]
    x2, y2 = line.coords[-1]
    if x2 - x1 != 0:
        slope = (y2 - y1) / (x2 - x1)
    else:
        slope = np.inf  # 垂直线的斜率定义为无穷大
    return slope


def judge_overlapping(multi_line):
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

craybb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值