我需要编写一个函数来简化一组段。特别是:
给出二维线段的集合(x和y坐标)
因此,输入将是一大段细分(有很多重叠)并且输出将是不重叠的段,每个段都有计数。
如您所见,某些线条看起来较粗,因为存在多个重叠。结果,我只需要没有重叠的框架,但是我需要将重叠的信息作为每个输出段的数字。
我不是处理线段和几何问题的专家。解决此类问题的最有效方法是什么?我正在使用Matlab,但是任何高级语言的代码示例都可以帮助您。谢谢!
编辑根据要求,这里也是一个示例数据集,您可以从此google驱动器链接中获取它https://drive.google.com/open?id=1r2hkG7gI0qhzfP-Mmn8HzIil1o47Z2nA
输入是具有276电缆段的csv输出是具有58个电缆段(缩小的段)的csv +额外的一列,其中包含保留的每个段的重叠电缆数量。
输入可能包含更多细分。这样做的目的是减少电缆,以消除具有一定公差的平行且相互重叠的电缆。例如,如果2条电缆平行但相距较远,则应将两者都保留。
我不关心输出是否不同的公差,我只需要一个有关如何有效解决此问题的想法,因为即使有许多段作为输入,代码也应快速运行。
Matlab可能不是最适合几何操纵的语言。 PostgreSQL / PostGIS将是一个更好的工具,但是如果您没有选择,这里是一种获取行骨架的解决方案:
% Random points
P = [0 0;
1 1;
2 1;
1.01 1.02;
0.01 0.01];
% positive buffer followed by a negative buffer
pol = polybuffer(polybuffer(P,'lines',0.25,'JointType','miter'),-0.249,'JointType','miter');
plot(P(:,1),P(:,2),'r.','MarkerSize',10)
hold on
plot(pol)
axis equal
% Drop the duplicate with uniquetol (with a tolerance of 0.005) to get the centerline
utol = uniquetol(pol.Vertices,0.005,'ByRows',true)
hold off;
plot(utol(:,1),utol(:,2),'b')
结果:
和中心线: