QGIS를 사용하여 포인트-터치-라인 속성을 라인 레이어로 되돌리려면?


12

QGIS 2.14.4-Essen을 사용하고 있습니다. 두 개의 레이어가 있습니다.

  • 연도 열이있는 점이 포함 된 points.shp
  • points.shp의 점을 정확하게 연결하는 선이 포함 된 lines.shp

points.shp에서 lines.shp로 YEAR 속성을 가져오고 싶습니다. 각 선은 각 끝에 하나의 점이있는 단일 선분입니다 (아래 그림 참조). 내가 얻고 싶은 것은 첫 번째 점에서 YEAR이고 두 번째 점에서 YEAR는 각 줄 속성으로 되돌아갑니다.

예를 들어, 1 행은 YEAR = 2010의 첫 번째 점과 YEAR = 2011의 두 번째 점에 닿고 있습니다. '2010-2011'과 같은 것을 1 행 속성으로 되돌리고 싶습니다. 결과는 다음과 같아야합니다.

id  | points
----+-----------------
1   | 2010-2011
2   | 2011-2012
3   | 2012-2016

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

QGIS를 사용하여이를 달성 할 수있는 방법이 있습니까?

답변:


9

@radouxju 답변 이 유효 하지만 조금 더 자세히 설명하겠습니다.

  1. 폴리 라인 피처가 점 위치 바로 위에 분할되어 있는지 확인해야합니다.
  2. 사용하십시오 Join attribute by location. 점 위치에서 분할 선 피처를 대상 레이어로 선택합니다. 제 경우에는 "폭발"이라고합니다.
  3. 요약 섹션에서 "교차 기능 요약 작성"을 선택하십시오. 여기에서 도구를 두 번 실행하는 대신; 하나는 Min이고 다른 하나는 Max의 경우 한 번만 실행하고 Min과 Max를 모두 선택할 수 있습니다.

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

  1. 출력 파일의 속성은 다음과 같습니다.

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

  1. 이름이 "Year"인 문자열 유형의 새 필드를 4 단계의 새 shapefile에 추가하십시오.
  2. 필드 계산기를 사용하여 기존 필드를 업데이트하십시오. "년"을 선택하고 다음 표현식을 작성하십시오.

    to_string ( "MINYEAR2") + '-'+ to_string ( "MAXYEAR2")

  3. 최종 출력 속성은 다음과 같습니다.

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

  1. 최종 출력은 다음과 같습니다.

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


데이터를 테스트 한 후의 결과는 다음과 같습니다.

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

왼쪽의 테이블은 정수 유형의 새 필드를 생성 한 후의 포인트 데이터이고 오른쪽의 테이블은 위에서 언급 한 2 단계를 사용하여 포인트 데이터와 라인을 결합한 후입니다. 그런 다음 5-6 단계를 사용하여 최종 데이터를 작성했습니다.

최신 정보

to_int () 표현식을 사용하여 YEAR 필드를 문자열에서 정수로 변환하려고 시도했지만 작동했습니다. 따라서 수동으로 수행 할 필요가 없습니다. 그러나 필드 유형은 Integernot 유형이어야합니다 Integer64. 필드 길이가 최대 9인지 확인하십시오. 필드 길이를 10으로 선택한 경우이 필드는로 변환되어 Interger64작동하지 않습니다 Interger64. 그런 다음 2-6 단계의 프로세스를 수행 할 수 있습니다.

다음은 to_int () 표현식을 사용한 후의 최종 출력입니다.

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

왼쪽의 위의 속성 테이블에서 YEAR는 문자열 유형이고 YEAR2는 to_int () 표현식을 사용하여 변환 된 정수 유형입니다. 2-6 단계를 수행 한 후 오른쪽의 속성 테이블에서 MINYEAR2 및 MAXYEAR2를 얻은 다음 문자열로 다시 변환하여 YEAR 필드의 모든 항목을 함께 연결합니다.


고마워요! 그것이 내가 여러 번 한 일입니다. Points2One 플러그인을 사용하여 점 레이어에서 선을 만들었으므로 폴리 라인 기능이 점 위치 위에 정확하게 분할 된 것 같습니다. drive.google.com/file/d/0B7ZWEFkkfYgheG92Q29sa0I3LW8/view 데이터 하위 집합을 사용해 볼 수 있습니까 ? 다시 감사합니다!
wiltomap

