벡터 포인트를 기준으로 가장 가까운 래스터 셀 값을 찾으십니까?


9

ArcGIS에는 두 개의 레이어가 있습니다. 하나는 벡터 포인트이고 다른 하나는 래스터 레이어입니다. 래스터 데이터 그리드의 값을 벡터 포인트에 추가하고 싶습니다. 문제는 벡터 포인트가 값을 가진 기존 래스터 그리드와 떨어져 있기 때문에 "샘플"명령은 해당 벡터 포인트에 대한 값을 반환하지 않는다는 것입니다.

그래서 내 질문은 : 벡터 포인트가 주어진 가장 가까운 래스터 셀을 찾고 셀에서 값을 추출하는 방법은 무엇입니까?

실제로 내가해야 할 두 가지가 있습니다.

  1. 레인저 내에서 아웃 라이너를 식별하십시오 (일반적으로 기존 래스터에서 1-2 셀 떨어져 있음)
  2. 범위 내에 있으면 가장 가까운 래스터의 값을 할당하십시오.

편집 : 약 3000 벡터 포인트가 있고 내 문제는 다음과 같습니다. 여기에 이미지 설명을 입력하십시오

위치를 기반으로 래스터 값을 벡터 포인트에 추가해야합니다. "샘플"도구를 사용했으며 대부분의 포인트에서 잘 작동합니다.

그러나 이런 상황이 있습니다 여기에 이미지 설명을 입력하십시오

오른쪽 점은 래스터에서 값을 얻을 수 있지만 ( "샘플"작동) 왼쪽 점은 정렬 문제 때문에 발생할 수 없습니다.

도메인 외부에있어 벡터로 변환 할 수 없다는 오류 메시지가 표시되어 래스터-다각형이 작동하지 않습니다. 또한 이런 점이 있습니다여기에 이미지 설명을 입력하십시오

이러한 상위 지점은 래스터에서 너무 멀리 떨어져 있기 때문에 어떤 값도 가져 오지 않아야합니다.

나는 어딘가에서 해결해야한다고 생각했다.

1 단계. "샘플"을 먼저 수행

2 단계. "샘플"조작 후 널값 선택

3 단계. 널 포인트를 기준으로 버퍼 영역 (1 진수 10 진수 이내) 구성

4 단계. 구역 통계 사용 ?? ? 또는 버퍼의 모든 래스터 셀을 반복하고 가장 가까운 셀을 찾아 해당 값을 추출하여 벡터 포인트에 넣는 다른 도구.

4 단계에서 멈췄습니다. ArcSDK에서이 기능을 달성하기 위해 어떤 도구를 사용할 수 있는지 모르겠습니다.

그렇지 않으면 ... 그것을 다루는 것이 더 좋은 아이디어가 있습니까?

나는 이와 같은 20 개의 래스터 레이어를 가지고 있으며 (모델 빌더와 arcobject를 사용하여) 자동으로 만들고 싶습니다.


@ whuber : 당신의 방법은 매우 영리하게 들립니다. 내 질문은 글로벌 규모로 데이터를 처리하고 있으며 개요 래스터의 x0 및 x1을 어떻게 확인할 수 있습니까?

프로젝트에 추가 한 후 속성을 검사하십시오.
whuber

1
구역 통계는 막 다른 골목입니다. 편집 한 내용에 따라 간단한 직접 솔루션이 있습니다. 래스터를 경계 주위로 약간 확장하고 확장 된 래스터를 샘플링합니다. 이를 수행하는 방법에는 여러 가지가 있지만 래스터 계산 기능이있는 작은 시설이 필요합니다. 가장 간단한 방법 중 하나는 분석 범위를 확대하고 초점 평균을 계산 한 다음 'con'을 사용하여 해당 값을 NoData 경계 영역에 붙여 넣는 것입니다. 그러면 래스터 외부의 각 샘플 위치에 근처 래스터 값의 평균이 할당됩니다.
whuber

@ whuber 또 다른 문제는 아웃 라이너가 어디에 있는지 모른다는 것입니다. 내 프로세스에는 실제로 두 가지 절차가 있습니다. 아웃 라이너를 식별하고 값을 할당합니다.

"외계인"이란 무엇입니까? 래스터 값이 적용되지 않는 점인 경우 도움이 될 수는 없습니다 Sample. 도구 를 적용 할 때 어떤 값도받지 않는 점이됩니다 .
whuber

