2015-01-09 62 views

回答

7

使用仿射變換矩陣,它將像素座標映射到世界座標。例如,使用affine軟件包。 (還有其他的方法做同樣的,使用簡單的數學。)

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

這裏有兩種方式來獲得仿射變換矩陣,T0。例如,使用GDAL/Python的:

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 

13759 GDAL(T0)用於變換陣列的約定是參考像素的角落。您可能要代替參考像素中心,所以它需要50%翻譯:

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

而且現在從像素座標轉換爲世界座標,乘以矩陣,這是可以做到的座標一個簡單的函數:

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

現在,得到一個光柵的座標在第一行,第二列(索引[0, 1]):

print(rc2xy(0, 1)) 

而且,請注意,如果您需要從世界座標中獲取像素座標,則可以使用倒立仿射變換矩陣~T0

+0

對不起,評論極其延遲,但你能解釋爲什麼lambda的參數是反轉的嗎? r,c:(c,r)* T1。它不應該是r,c:(r,c)* T1? – jhc

+0

@jhc行與Y方向和列與X對齊。所以爲了保持X和Y方向在像素座標空間和座標空間之間對齊,參數是對齊的。函數也可以用(col,row)或'cr2xy = lambda c,r:(c,r)* T1'來表示。但大多數數組訪問(例如Numpy)使用(row,col)排序。 –

+0

將'row,col'轉換爲'x,y'的規範方法是使用乘法運算符。不需要翻譯步驟或額外的功能:'(0.5,0.5)*仿射' – perrygeo