2015-01-09 3 views

답변

7

픽셀 좌표를 세계 좌표에 매핑하는 아핀 변환 행렬을 사용합니다. 예를 들어, affine 패키지를 사용하십시오. (간단한 계산을 사용하여 동일한 기능을 수행하는 다른 방법이있다.) 여기서, 아핀 변환 행렬 T0를 얻는 두 가지 방법이

from affine import Affine 
fname = '/path/to/raster.tif' 

. 예컨대, GDAL/파이썬 사용 :

from osgeo import gdal 
ds = gdal.Open(path, gdal.GA_ReadOnly) 
T0 = Affine.from_gdal(*ds.GetGeoTransform()) 
ds = None # close 

rasterio를 사용하면 :

import rasterio 
with rasterio.open(fname, 'r') as r: 
    T0 = r.affine 

GDAL (T0)에 의해 사용 된 변환 어레이 협약 화소 모서리를 참조한다. 대신 픽셀 중심을 참조 할 수 있습니다, 그래서 50 % 번역 할 필요가 : 픽셀로 변환하는 지금

T1 = T0 * Affine.translation(0.5, 0.5) 

을하고, 함께 할 수있는 행렬과 좌표를 곱 좌표 세계 좌표 간단한 함수 : 또한

print(rc2xy(0, 1)) 

: 지금

rc2xy = lambda r, c: (c, r) * T1 

은 첫 번째 행에, 두 번째 열 (인덱스 [0, 1])를 래스터의 좌표를 얻을 월드 좌표에서 픽셀 좌표를 가져와야하는 경우, 역상 아핀 변환 행렬 ~T0을 사용할 수 있습니다.

+0

매우 지연된 의견을 드려 죄송합니다. 그러나 람다의 매개 변수가 왜 반전되었는지 설명 할 수 있습니까? r, c : (c, r) * T1. 그것은 r이 아니어야한다. c : (r, c) * T1? – jhc

+0

@jhc 행은 Y 방향으로 정렬되고 X와 Y는 X로 정렬됩니다. 따라서 픽셀과 좌표 공간간에 X와 Y 방향을 정렬하려면 매개 변수가 정렬됩니다. 이 함수는 (col, row) 또는'cr2xy = lambda c, r : (c, r) * T1 '의 용어로도 쓸 수있다. 하지만 대부분의 배열 액세스 (예 : Numpy)는 (행, 열) 순서를 사용합니다. –

+0

'row, col'에서'x, y'로 변환하는 표준 방법은 곱셈 연산자를 사용하고 있습니다. 번역 단계 나 추가 기능이 필요 없습니다 :'(0.5, 0.5) * affine' – perrygeo

관련 문제