유사한 라인을 비교하고 레이어를 업데이트


16

여기에는 거리를 나타내는 두 개의 레이어가 있으며 아이디어는 다음과 같습니다. 가장 최근 레이어 (빨간색 선)를 다른 레이어 (하늘색)에 저장된 일부 데이터로 업데이트하려고합니다. 지리적 위치와 유사하며지도의 위치에 따라 매우 가까울 수 있으며 조금 더 먼 곳이있을 수 있으며 한 줄은 다른 줄과 동일한 경우에만 일치합니다 (codlog x codlog5).

Qgis 레이어.

예를 들어 : 이미지 중간에 두 레이어에 정사각형이 있지만 맵에서 파란색을 인식하고 녹색을 인식하고 최근 레이어를 업데이트하려면 어떻게해야합니까?

어떻게하니? 도움이되는 플러그인이나 도구가 있습니까?


파란색 레이어의 속성 또는 파란색 레이어의 추가 기능으로 빨간색 레이어를 업데이트 하시겠습니까?
dmh126

속성 상황 : 빨간색 레이어에는 열 (a, b, c, d)이 있고 파란색 레이어에는 열 (d, e, f)이 있습니다. 다른 레이어의 열 (e, f)과 일치하는 결과를 빨간색 레이어에 추가하고 싶습니다.
Jhonatan Oliveira

conflation 플러그인에 대한 문서가 있습니다 . 개발이 완료되었는지 확실하지 않습니다.
Barbarossa

1
당신은 점프를 시도 했습니까?
radouxju

그러나 블루 라인의 열 "d"와 빨간색 라인의 "d"는 고유 한 공통 ID입니까? 그들은 무엇을 포함합니까?
Sergio

답변:


6

이것은 좋은 질문입니다. 최근에 비슷한 것을해야했지만 훨씬 더 작은 데이터 세트를 사용했기 때문에 시각적 품질 검사가 추가 된 간단한 교차로를 사용할 수 있었고 괜찮 았습니다.

그러나 여기에 코드가 없지만 이것에 대한 아이디어가 있으며, 이는 일종의 무거운 프로세스입니다. 먼저 전체 데이터 세트의 샘플로 확실하게 테스트하십시오. 여기에 유용한 코드가있을 수 있습니다. (들여 쓰기는 아래에서 약간 이상해졌습니다.) :

  1. 좋은 지오메트리 세트 (속성을 끝내고 자하는 곳)를 가져 와서 버퍼를 만듭니다. *

  2. 각 버퍼 기능을 반복하십시오.

    2a. 지형지 물의 일반적인 방향을 계산합니다 (max_y-min_y / max_x-min_x 또는 이와 유사한 것)

    2b. 이 단일 기능을 사용하여 다른 레이어에서 위치별로 쿼리를 선택하십시오.

    1. 위치 별 선택 쿼리와 일치하는 둘 이상의 기능이 있으므로 선택한 기능을 반복하고 각 기능의 방향을 계산하십시오.

    2. 버퍼 피처와 가장 가까운 방향을 가진 피처에서 속성을 가져옵니다.

* 매우 작은 거리 (하나의지도 단위 또는 다른 것)로 시작한 다음 거리를 늘리면서이 프로세스를 실행하면서 이미 전송 한 속성을 덮어 쓰지 않도록주의합니다.

** 실제로 버퍼 기능을 만드는 것을 잊어 버릴 수 있으며 버퍼 거리가있는 위치 별 선택 쿼리를 수행하면됩니다. QGIS에 익숙하지는 않지만 그렇게 할 수 있다고 확신합니다.

이것이 모든 기능에 완벽하게 작동하는 방법은 없지만 시작입니다. 그런 다음 전송을 확인하고 완료하기위한 좋은 QA / QC 전략을 개발해야합니다.

편집 이것에 대해 더 생각해 보면, 아주 작은 버퍼 거리로 시작하고 권장하는 방향과 가장 일치하는 기능을 선택하면 시스템을 완전히 파괴하는 기본 예가 있습니다.

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

