무료 GIS 소프트웨어에서 의사 노드를 찾으십니까?


16

소프트웨어 gvSIG OA Digital Edition 2010에는 선형 지오메트리에서 의사 노드를 찾기위한 도구 토폴로지가 있습니다. 20000 링크 수 선형 지오메트리에 대해 클러스터 공차 0.00002 및 최대 오류 수 -10000을 설정했습니다. 그러나 실패한 결과.

무료 GIS 소프트웨어에서 의사 노드를 찾는 솔루션이 있습니까?

의사 노드를 계층화해야합니다 (이 문제에 대한 한 가지 해결책-ArcInfo의 도구 토폴로지를 사용하지만 우선 순위는 자유 소프트웨어를 사용하는 것입니다). 선형 지오메트리는 QGIS 1.8.0에서 PostGIS (v. 2.0.1) 데이터베이스의 여러 사용자를 만들었습니다.

새로운 이미지 추가 : A (라인 4/5), B (라인 6/7), C (라인 9/10)에 3 개의 유사 노드가있는 12 개의 선형 피처. 의사 노드는 대신 점이어야합니다. 하나의 점 (노드)에 교점이있는 두 개의 선형 피처는 하나의 선형 피처 여야합니다 (라인 4/5-라인 4, ...).

PostGIS에서 요청을 할 수 있는데, 그 결과 의사 노드가 생성됩니까?

예제 의사 노드의 새 이미지 추가 : 선형 레이어 포인트 레이어 의사 노드 (파란색 rect)에 대해 수신하는 경우 선형 레이어에서 다음 오류를 수정했습니다. A-누락 된 형상 추가, B-교차 된 선 추가, C-의사 노드 제거.

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

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

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


2
GRASS에는 rmdangle 명령이 있지만 의사 노드가없는 shp 파일이 생성됩니다. 그 결과 의사 노드의 shp 파일 (또는 다른)이 있어야합니다 (gvSIG OA Digital Edition 2010 등)
HasT

PostGIS 2.0을 사용하십니까? 그렇다면 Is_Valid 및 Makevalid 함수를 사용해보십시오.
Giovanni Manghi

예, PostGIS 2.0을 사용합니다. 의사 노드를 검색하기 위해 이러한 기능을 어떻게 사용해야합니까? "PgQuery for QGIS"로 찾을 수 있습니까?
HasT

예. DBGI와 같은 PostGIS 쿼리를 실행할 수있는 도구 (구문 강조 표시 및 자동 완성을 지원하는 도구)에서 QGIS 내에서 사용할 수 있습니다.
Giovanni Manghi

두 번째 그림의 빨간색 점은 두 개의 유효한 지오메트리의 교차점입니다.
vinayan

답변:


8

PostGIS 또는 기타 OGC 호환 소프트웨어로 구현할 수있는 일반적인 솔루션입니다.

참고 : 앞에서 말했듯 이 FOSS 및 GIS의 핵심 개념은 표준화입니다 . 최상의 솔루션은 OGC 표준과 같은 표준을 채택 합니다.


당신의 문제는 "의사 노드를 찾는 것"입니다 ... 그러나 나는 그것이 "의사 노드가 아닌 의사 노드의 라인을 찾는 것"이라고 생각합니다. 내 솔루션을 모두 사용할 수 있습니다.

OGC 표준은 다음을 제공합니다.

  • ST_Boundary (geom) : 라인의 노드를 감지

  • ST_Dump (geom) : 각 단일 노드를 SQL 테이블 레코드에 넣습니다.

  • ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap을 변경 공차에 사용할 수 있습니다. ST_DWithin을 사용하고 있습니다.

이러한 객체와 속성으로 주요 문제를 지정할 수 있다고 가정 할 수 있습니다.

  • LINESTRING 지오메트리로 표시되는 ( 테이블 lineegment의 ) 선 세그먼트 만 있습니다 ... MULTILNE로 테스트하지 않았습니다. geometrytype = MULTIPOINT가있는 경우 ST_Dump 및 ST_LineMerge를 사용하여 MULTILINE을 분할하고 캐스트 할 수 있습니다.

  • 각 선분에는 (형상 ID) gid 및 (색상 ID) idline이 있습니다.

첫 번째 단계는 연결 라인에서 나오는 노드를 얻는 것입니다.

CREATE TABLE cache_bounds AS
  SELECT gid as gid_seg, (ST_Dump(ST_Boundary(the_geom))).geom AS the_geom,
         gid as color 
         -- if you not have something for "color label" of lines, use gid.
  FROM linesegment;
ALTER TABLE cache_bounds ADD column gid serial PRIMARY KEY;

