GDAL은
ArcInfo 그리드, ArcSDE 래스터, Imagine, Idrisi, ENVI, GRASS, GeoTIFF
를 포함하여 모든 주류 GIS 및 RS 데이터 형식을 포괄하는 100개 이상의 래스터 데이터 유형을 기본적으로 지원합니다. HDF4, HDF5
USGS DOQ, USGS DEM
ECW, MrSID
TIFF, JPEG, JPEG2000, PNG, GIF, BMP
완전 지원 목록은 http://www.gdal.org/formats_list.html을 참조하세요
GDAL 지원 라이브러리 가져오기
이전 버전(1.5 이전): import gdal, gdalconst
새 버전(1.6 이상): from osgeo import gdal, gdalconst
gdal과 gdalconst를 모두 가져오는 것이 가장 좋습니다. 다른 모듈과의 충돌을 최소화하기 위해 gdalconst의 상수 앞에 붙습니다. 따라서 다음과 같이 gdalconst를 직접 가져올 수 있습니다. from osgeo.gdalconst import *
OGR 데이터 드라이버와 유사한 GDAL 데이터 드라이버는 먼저 특정 유형의 데이터 드라이버를 생성한 다음 해당 래스터 데이터 세트를 생성해야 합니다.
모든 데이터 드라이버를 한 번에 등록하지만 읽기만 가능하고 쓰기는 불가능합니다: gdal.AllRegister()
읽고 쓸 수 있도록 특정 유형의 데이터 드라이버를 별도로 등록합니다. 예 새 데이터세트 만들기:
driver = gdal.GetDriverByName('HFA')
driver.Register()
기존 래스터 데이터세트 열기:
fn = 'aster.img'
ds = gdal.Open(fn, GA_ReadOnly)
ds가 None인 경우:
'열 수 없음' + fn
sys.exit(1)
래스터 데이터세트의 x 방향 픽셀 수, y 방향 픽셀 수, 밴드 수를 읽습니다
cols = ds.RasterXSize
행 = ds.RasterYSize
bands = ds.RasterCount
속성(properties)이므로 뒤에 괄호가 없습니다. 메소드(method)가 아님
지리 좌표 참조 정보(georeference info) 읽기
GeoTransform은 래스터 데이터셋의 지리 좌표 정보를 저장하는 리스트입니다
adfGeoTransform[0] /* 왼쪽 상단 x 왼쪽 상단 모서리의 x 좌표 */
adfGeoTransform[1] /* w--e 픽셀 해상도 동서 방향의 픽셀 해상도*/
adfGeoTransform[2 ] /* 회전, 이미지가 "north up"인 경우 0 북쪽이 위를 향하고 있는 경우 지도의 회전 각도*/
adfGeoTransform[3] /* 왼쪽 위 y 왼쪽 위 모서리의 y 좌표* /
adfGeoTransform[4] /* 회전, 이미지가 "북향"인 경우 0 북쪽이 위를 향하고 있는 경우 지도의 회전 각도*/
adfGeoTransform[5] /* n-s 픽셀 해상도 남북 방향의 픽셀 해상도*/
래스터 데이터 참고 세트의 좌표는 일반적으로 왼쪽 위 모서리를 기준으로 합니다.
다음 예는 래스터 데이터세트에서 Geotransform을 목록으로 가져온 다음 그 안의 데이터를 읽는 것입니다.
geotransform = ds.GetGeoTransform()
OriginX = geotransform [0]
OriginY = geotransform[3] OriginY = geotransform[3]
pixelWidth = geotransform[1]
pixelHeight = geotransform[5]
특정 좌표에 해당하는 픽셀의 상대 위치(픽셀 오프셋), 즉 좌표와 왼쪽 상단의 픽셀의 상대 위치를 계산하고, 픽셀 수를 기준으로 계산합니다. 다음:
xOffset = int((x – OriginX) / pixelWidth)
yOffset = int((y – OriginY) / pixelHeight)
특정 값 읽기 픽셀에는 두 단계가 필요합니다
먼저 읽기 밴드 가져오기: GetRasterBand(
그런 다음 ReadAsArray(
band = ds.GetRasterBand(1)
data = band.ReadAsArray(xOffset, yOffset, 1, 1)
전체를 읽으려면 Band at a time Picture, 그런 다음 오프셋을 0으로 설정하고 크기를 전체 그림의 크기로 설정합니다. 예:
data = band.ReadAsArray(0, 0, cols,rows)
하지만 데이터에서 특정 픽셀의 값을 읽으려면 data[yoff, xoff]를 사용해야 한다는 점에 유의하세요. 거꾸로 하지 않도록 주의하세요. 수학의 행렬은 [row,col]이지만 여기서는 정반대입니다! 여기서 row는 y축에 해당하고 col은 x축에 해당합니다.
밴드 = 없음 또는 데이터 세트 = 없음과 같이 적절한 경우 메모리를 해제하는 데 주의하세요. 특히 이미지가 매우 큰 경우
래스터 데이터를 더 효율적으로 읽는 방법은 무엇입니까? 분명히 하나씩 읽는 것은 매우 비효율적입니다. 전체 래스터 데이터세트를 2차원 배열로 채우는 것은 여전히 많은 메모리를 차지하기 때문에 좋은 생각이 아닙니다. 더 나은 접근 방식은 블록 단위의 데이터에 액세스하고 필요한 블록만 메모리에 저장하는 것입니다. 이번 주 샘플 코드에는 블록 크기를 읽을 수 있는 utils 모듈이 있습니다.
예:
import utils
blockSize = utils.GetBlockSize(band)
xBlockSize = blockSize[0]
yBlockSize = 블록 크기[1]
타일(tiled), 즉 래스터 데이터가 블록 단위로 저장됩니다. GeoTiff와 같은 일부 형식은 타일링되지 않으며 각 줄은 블록입니다. Erdas 상상 형식은 64x64 픽셀로 타일링됩니다.
행이 블록인 경우 행별로 읽는 것이 리소스를 더 절약해 줍니다.
타일형 데이터 구조인 경우 ReadAsArray()의 매개변수 값을 한 번에 한 블록만 읽을 수 있도록 설정하는 것이 가장 효율적인 방법입니다. 예:
rows = 13, cols = 11, xBSize = 5, yBSize = 5
for i in range(0, 행, yBSize):
if i + yBSize < 행:
numRows = yBSize
else:
numRows = 행 – i
범위(0, cols, xBSize) ) :
if j + xBSize < cols:
numCols = xBSize
else:
numCols = colsnumCol s = cols – j
data = band.ReadAsArray(j, i, numCols, numRows)
이 코드는 보편적이며 수시로 사용할 수 있습니다.
다음은 몇 가지 2차원 배열 처리 기술을 소개합니다
여기에서는 Numeric과 numpy라는 두 개의 라이브러리가 사용됩니다. 숫자는 더 오래되었으며 FWTools가 이를 사용합니다. 직접 설치하고 구성하는 경우 더 강력한 numpy를 사용해야 합니다.
데이터 유형 변환:
data = band.ReadAsArray(j, i, nCols, nRows)
data = data.astype(Numeric.Float) # 숫자
data = data.astype(numpy.float) # numpy
또는 간단한 문장을 작성하세요
data = band.ReadAsArray(j, i, nCols, nRows).astype (Numeric.Float)
마스크 마스크
Numeric 및 numpy 라이브러리의 기능으로 배열과 조건을 입력받아 바이너리 배열로 출력합니다. 예를 들어
mask = Numeric.greater(data, 0)mask = Numeric.greater(data, 0)
>>> a = Numeric.array([0, 4 , 6, 0, 2])
>>>
[0 4 6 0 2]
>>> .greater(a, 0)
>>> 인쇄 마스크
[0 1 1 0 1]
배열 합계
> >> a = Numeric.array([0, 4, 6, 0, 2])
>> 인쇄 a>>> 0 4 6 0 2]
>>> print Numeric.sum(a)
12
2차원 배열인 경우 sum은 1차원 배열 반환
>>> b = Numeric.array([a, [5, 10, 0, 3, 0]])
>> > 인쇄 b
[[ 0 4 6 0 2]
[ 5 10 0 3 0]]
>>> )>>> print Numeric.sum(b)
[ 5 14 6 3 2]
그러니까 2차원 배열의 합은 이렇습니다
>> ;> print Numeric.sum(Numeric.sum(b))
30
다음은 0보다 큰 픽셀 수를 계산하는 약간의 트릭입니다. 함수
>> 인쇄
[0 4 6 0 2]
>>> (a, 0)
>> 인쇄 마스크
[0 1 1 0 1]
>>> 인쇄 Numeric.sum(mask )
3
위는 gdal을 사용하여 래스터 데이터를 읽는 Python gdal 튜토리얼입니다. 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트(www.php.cn)를 참고하세요!