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

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

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



评论

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

用于最短路径分析。

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

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

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

#1 楼

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

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


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



评论


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

–simo
2011年7月19日14:12



该图像是在草中创建的吗?

– NetConstructor.com
2011-11-5 10:46

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

– Underdark♦
2011年11月5日,11:30

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

– dassouki
14年5月29日在16:49

v.clean之后如何处理ST_SnapToGrid?

–kttii
16年5月25日在13:46

#2 楼




您是否尝试过GRASS v.generalize吗?

v.generalize允许您使用method属性选择泛化算法。有一堆:douglas,douglas_reduction,lang,reduction,reumann,boyle,sliding_averaging,distance_weighting,chaiken,hermite,snakes,network,displacement。有关所选算法的信息)可能会帮助您获得准确的结果。

这里有一个教程。

评论


谢谢你的链接。我正在尝试一下,尽管我并没有真正得到方法和阈值的组合会给出我想要的结果。

– Underdark♦
2011年7月19日在8:56

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

– Underdark♦
2011年7月19日在10:19

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

–simo
2011年7月19日在10:37

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

–maning
2011年7月19日在11:28

为了记录在案,到目前为止,GRASS SVN中的参数已经简化。成为GRASS 6.4.2的一部分。

– markusN
2011年7月25日在22:25

#3 楼

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


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

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

PostGIS拓扑手册

评论


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

– Underdark♦
11年7月20日在19:33

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

– Sean
2011年7月22日在14:23

#4 楼

@underdark,我看到您已经编写了一个工具来在Sextante中使行增密。因此,我建议使用以下算法来避免“随机”捕捉到您的一个点。

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

每个段,在中间点创建一个点

删除小段

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

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

评论


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

– osmjit
17年5月9日在8:01

#5 楼

转发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


评论


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

– Underdark♦
2014年5月29日在17:02

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

–user30184
2014年5月29日19:45



我认为这是正确的方法-将网络分离成平面图。在每个平面图中,问题都比较简单-例如,可以使用上述方法,或者简单地对短路边的TIN进行三角剖分和除草。然后再次提取道路边缘并将图层合并在一起。

– AnserGIS
2014年6月3日下午6:42