CREATE TABLE cache_joinnodes AS
  -- Use your TOLERANCE instead "1" at ST_DWithin and ST_Buffer.
  SELECT *, array_length(colors,1) as ncolors FROM (
   SELECT gid, array_distinct(array_cat(a_colors,b_colors)) as colors, the_geom FROM (
    SELECT 
      a.gid, array_agg(a.color) as a_colors, array_agg(b.color) as b_colors
      , st_buffer(a.the_geom,1) as the_geom -- any one to represent the join point.
    FROM cache_bounds a, cache_bounds b 
    WHERE a.gid>b.gid AND ST_DWithin(a.the_geom,b.the_geom,1)
    -- use ST_equals(a.the_geom,b.the_geom) if no tolerance.
    GROUP BY a.gid, a.the_geom
   ) as t
  ) as t2;

참고 : 캐시는보기보다 빠르기 때문에 캐시를 사용합니다. CPU 시간을 확인하려면 "EXPLAIN SELECT ..."를 사용하십시오. 시간이 오래 걸릴 수 있습니다.

여기에서 사이클과 연속 (동일한 색상) 선은 ncolors=1점 으로 감지되고 의사 노드는 ncolors=2점 별로 감지 되므로 해당 점이있는 레이어가 있습니다.

"양호한 노드"테이블은 원래 "경계점"및 "의사 노드"가 없습니다.

CREATE VIEW vw_joinnodes_full AS
  SELECT b.*, j.ncolors
  FROM cache_joinnodes j INNER JOIN cache_bounds b 
       ON j.gid=b.gid;

CREATE TABLE cache_good_nodes AS
  SELECT *  
  FROM vw_joinnodes_full 
  WHERE ncolors=1 OR ncolors>2;

-- IF NEED ... CREATE VIEW vw_correct_linesegment AS ... 

솔루션 주셔서 감사합니다! pgAdmin에서 쿼리를 실행하려고하지만 "function array_distinct (integer []) 존재하지 않음"예외가 발생합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?
HasT

인용되지 않은 array_distinct기능은 postgres.cz 라이브러리에서 온 것 입니다. 다른 오류는보고하십시오. 여기에 설명을 더 추가 할 수 있습니다.
Peter Krauss

array_distinct 함수를 추가했습니다. 데이터베이스 선형 계층에서 "the_geom"기하학 열 이름 (쿼리의 "geom")이 있습니다. 쿼리를 실행 한 후 "ST_Boundary (the_geom)"에 대해 "geom"을 "the_geom"으로 바꾸고 "색상, geom FROM"위치에 "열"geom "이 없습니다"라는 메시지가 표시됩니다. "색상, geom FROM"으로 "색상, the_geom FROM"으로 바꾸지 만 "열"the_geom "이 존재하지 않습니다"라는 메시지가 다시 나타납니다.
HasT

좋아, (편집 된 답변 참조) geom로 변경되었습니다 the_geom. (ST_Dump (x)) 는 geom으로 유지되며 데이터베이스 속성이 아닙니다.
Peter Krauss

감사! 쿼리가 작동합니다. ST_equals에서 ST_DWithin을 대체하고 ST_Buffer에 대해 0.00002 DD 공차를 제공합니다. 결과적으로 올바른 노드를 받았습니다 (한 노드에서 3 개 이상의 선형 피처와 교차하는 곳). 한 노드에서 2 개의 선형 피처 (FROM vw_joinnodes_full WHERE ncolors = 2;)와 교차하는 결과를 원하지만 한 노드에서 2 개 이상의 선형 피처와 교차하는 수신 포인트 레이어. 한 노드에서 2 개의 선형 피쳐 만 교차하는 결과를 어떻게 수신합니까?
HasT

7

Refractions Research에서 원하는대로 하는 Line Cleaner 도구 를 만들었습니다 .

Line Cleaner는 복잡하고 주기적이며 매우 짧고 길이가 0 인 형상을 단순화하고 의사 노드와 중요하지 않은 꼭지점을 제거하여 네트워크를 정리합니다. 가장 중요한 것은 정리 단계에서 기능 일치를 자동으로 고려할 수 있다는 것입니다.

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

소스 코드는 GitHub의에서 찾을 수 있습니다.


답변 감사합니다. 그러나 오류의 결과 의사 노드에는 포인트 레이어가 필요합니다. 한 노드에서 3 개의 선을 교차해야하지만 한 줄은 건너 뛰거나 정점에 스냅되지 않는 경우가 있으므로 이러한 오류는 사용자가 수동으로 수정해야합니다.
HasT

제대로 작동하는 것 같습니다. 여기서 말하는 것을 정확히 이해하는 데 어려움이 있습니다. "오류의 ​​결과 의사 노드에는 포인트 레이어가 필요합니다"나는 이것이 의미하는 바를 이해하지 못합니다. 이것이 작동하려면 각 선의 끝에 점이 스냅 된 점 레이어가 필요합니까?
Rayner

@Rayner, 예제 의사 노드의 새 이미지 추가 (3) : 선형 레이어 포인트 레이어 의사 노드 (파란색 교정)에 대해 수신하면 선형 레이어에서 다음 오류를 수동으로 (자동으로 수정하지 않음) 수정합니다 .A-누락 된 형상 추가, B-스냅 교차 라인, C-의사 노드 제거. 자동 의사 노드를 수정하면 A, B에 오류가 남았습니다.
HasT

