2016-12-21 2 views
0

저는 래스터 데이터 내에 존재한다는 것을 알고있는 WGS84 좌표를 UTM으로 변환했으며, 범위를 벗어났다 고 내 프로그램에 연결했습니다. 내 래스터는 4695x9798이며, 내 좌표가 윈도우의왜 내 X 값과 Y 값이 항상 래스터 파일 크기 범위를 벗어 납니까?

import numpy as np 
from osgeo import gdal,ogr 
import struct 


gdata = gdal.Open('sinusoidal.tif') 
geot = gdata.GetGeoTransform() 


x = (284905 - geot[0])/geot[1] 
y = (5936117 - geot[3])/(geot[5]) 

myarray = np.array(gdata.GetRasterBand(1).ReadAsArray()) 


print gdata.RasterXSize 
print gdata.RasterYSize 

rb = gdata.GetRasterBand(1) 
intval = rb.ReadAsArray(x,y,1,1) 
print intval 

오류 메시지를 외부 떨어지는 유지하는 이유는 확실하지 않다 : Access 창 범위를 벗어 RasterIO에(). 4695x9798의 래스터에서 크기 1x1의 (6126,1437)을 요청했습니다.

+0

'arcgis' 태그를 추가했는데이 문제는 ArcGIS와 어떤 관계가 있습니까? 가져 오기를 기반으로 사용하지 않는 것 같습니다. –

답변

0

오류 설명은 매우 명백합니다. 래스터 범위를 벗어나는 픽셀을 요청하고 있습니다. 이는 사용자가 제공하는 UTM 좌표 또는 고려하지 않은 위치 정보 변환 (xskew 또는 yskew)과 관련 될 수 있습니다. row-col 픽셀 인덱스를 얻는보다 표준적인 방법은 inverse geotransform을 사용하는 것입니다.

#... 
rb = gdata.GetRasterBand(1) 
geot = gdata.GetGeoTransform() # maps i,j to x,y 
# try-except block to handle different output of InvGeoTransform with gdal versions 
try: 
    inv_gt_success, inverse_gt = gdal.InvGeoTransform(geot) # maps x,y to i,j 
except: 
    inverse_gt = gdal.InvGeoTransform(geot) # maps x,y to i,j 
x_utm = 284905 
y_utm = 5936117 
pix_x = int(inverse_gt[0] + inverse_gt[1] * x_utm + 
      inverse_gt[2] * y_utm) 
pix_y = int(inverse_gt[3] + inverse_gt[4] * y_utm + 
      inverse_gt[5] * y_utm) 
val = rb.ReadAsArray(pix_x, pix_y, 1, 1)[0,0] 
관련 문제