> 백엔드 개발 > 파이썬 튜토리얼 > python gdal 튜토리얼: gdal을 사용하여 래스터 데이터 읽기

python gdal 튜토리얼: gdal을 사용하여 래스터 데이터 읽기

黄舟
풀어 주다: 2016-12-24 17:07:04
원래의
8504명이 탐색했습니다.

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(, < ;yoff>, , ;), (xoff, yoff)에서 시작하고 크기가 (xsize, ysize)인 행렬을 읽어냅니다. 행렬 크기를 1X1로 설정하면 한 픽셀을 읽습니다. 그러나 이 방법은 한 픽셀만 읽어도 읽은 데이터만 행렬에 넣을 수 있습니다. 예:

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)를 참고하세요!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