좋아, B와 C를 이해한다 두 줄이 만나는 곳에 추가해야 할 점이 있습니까?
Rayner

@Rayner, 그것은 'A'에서 선형 기능 (이미지에 따라 거리 / 도로)을 추가 해야하는 것을 의미합니다. А-노드는 이미지에 따라 새로운 지오메트리를 추가 할 준비가되었지만 지오메트리는 추가되지 않았습니다 (레이어 의사 노드를 사용하여 페인트 지오메트리를 사용하지 않음)
HasT

2

무료 솔루션 : FME + MRF + SmartCleaner 변압기

무료 솔루션 GRASS v.clean (GRASS 도구가 포함 된 최신 QGIS 1.8.0을 사용하는 것이 가장 쉬운 방법 임) 및 기타 토폴로지 청소 도구


QGIS 1.8.0. C : \ Program Files \ Quantum GIS Lisboa \ apps \ qgis \ python \ plugins 디렉토리 (1.0.7)에 SEXTANTE 플러그인을 설치하십시오. QGIS 프로젝트 (CRS 레이어 및 프로젝트 WGS1984, '즉석에서'변환)에 선형 shp 파일을로드합니다. 그런 다음 '캔버스에 GRASS 영역 정의'(GRASS 명령-도구)를 적용하고 v.clean-rmdangle 명령을 실행하십시오 (서열 = 0, 출력 벡터 / 오류에 대한 dir / name 입력). 실행 후 프로세스 오류 '레이어를로드 할 수 없습니다 : D : /error.shp 오류를 보려면 SEXTANTE 로그를 확인하십시오.' TOC에 새 레이어가 추가되면 오류가있는 레이어가로드되지 않습니다.
HasT

1
GRASS 존재 명령 v.build.polylines에서 - 내가받을 두 줄에서 한 사람 한 정점 (삭제 의사 노드),하지만 난 플러그인 SEXTANTE에서 찾을 수없는이 명령의 교차
네가

@simplexio 의사 노드를 식별하는 데 사용할 수있는 v.clean 옵션을 제안 해 주시겠습니까
osmjit

2

다음은 무료 GIS 인 OpenJump를 사용하여 의사 노드를 찾는 단계입니다.
QGIS와 gvSIG는 Sextante 플러그인을 가지고 있으므로, 동일한 단계가 작동해야
합니다. 공간 조인은 약간 다를 수 있습니다.
테스트에 버전 1.2를 사용했습니다.

-선 끝점
Sextante 도구 상자, 토폴로지, 선 끝점 추출-> endpt_0-

선을 분리합니다
Sextante 도구 상자, 선 레이어 도구, 인접한 선 결합 -분리되지 않은

선 끝점
Sextante 도구 상자, 토폴로지, 끝점 추출 line-> endpt_1-

"인접한 라인 결합"으로 제거 된 엔드 포인트는 의사 노드

도구, 쿼리, 공간 쿼리,
소스 계층 "endpt_0"
관계 "교차"
마스크 레이어 "endpt_1"

활성화 또는 클릭 보완 결과


답변 해주셔서 감사합니다! QGIS Sextante에서이 단계를 수행하려고하는데 "줄의 끝점 추출"및 "인접한 줄 연결"명령을 찾을 수 없습니다. QGIS Sextante (gvSIG 1.12에는 이러한 명령이 존재 함) 또는 v.build.polylines 명령을 추가 할 수 있습니까?
HasT

방금 QGIS sextante 플러그인을 설치했습니다. 전체 기능을 보지 못하고 많은 기능이 누락되었습니다. 쉐이프 파일에서 gvSIG의 단계를 쉽게 테스트 할 수 있어야합니다.
klewis

방금 gvSIG 2.4.0.2834에서 위의 워크 플로우를 확인했으며 정상적으로 작동합니다. 마지막 단계를 다른 두 개의 도구 상자 지오 프로세스로 대체했습니다. 먼저 gvSIG "Spatial Join" , 두 번째는 "Filter vector layer"DIST > 0표현식으로 사용 합니다. 또한 모든 지오 프로세스를 SEXTANTE 모델로 연결하여 "의사 노드 찾기" 와 같은 새로운 도구를 만들 수 있습니다 .
Antonio Falciano


1

유사 노드는 2 개의 라인 스트링을 인터셉트하는 노드이고 매달려는 1 개의 라인 스트링을 인터셉트하는 노드이므로 PostGIS를 사용하면 수정 된 버전의 쿼리를 사용 하여이 주제 에서 논의 된 댕글을 찾을 수 있습니다.

WITH nodes AS 
(SELECT ST_StartPoint(geom) AS pt FROM
linestring_table UNION ALL 
SELECT ST_EndPoint(geom) AS pt FROM
linestring_table) 
SELECT pt FROM nodes
GROUP BY pt HAVING count(*) = 2;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.