라우팅 가능한 네트워크를 단순화하는 방법?


24

가장자리 수를 줄이려 면 단순화해야하는 네트워크 그래프가 있습니다. 아이디어는 서로 가까이 위치한 노드를 병합하고 연결 짧은 모서리를 제거하는 것입니다.

PostGIS 또는 GRASS에서 어떻게 이것을 달성 할 수 있습니까? 아니면 이와 같은 네트워크를 자동으로 단순화하는 더 나은 방법이 있습니까?

이미 ST_SnapToGrid 함수를 시도했지만 결과에 만족하지 않습니다 (회색 = 원본, 검정 = 스냅).

여기에 이미지 설명을 입력하십시오


1
네트워크 기반 분석을 단순화하거나 표시 목적으로이 작업을 수행하고 있습니까? 전자의 경우 어떤 분석이 수행됩니까?
— whuber

최단 경로 분석을위한 것입니다.
— underdark

2
최단 경로 알고리즘이 O (E + V)이기 때문에이 단순화가 필요하지 않습니까? 다른 극단적 인 경우, 그러한 분석을 위해 종종보다 적극적으로 단순화 할 수 있습니다. 예를 들어 왼쪽에있는 3 개의 평행 세그먼트와 인접한 세그먼트 (상자에 보이는 모양)를 원점이나 목적지가 해당 세그먼트 내에 없으면 삼각형으로 대체 할 수 있습니다. (추상적 인) 그래프에서 그러한 작업을 위해 (GIS가 아닌) 코드가 있기 때문에 이것을 언급합니다.
— whuber

모서리의 지오메트리 (예 : 곡선)를 유지 하시겠습니까, 아니면 토폴로지 + 노드 XY 만 유지 하시겠습니까? 또한 다른 Z (예 : 플라이 오버)의 노드가 서로 스냅되지 않도록해야합니까?
— AnserGIS 2016 년

토폴로지가 핵심입니다. 형상이 약간 변경 될 수 있습니다. Z 순서는 그대로 유지해야합니다.
— underdark

답변:


7

내가 지금까지 온 가장 가까운 것은 다음과 같습니다.

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

5m의 공차로 도로를 잠그고 길이가 0 인 모든 선을 제거합니다. 정점에 무작위로 스냅하는 것처럼 보이기 때문에 최적의 솔루션이 아닙니다.

여기에 이미지 설명을 입력하십시오


실제로 결과는 정확하지 않을 수 있지만 공유해 주셔서 감사합니다. v.clean 을 사용하는 것이 흥미 롭습니다.
— simo

그 이미지는 잔디로 만들어 졌습니까?
— NetConstructor.com

이미지는 QGIS에서 시각화 된 GRASS v.clean의 결과를 보여줍니다.
— underdark

"이상한 교차로"또는 등급별 도로를 유지하는 데 문제가 있습니까?
— dassouki

v.clean 후 ST_SnapToGrid를 처리하는 것은 어떻습니까?
— kttii

5

GRASS v.generalize를 사용해 보셨습니까 ?

v.generalizemethod 속성을 사용하여 일반화 알고리즘을 선택할 수 있습니다 . 다발이있다 : 더글라스, douglas_reduction, 랭, 감소, 로이 만, 보일, 슬라이딩 평균, 거리 가중치, 의자, 은둔, 뱀, 네트워크, 변위 .

그리고 추가 매개 변수로는 threshold, degree_thresh, angle_thresh(선택 알고리즘에 따라) 당신이 정확한 결과를 얻을하는 데 도움이 될 수 있습니다.

여기 튜토리얼이 있습니다.


링크 주셔서 감사합니다. 방법과 임계 값의 조합이 내가 원하는 결과를 줄 수는 없지만 실제로 시도해보고 있습니다.
— underdark

나는 내가 원하는 것을 할 v.generalize 메소드를 찾을 수 없습니다.
— underdark

2
그것은 유감스럽고 명령에는 많은 알고리즘이 풍부하지만 앞에서 말했듯이 예상되는 결과를 얻기 위해 설정하는 것은 매우 복잡합니다. 아마 일반화 알고리즘 전문가일까요? 뱀 방법 도 사용해 보셨습니까 ?
— simo

여기에 algo-guru가 아니지만, 과거에 만든 v.genralize 실행 중 일부에 대해 뱀 방법이 가장 좋습니다.
— 11

1
기록을 위해 오늘 GRASS SVN에서 매개 변수가 단순화되었습니다. GRASS의 일부가 되려면 6.4.2.
— markusN

4

나는 이것을하지 않았지만 방향을 제안 할 수 있다고 생각합니다.

  1. 그래프에 PostGIS를 사용하여 토폴로지를 만듭니다.
  2. 모서리가 두 개인 모든 노드를 찾으십시오.
  3. 가장자리를 치료하십시오.

ST_ModEdgeHeal은 한쪽 가장자리를 다른 쪽 가장자리에 병합합니다. ST_NewEdgeHeal은 둘 다 새로운 모서리로 대체합니다.

PostGIS 토폴로지 매뉴얼


감사합니다 @Sean. 두 가장자리를 병합하는 것 외에 다른 작업을 수행합니까? 짧은 모서리를 제거하고 노드를 함께 스냅하는 방법에 대한 아이디어가 있습니까?
— underdark

@Underdark, 나는 간단한 것을 보지 못했습니다. PL / SQL에서 모든 것을 할 수는 있지만 도움이되지 않을 것입니다. ST_SnapToGrid를 먼저 실행할 수 있습니까?
— Sean

1

@underdark, Sextante의 라인을 고밀도화 하는 도구를 작성 했음을 알았습니다. 따라서 "무작위"가 포인트 중 하나에 걸리지 않도록 다음 알고리즘을 제안합니다.

길이를 기준으로 제거 할 선 세그먼트를 선택하십시오.

이러한 각 세그먼트에 대해 중간 점에 점을 작성하십시오.

작은 세그먼트를 삭제

이제 PostGIS에서 ST_Snap을 사용할 수 있습니다 ( 여기 예제 참조 ).

편집 : 귀하의 경우 의사 노드 (두 줄만 연결하는 노드)를 제거하기 위해 v.net을 먼저 사용할 수도 있습니다


가상 노드를 제거하기 위해 v.net을 사용하는 방법을 자세히 설명하십시오. 감사합니다
— osmjit

0

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

이 답변을 게시 해 주셔서 감사합니다. 그래프를 평면으로 강제하는 이유가 약간 혼란 스럽습니다. 결국 거리 네트워크는 평면 그래프 (교량, 터널)가 아닙니다.
— 언더 다크

Michaël이 OpenJUMP 용으로 작성한 기존 그래프 도구를 사용하여 빠른 테스트를 수행했으며 현재 비평면 그래프를 지원하지 않기 때문입니다. QGIS와 GRASS에 비평면 그래프를 지원하는 유사한 도구가있는 경우 첫 단계를 건너 뜁니다.
— user30184 2016 년

나는 이것이 올바른 접근법이라고 생각합니다. 네트워크를 평면 그래프로 분리하십시오. 각 평면 그래프에서 문제는 더 간단합니다. 예를 들어 위의 접근 방식을 사용하거나 짧은 도로 가장자리의 TIN을 삼각 측량하고 잡초를 제거 할 수 있습니다. 그런 다음 도로 가장자리를 다시 추출하고 레이어를 병합하십시오.
— AnserGIS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.