如何在PostGIS或GRASS中实现?还是有更好的方法来自动简化这样的网络?
我已经尝试过ST_SnapToGrid函数,但对结果不满意(灰色=原始,黑色=固定):
#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
评论
您是要简化基于网络的分析还是出于显示目的?如果是前者,将执行什么分析?用于最短路径分析。
因为许多最短路径算法都是O(E + V),也许您甚至不需要这种简化?在另一个极端,对于此类分析,您通常可以进行更为激进的简化。例如,如果三个起始线段及其左侧的相邻线段(看起来像一个盒子中的盒子)的集合中没有起点或终点,则可以将其替换为三角形。我之所以这样说,是因为我确定那里有(非GIS)代码可用于(抽象)图上的此类操作。
您要保持边缘的几何形状(例如曲线)还是仅保持拓扑+节点XY足够?另外,您是否需要确保位于不同Z的节点(例如,跨线桥)不会卡在一起?
拓扑是关键。几何形状可以改变一点。 Z顺序必须保持不变。