가장자리 수를 줄이려 면 단순화해야하는 네트워크 그래프가 있습니다. 아이디어는 서로 가까이 위치한 노드를 병합하고 연결 짧은 모서리를 제거하는 것입니다.
PostGIS 또는 GRASS에서 어떻게 이것을 달성 할 수 있습니까? 아니면 이와 같은 네트워크를 자동으로 단순화하는 더 나은 방법이 있습니까?
이미 ST_SnapToGrid 함수를 시도했지만 결과에 만족하지 않습니다 (회색 = 원본, 검정 = 스냅).
가장자리 수를 줄이려 면 단순화해야하는 네트워크 그래프가 있습니다. 아이디어는 서로 가까이 위치한 노드를 병합하고 연결 짧은 모서리를 제거하는 것입니다.
PostGIS 또는 GRASS에서 어떻게 이것을 달성 할 수 있습니까? 아니면 이와 같은 네트워크를 자동으로 단순화하는 더 나은 방법이 있습니까?
이미 ST_SnapToGrid 함수를 시도했지만 결과에 만족하지 않습니다 (회색 = 원본, 검정 = 스냅).
답변:
내가 지금까지 온 가장 가까운 것은 다음과 같습니다.
v.clean input=roads output=snap5rmline tool=snap,rmline thresh=5
5m의 공차로 도로를 잠그고 길이가 0 인 모든 선을 제거합니다. 정점에 무작위로 스냅하는 것처럼 보이기 때문에 최적의 솔루션이 아닙니다.
GRASS v.generalize를 사용해 보셨습니까 ?
v.generalize
method 속성을 사용하여 일반화 알고리즘을 선택할 수 있습니다 . 다발이있다 : 더글라스, douglas_reduction, 랭, 감소, 로이 만, 보일, 슬라이딩 평균, 거리 가중치, 의자, 은둔, 뱀, 네트워크, 변위 .
그리고 추가 매개 변수로는 threshold
, degree_thresh
, angle_thresh
(선택 알고리즘에 따라) 당신이 정확한 결과를 얻을하는 데 도움이 될 수 있습니다.
여기 튜토리얼이 있습니다.
나는 이것을하지 않았지만 방향을 제안 할 수 있다고 생각합니다.
ST_ModEdgeHeal은 한쪽 가장자리를 다른 쪽 가장자리에 병합합니다. ST_NewEdgeHeal은 둘 다 새로운 모서리로 대체합니다.
@underdark, Sextante의 라인을 고밀도화 하는 도구를 작성 했음을 알았습니다. 따라서 "무작위"가 포인트 중 하나에 걸리지 않도록 다음 알고리즘을 제안합니다.
길이를 기준으로 제거 할 선 세그먼트를 선택하십시오.
이러한 각 세그먼트에 대해 중간 점에 점을 작성하십시오.
작은 세그먼트를 삭제
이제 PostGIS에서 ST_Snap을 사용할 수 있습니다 ( 여기 예제 참조 ).
편집 : 귀하의 경우 의사 노드 (두 줄만 연결하는 노드)를 제거하기 위해 v.net을 먼저 사용할 수도 있습니다
Michaël Michaud가 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