답변:


8

래스터 외곽선은 원점에 의해 왼쪽 하단에 경계가있는 사각형을 차지하며 좌표 (예 : x0, y0)와 오른쪽 상단에 (x1, y1)이 있습니다 : 이들은 모든 래스터에서 쉽게 발견되는 속성입니다. 이 정보를 사용하여 래스터 범위 밖의 점을 래스터 경계에서 가장 가까운 점으로 이동하고 새 위치에서 래스터 값을 추출 할 수 있습니다.

이와 같은 작업은 종종 더 작은 치수를 고려하여 쉽게 해결할 수 있습니다. 1 차원 래스터의 범위는 숫자의 간격입니다 (예 : x0에서 x1> x0, 일반적으로 [x0, x1]). 이 구간에서 주어진 숫자 x에 가장 가까운 점을 찾으려고한다고 가정하십시오. x <x0 (x는 왼쪽에 있음), x0 <= x <= x1 (x는 간격에 있음) 및 x1 <x (x는 오른쪽에 있음)의 세 가지 경우가 있습니다. 가장 가까운 점은 각각 x0, x 및 x1입니다. 이 결과의 공식은

x-> min (max (x, x0), x1),

보시다시피 세 가지 경우 각각을 별도로 고려하여 볼 수 있습니다.

래스터의 범위는 [x0, x1] * [y0, y1]의 두 구간에 대한 데카르트 곱이므로 동일한 공식은 두 차원에서 작동합니다. 각 간격에 적용하십시오. 따라서 투영 된 포인트의 좌표는 (계산기 계산기에서) 다음과 같이 계산 될 수 있습니다.

(x, y)-> (min (max (x, x0), x1), min (max (y, y0), y1)).

다음은 그리드 범위 내에서 그리고 그리드 범위 내에 100 개의 점이 무작위로 배치 된이 공식입니다.

그림

파선은 범위 외부의 점을 이동할 위치와 시각적으로 연결합니다.

이 계산 된 좌표에서 점 레이어를 작성하고 Sample도구를 적용 하여 래스터 값을 추출하십시오. 결과를 원래 포인트 레이어로 다시 결합하십시오.

실용적인 점으로, 새로운 점이 그리드 범위 내에 놓이지 않도록하는 부동 소수점 반올림 문제를 피하려면 x0 및 y0을 실제 원점보다 약간 크게 만드는 것이 좋습니다 (셀의 절반을 셀 수를 추가 할 수 있음) 마찬가지로, x1과 y1을 약간 작게 만듭니다.

요약 하면 워크 플로는 원래 포인트 레이어 테이블에서 두 개의 필드 (새 좌표)를 계산하고, 새 좌표에서 포인트 이벤트 레이어를 생성하고, Sample도구를 실행하며 , 데이터베이스 조인 (공간 조인이 아님)을 수행합니다.


래스터에 셀이있는 것보다 더 많은 벡터 포인트가있는 경우 @celenius (래스터를 포인트로 변환하고 공간 결합을 사용하도록 제안)가 제공하는 솔루션을 선호해야합니다. 그러나 일반적으로 래스터에는 수백만에서 수십억에 이르는 많은 셀이 있으며 포인트로 변환하는 데 시간과 디스크가 많이 소모되므로주의해서 접근해야합니다.

또는, 당신은 Celenius '솔루션을 신속하게 처리 할 수 값의 정수 그리드 만들기 위해 래스터 연산을 사용하여 단지 의 경계를 따라합니다. 점이 거의 없으므로 점 레이어로 변환 하는 것이 빠르고 쉽습니다. 이것을 "경계층"이라고합니다. 경계 레이어 포인트에서 그리드를 샘플링하여 그리드 값을 경계 레이어의 속성 테이블에 복사합니다. Sample원래 포인트 레이어로 실행 한 후 샘플을 성공적으로 획득 한 모든 포인트를 제거하십시오. 샘플링 프로세스를 완료하기 위해 경계 레이어를 나머지 지점에 공간적으로 결합합니다.

경계를 따라 만 값을 가진 격자만드는 한 가지 방법 은 경계 를 따라 실패하는 초점 이웃 연산을 적용하는 것입니다. IsNull 및 SetNull을 사용하여 NoData 셀을 감지하고 NoData와 데이터 셀 사이를 변환 하면 경계를 제외한 NoData 값으로 가득 찬 그리드가 생성 됩니다.)