잘못된 빨간색 선의 속성이 사용됩니다. 이를 피하기 위해 일종의 공차를 작성하고 오리엔테이션 (원래 파란색 피쳐의 방위와 비교할 때)의 방위가 해당 공차 내에있는 경우에만 피쳐의 속성을 사용할 수 있습니다.

편집 2 죄송합니다,이 다각형입니까? 방금 그들이 회색 배경에 선이라고 생각합니다. 그것들이 다각형이라면, 나는이 방향 개념이 좋은 것인지 잘 모르겠습니다. 그러나 모든 교차 기능을 선택하고 가장 겹치는 부분을 파악할 수 있습니다 (유니온 유형 도구를 실행 한 다음 가장 큰 면적의 다각형 사용).


그 논리는 건전합니다. C # / ArcObjects에서 비슷한 접근 방식을 사용하여 속성이있는 부정확 한 데이터 세트의 속성을 속성이없는 정확한 데이터 세트로 복사했습니다 ... 95 % 정확합니다. 좁은 공간에서는 수동 점검 / 고정이 필요했지만 모두 수동으로 수행하는 것보다 확실히 빠릅니다.
Michael Stimson

2

빨간색 레이어에서 파란색 레이어로 일부 속성을 추가하고 두 레이어에서 하나의 속성이 공통적 인 경우 Add Vector Join 을 사용해야 합니다.

나는 그것에 대해 여기에 썼습니다 .

  1. 레이어 패널에서 빨간색 shapefile 레이어를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택하십시오 .
  2. 그런 다음 조인 탭으로 이동 하십시오.
  3. 눌러 +의 버튼은 새로운 결합이 만들어집니다.
  4. 결합 레이어는 빨간색 shapefile 레이어입니다. 결합 필드는 공통 값이 모두있는 필드입니다. 대상 필드는 파란색 레이어에서 결합하려는 필드입니다.
  5. 그 후 shapefiles 테이블에 새로운 속성을 얻게됩니다.

그게 다야.

다음 은 스크린 샷이 포함 된 예입니다.


1

그의 방법으로 red_line 레이어를 매우 쉽게 업데이트 할 수 있기 때문에 @ dmh126의 답변을 선호합니다 .

대안을 추가하기 위해 Processing Toolbox 에서 Join attributes table 도구를 사용하고 공통 필드가있는 레이어를 선택할 수 있습니다. 이 방법 기존 모양 파일을 업데이트하는 대신 새 모양 파일을 만듭니다 .

결합 속성 테이블


0

두 레이어에 고유 ID가 있으면 이전 레이어에서 새 레이어로 값을 쉽게 결합하는 데 사용할 수 있습니다. 이것은 케이크 조각입니다. 그러나 이것은 그런 경우가 아닙니다.

그렇지 않다면 꽤 어려운 문제입니다. OpenJUMP 및 플러그인 http://www.vividsolutions.com/products.asp?catg=spaapp&code=roadmatcher 사용을 제안하는 user30184의 의견 이이 경우 나에게 완전히 합법적으로 들리기 때문에 대신 답변으로 게시되지 않은 이유가 궁금 합니다.

그렇지 않으면 코딩 없이이 작업을 수행 할 수 없다고 생각합니다. QGIS를 사용하면 매끄럽게 사용할 수 있으며 버퍼링과 교차를 결합 할 때 중요한 자동 검사를 수행 할 수 있습니다.

한 가지 방법은 합리적으로 큰 빨간 선의 버퍼를 파란 선과 비교하여 일치하는 속성과 비율을 얻는 것입니다. 의사 코드에서 :

for r_line in red_lines:
  r_line_buf = r_line.buffer()
  intersecting_b_lines = []
  for b_line in blue_lines:
    if r_line_buf.intersects(b_line):
      intersect_length = calculateIntersectionLength(r_line_buf,b_line)
      b_line_values = getAttributes(b_line)
      intersecting_b_lines.append((b_line_values,intersect_length))
  b_line_best_fit = findLongestLineWithinIntersected(intersecting_b_lines)
  r_line_length = r_line.length
  b_vs_r_line_ratio = compareLength(r_line_length,b_line_best_fit)
  saveToNewColumns(r_line, b_line_best_fit.Atribute1, b_line_best_fit.Atribute2..., b_vs_r_line_ratio)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.