속성 테이블의 YEAR 필드는 문자열 유형입니다. 정수 유형의 새 필드를 추가하고 연도를 수동으로 입력해야합니다. 정수 유형 필드를 작성하고 편집 사항을 저장 한 후 이전 문자열 필드를 제거하십시오. 그런 다음 위의 자세한 프로세스를 따르십시오.
ahmadhanb

to_int () 표현식을 사용하여 YEAR 필드를 문자열에서 정수로 변환하려고 시도했지만 작동하지 않았습니다. 수동으로 연도를 입력하면 예상대로 작동했습니다.
ahmadhanb

명확한 설명 @ahmadhanb
Shiko

감사합니다 @ahmadhanb! 사실 위에서 공유 한 데이터는 하위 집합입니다. 나는 수천 개의 선과 포인트를 가지고 있으므로 수동으로 몇 년을 입력하면 꽤 많은 일이 될 것입니다! 이것이 버그입니까?
wiltomap

5

조인 포인트가 선으로 연결되면 여러 관계가 있습니다. "위치 별 속성 가입"을 사용하면 주어진 요약 방법을 요청할 수 있습니다. 귀하의 경우이 작업을 두 번 수행하십시오 : 최소 한 번과 최대 한 번. 그런 다음 새 필드에서 두 필드를 연결하면 필요한 항목으로 끝납니다.

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

현장 계산기에서 :

tostring(minYEAR) + '-' + tostring(maxYEAR)

이 메소드는 각 행의 이름 COUNT을 포함하고 값 2을 포함 하는 추가 열을 리턴합니다 . Min 및 Max 옵션은 이러한 정보를 반환합니다. 라인 레이어를 대상 레이어로, 포인트 레이어를 결합 레이어로 선택했습니다. 맞습니까?
wiltomap

연도 필드 숫자 또는 텍스트입니까?
radouxju

YEAR필드 정수입니다. 나는 새로운 칼럼을 만들려고 to_string("YEAR")했지만 결과는 정확히 같습니다.
wiltomap

(QGIS 2.8.3) 확인하기 위해 빠른 테스트를 수행했으며 작동했습니다. 카운트가 2 인 경우 각 세그먼트에 대해 2 포인트가 있음을 의미합니다. 그러나 나와 함께 공간 결합에 의해 생성 된 새로운 라인 벡터에 MINYEAR MAXYEAR 속성 값이 있습니다. 왜 귀하의 경우에는 작동하지 않는지 이해하지 못합니다. 다른 파일로 시도해 볼 수 있습니까?
radouxju

4

토폴로지가 완벽하다고 가정하면 표현식을 사용하여 'WKT'필드를 작성하십시오.

geom_to_wkt( $geometry) 

포인트 레이어에서 다음 표현식을 사용할 수 있습니다.

min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))

파이프 레이어의 필드 계산기에서 텍스트 문자열을 만듭니다.

  • 속성 (기능, ATTRIBUTE_NAME)는 기능에서 지정된 속성의 값을 돌려, 여기에 포인트 기능의 해
    를 얻을.
  • get_feature (layer, attribute, value)는 주어진 속성 값과 일치하는 레이어의 첫 번째 기능을 반환합니다. 여기에서
    선의 시작 정점과 끝 정점의 좌표와 동일한 좌표 (WKT 형식)를 가진 점을 찾을 수 있는지 확인합니다 .
  • start_point (geometry)는 형상에서 첫 번째 노드를 반환합니다. 여기 선의 첫 번째 정점이 있습니다.
  • end_point (geometry)는 지오메트리에서 마지막 노드를 반환합니다. 여기 선의 마지막 정점이 있습니다.
  • geom_to_wkt (geometry)는 지오메트리의 Well-Known Text (WKT) 표현을 반환합니다. 여기에 이미지 설명을 입력하십시오

당신은 그것을 업데이트 할 수 있습니다 :

CASE
WHEN attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year') = attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
THEN attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
ELSE min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))
END

같은 연도의 두 점이 연결된 경우 1 년만 표시하기 위해 (200X-200X 대신 200X를 얻음).

이 방법의 주요 장점은 데이터가 포인트에서 변경되면 하나의 필드 계산기로 매우 빠르게 업데이트 할 수 있다는 것입니다. 새 줄을 만들 때이
규칙을 자동 필드로 추가 할 수도 있습니다 . 건배,

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.