요약하면 워크 플로는 원래 포인트 레이어 테이블에서 두 개의 필드 (새 좌표)를 계산하고, 새 좌표에서 포인트 이벤트 레이어를 만들고, 샘플 도구를 실행하고, 데이터베이스 조인 (공간 조인이 아님)을 수행하는 것으로 구성됩니다. 이 작업을 수행하는 방법을 자세히 설명해 주시겠습니까? (내 문제에 대한 내 사진을 볼 수 있습니다). 감사!

나는이 문제가 약 15 % 포인트가 있습니다. 각 포인트의 x0과 x1을 어떻게 확인할 수 있습니까?

1
@ x0, y0, x1, y1은 그리드 용입니다. 포인트 좌표 (x, y)는 ArcGIS 도움말 또는이 사이트의 여러 스레드에 설명 된대로 필드 계산기에서 계산할 수 있습니다. XY 포인트 레이어 및 데이터베이스 조인을 만들기위한 메뉴 항목이 있습니다. 이들은 표준 기본 작업입니다.
whuber

4

래스터를 점 ( ref )으로 변환 한 다음 점 (래스터에서)으로 점에 대한 공간 결합을 수행 할 수 있습니다 .

(방금 어제 포인트가 공간적으로 결합 될 수 있음을 배웠습니다 )


1
영리한 접근 방식을 위해 +1. 이것이 불가능한 대형 그리드 의 경우 래스터의 경계 셀만 점으로 변환 하십시오 . (응답의 끝에 어떻게 설명합니다.)
whuber

나는 각 래스터 레이어의 수천 개의 세포를 가지고 나는 그렇게 벡터 점에서 그 터닝 ... 시간이 소요를 같은 20 층을하는이 ...

또한 다각형을 래스터로 만들려고하면 ERROR 000864와 같은 오류 메시지가 나타납니다. 입력 래스터 : 입력이 정의 된 도메인 내에 없습니다. ERROR 000863 : 잘못된 GP 데이터 유형

래스터를 포인트로 변환 할 때 오류가 발생합니까?
djq

@celenius 작동하지만 시간이 오래 걸렸습니다.

1

Raster to Polygon 도구를 사용하여 래스터 레이어를 다각형으로 변환하고 공간 결합을 실행할 수 있습니다 (점 레이어를 마우스 오른쪽 버튼으로 클릭하고 결합 및 연관-결합을 선택하십시오). 첫 번째 드롭 다운에서 공간 결합 옵션을 선택하고 가장 가까운 것을 선택하십시오. (Readio 버튼의 옵션)을 선택하거나 근거리 도구를 사용하십시오.


공간 결합 결과를 사용하여 적절한 래스터 값을 추출하는 방법은 무엇입니까?
whuber

@whuber의 "가장 가까이 있음"옵션을 선택할 때 데이터 결합 대화 상자에서 공간 결합은 가장 가까운 다각형 피처 (래스터에서 폴리곤 도구로 결과)를 선택하고이 속성 정보를 포인트 피처에 추가합니다. 이것이 당신이 질문 한 것입니까? 내 초기 회신은 편집하기 전에 게시되었습니다. Seen의 래스터가 너무 커서 다각형으로 변환하기 어려울 것 같습니까?
artwork21

아이디어는 가장 가까운 래스터를 찾지 않습니다. 실제로, 원하는 것은 래스터의 값을 원래 범위 이상으로 추정하는 방법입니다. 이 질문은 가장 가까운 이웃 접근법을 제안합니다. 래스터에 있지 않은 근처 지점에서 래스터에서 가장 가까운 셀을 찾아 해당 셀의 값을 사용하십시오.
whuber

마지막 주석을 다시 읽으면 래스터를 "다각형"이 아니라 각 셀 (또는 연속 된 셀 집합)마다 하나의 다각형이 있는 다각형 레이어 로 바꾸는 것이 좋습니다. 그렇다면 아주 작은 래스터로 성공할 수 있지만 이전에 제공 한 @celenius와 유사하지만보다 효율적인 솔루션 대신 복잡하고 값 비싼 작업 (정수 그리드에만 작동) 인 왜 이것을 제안합니까? 솔루션이 제공하는 이점은 무엇입니까?
whuber

@ whuber, 다각형 레이어가 정확합니다. 예, celenius 방법은 메모리를 덜 사용합니다.
artwork21
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.