一、需求背景
先明确一下“线重叠”的定义。
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):