왼쪽의 픽셀은 트리 위치 및 관련 크라운 반경 (즉, 2-5 범위의 픽셀 값)을 나타냅니다. 이 래스터 픽셀을 크라운 반경 값으로 버퍼링하고 싶습니다. 오른쪽 이미지는 래스터 처리 방법 만 사용하여 달성하고자하는 것 입니다.
이웃 설정은 고정 된 값이지만 가변 크기 크라운 반경을 고려하지 않지만 처음에는 ArcGIS에서 원형 초점 합계를 사용하려고 생각합니다.
값으로 픽셀을 "버퍼링"하는 좋은 방법은 무엇입니까?
왼쪽의 픽셀은 트리 위치 및 관련 크라운 반경 (즉, 2-5 범위의 픽셀 값)을 나타냅니다. 이 래스터 픽셀을 크라운 반경 값으로 버퍼링하고 싶습니다. 오른쪽 이미지는 래스터 처리 방법 만 사용하여 달성하고자하는 것 입니다.
이웃 설정은 고정 된 값이지만 가변 크기 크라운 반경을 고려하지 않지만 처음에는 ArcGIS에서 원형 초점 합계를 사용하려고 생각합니다.
값으로 픽셀을 "버퍼링"하는 좋은 방법은 무엇입니까?
답변:
여기에 순수한 래스터 솔루션을 Python 2.7
사용 numpy
하고 scipy
:
import numpy as np
from scipy import ndimage
import matplotlib.pyplot as plt
#create tree location matrix with values indicating crown radius
A = np.zeros((120,320))
A[60,40] = 1
A[60,80] = 2
A[60,120] = 3
A[60,160] = 4
A[60,200] = 5
A[60,240] = 6
A[60,280] = 7
#plot tree locations
fig = plt.figure()
plt.imshow(A, interpolation='none')
plt.colorbar()
#find unique values
unique_vals = np.unique(A)
unique_vals = unique_vals[unique_vals > 0]
# create circular kernel
def createKernel(radius):
kernel = np.zeros((2*radius+1, 2*radius+1))
y,x = np.ogrid[-radius:radius+1, -radius:radius+1]
mask = x**2 + y**2 <= radius**2
kernel[mask] = 1
return kernel
#apply binary dilation sequentially to each unique crown radius value
C = np.zeros(A.shape).astype(bool)
for k, radius in enumerate(unique_vals):
B = ndimage.morphology.binary_dilation(A == unique_vals[k], structure=createKernel(radius))
C = C | B #combine masks
#plot resulting mask
fig = plt.figure()
plt.imshow(C, interpolation='none')
plt.show()
입력:
산출:
이 작업은 세 단계로 수행 할 수 있습니다.
Raster To Point
;Buffer
( VALUE
필드를 버퍼 필드로 사용 );Feature To Raster
.참고 : 버퍼 필드를 사용하면 각 크라운 반경 값에 대한 버퍼 계산을 피할 수 있습니다.
벡터 기반 솔루션을 피하면서이 문제는 가장 가까운 이웃에 기반한 일종의 셀룰러 오토마타 를 사용하는 것이 좋습니다 . 모든 검은 색 픽셀이 0이고 픽셀이 정사각형이고 크기가 1과 같거나 (또는 적절하게 조정 됨) 가정하는 규칙은 매우 간단합니다.
VALUE
)이 1보다 크면 해당 값이 VALUE-1
되고 주변 픽셀을 고려합니다. 그 값보다 작은 경우 VALUE-1
, 이러한 픽셀 출생 이나 성장 과 그 값이된다을 VALUE-1
. 그렇지 않으면,이 픽셀은 생존 하고 변경되지 않은 상태로 남아 있습니다.VALUE<=1
아무것도하지 마십시오 (픽셀이 죽었습니다!).이 규칙은 모든 픽셀이 죽을 때까지, 즉 그 값이 0 또는 1이 될 때까지 적용되어야합니다. 따라서 N-1
시간 N
은 입력 래스터에있는 최대 값입니다. 이 접근법은 약간의 파이썬과 숫자로 쉽게 구현할 수 있습니다.
다른 옵션은 각 픽셀 값에 대해 별도의 래스터를 만드는 것입니다 (이 경우에는 4 개의 래스터). 그런 다음 래스터의 값에 해당하는 픽셀 수만큼 래스터를 확장합니다 (값 목록을 반복하여). 마지막으로, 래스터 (대수 또는 공간)를 결합하여 트리 크라운을위한 하나의 이진 래스터를 만듭니다.
버퍼의 크기를 정의하기 위해 픽셀 값을 사용할 기회가 없기 때문에 래스터에서이 작업을 수행하는 것은 어려운 질문입니다. 따라서 이미 말했듯이 각 값에 대해 초점 필터를 수행해야합니다.
Whuber가 언급 한대로 3 개의 필터 (나는 찾을 수 없었지만)로만 수행 할 수있는 대답은 다음과 같습니다. 나무가 서로 가까이있을 때 버퍼가 잘립니다.
1) 편집 : 유클리드 할당 (작은 나무 근처에서 버퍼를 자르기 때문에 문제를 완전히 해결하지는 못하지만 첫 번째 솔루션의 인공물보다 낫습니다).
2) 각 픽셀 주변의 유클리드 거리
3) 조건문이있는 래스터 계산기 (맵 대수)
Con("allocation_result" > ("distance_result" / pixel_size) , 1 , 0)
반경 측면에서 (중앙 픽셀이 있거나없는) 필요에 따라 조건을 조정할 수 있습니다.
왜 ArcGIS의 확장 도구 를 사용하지 않습니까?
import arcpy
from arcpy.sa import *
raster_in = r'c:\test.tif'
raster_out = r'c:\test_out.tif'
outExpand1 = Expand(raster_in, 2, 2)
outExpand2 = Expand(outExpand1, 3, 3)
outExpand3 = Expand(outExpand3, 4, 4)
outExpand4 = Expand(outExpand4, 5, 5)
outExpand4.save(raster_out)
겹치는 경우 : 최신 expand
명령이 이전 명령을 포함합니다.
픽셀 위치가 있으면 반지름과 중간 점 원 알고리즘 (Bresenham Alg.의 변형)이 실마리를 제공합니다. IMO이 방법으로 다각형을 쉽게 만들 수 있으며 파이썬에서 쉽게 구현할 수 있다고 생각합니다. 이 폴리곤 세트를 통합하면 커버링 영역이 제공됩니다.