如何简化可路由网络?


24

减少边数的角度来看,我有一个网络图需要简化。想法是合并位于一起的节点并删除连接的短边。

在PostGIS或GRASS中如何实现?还是有更好的方法来自动简化这样的网络?

我已经尝试过ST_SnapToGrid函数,但对结果不满意(灰色=原始,黑色=贴紧):

在此处输入图片说明


1
您是要简化基于网络的分析还是出于显示目的?如果是前者,将执行什么分析?
ub

用于最短路径分析。
黑暗

2
因为许多最短路径算法都是O(E + V),也许您甚至不需要这种简化?在另一个极端,对于此类分析,您通常可以进行更为激进的简化。例如,如果没有任何起点或终点位于这些分段中,则该组三个平行分段及其左侧的相邻分段(看起来像盒子中的H)可以用三角形代替。我之所以这样说,是因为我确定那里有(非GIS)代码可用于(抽象)图上的此类操作。
ub

您要保持边缘的几何形状(例如曲线)还是仅保持拓扑+节点XY足够?另外,您是否需要确保位于不同Z的节点(例如,跨线桥)不会卡在一起?
AnserGIS 2014年

拓扑是关键。几何形状可以改变一点。Z顺序必须保持原样。
昏暗

Answers:


7

我到目前为止最接近的是:

v.clean input=roads output=snap5rmline tool=snap,rmline thresh=5 

它以5米的公差捕捉道路,并删除了所有零长度的线。这不是最佳解决方案,因为它似乎相当随机地捕捉到某个顶点。

在此处输入图片说明


确实,结果可能并不准确,但是v.clean的使用很有趣,感谢分享
simo

该图像是在草中创建的吗?
NetConstructor.com 2011年

该图显示了在QGIS中可视化的GRASS v.clean的结果。
黑暗

维护“怪异的十字路口”或坡度分离的道路有任何问题吗?
dassouki 2014年

v.clean之后如何处理ST_SnapToGrid?
kttii

5

您是否尝试过GRASS v.generalize

v.generalize允许您通过method属性选择泛化算法。有很多:道格拉斯,朗格,还原,鲁曼,博伊尔,滑动平均,距离加权,柴肯,厄米特,蛇,网络,位移

和额外的参数thresholddegree_threshangle_thresh(取决于选择的算法)可以帮助你得到一个准确的结果。

这是一个教程


谢谢你的链接。我尝试一下,但是我并没有真正获得方法和阈值的组合会给出我想要的结果。
黑暗

我真的找不到可以实现我想要的v.generalize方法。
昏暗

2
遗憾的是,该命令包含许多算法,但是正如您之前所说的那样,为获得预期结果而进行设置可能很复杂。也许是泛化算法大师,在这里?您是否也尝试过法?
simo

这里不是算法专家,但是我发现蛇方法是我过去进行的某些v.genralize运行的最佳方法。
maning 2011年

1
为了记录在案,迄今为止,GRASS SVN中的参数已得到简化。成为GRASS 6.4.2的一部分。
markusN

4

我还没有这样做,但我想我可以建议一个方向。

  1. 使用PostGIS为您的图形创建拓扑。
  2. 查找只有两个边的所有节点。
  3. 修复边缘。

ST_ModEdgeHeal将一个边缘合并到另一边缘。ST_NewEdgeHeal将用新边缘替换这两个边缘。

PostGIS拓扑手册


谢谢@Sean。除了合并两个边缘,这还能做其他事情吗?关于如何删除短边并将其节点对齐在一起的想法吗?
昏暗

@Underdark,我看不到任何简单的东西。您可以在PL / SQL中完成所有操作,但这可能无济于事。您可以先运行ST_SnapToGrid吗?
肖恩

1

@underdark,我看到您已经编写了一种工具来在Sextante中使变密。因此,我建议使用以下算法来避免“随机”抢占您的观点之一。

根据长度选择要删除的线段。

对于每个分段,在中间点创建一个点

删除小段

现在您可以在PostGIS中使用ST_Snap(请参见此处的示例)

编辑:请注意,在您的情况下,您也可以先使用v.net来删除伪节点(仅连接两行的节点)


请详细说明如何使用v.net删除伪节点。谢谢
osmjit

0

转发了MichaëlMichaud如何在OpenJUMP开发人员列表中对此进行了分析:

> Interesting question. There has been so much research works about
> generalization that it is surely not a simple task. I have tested the
> following approach with mitigated results :
> - make the layer planar with the noder plugin
> - detect small cycles with the graph plugin
> - merge adjacent cycles
> - create a point inside each cycles surface
> - remove network segments along these cycles (query + DE-9IM)
> - detect roads touching the cycles
> - project the center points of cycles to the road endpoints ==> replace small roundabout by simple nodes
> 
> Possible improvements (probably need a dedicated plugin)
> - make it work on non planar graph (or just remove bridges/tunnels from the graph)
> - replace small edges between two nodes with degree 3+ by a single node,    not only small cycles
> - process iteratively starting with smallest edges/cycles

感谢您发布此答案。我有些困惑,为什么要强制将图形平面化。毕竟,街道网络不是平面图(桥梁,隧道)。
昏暗

仅仅因为Michaël用他为OpenJUMP编写的现有图形工具进行了快速测试,并且它们目前不支持非平面图形。如果QGIS和GRASS具有支持非平面图的类似工具,则跳过第一步。
user30184 2014年

我认为这是正确的方法-将网络分离成平面图。在每个平面图中,问题都比较简单-例如,可以使用上述方法,或者简单地对短路边的TIN进行三角剖分和除草。然后再次提取道路边缘并将图层合并在一起。
AnserGIS 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.