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

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

Dec 24, 2016 pm 05:07 PM
gdal

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(<index>), 해당 매개변수는 밴드의 인덱스 번호입니다

그런 다음 ReadAsArray(<xoff>, &lt ;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차원 배열의 합은 이렇습니다

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


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까? HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까? Mar 10, 2025 pm 06:54 PM

HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까?

파이썬의 이미지 필터링 파이썬의 이미지 필터링 Mar 03, 2025 am 09:44 AM

파이썬의 이미지 필터링

Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법 Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법 Mar 05, 2025 am 09:58 AM

Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법

Python을 사용하여 PDF 문서를 사용하는 방법 Python을 사용하여 PDF 문서를 사용하는 방법 Mar 02, 2025 am 09:54 AM

Python을 사용하여 PDF 문서를 사용하는 방법

Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법 Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법 Mar 02, 2025 am 10:10 AM

Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법

Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까? Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까? Mar 10, 2025 pm 06:52 PM

Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까?

파이썬에서 자신의 데이터 구조를 구현하는 방법 파이썬에서 자신의 데이터 구조를 구현하는 방법 Mar 03, 2025 am 09:28 AM

파이썬에서 자신의 데이터 구조를 구현하는 방법

파이썬 객체의 직렬화 및 사제화 : 1 부 파이썬 객체의 직렬화 및 사제화 : 1 부 Mar 08, 2025 am 09:39 AM

파이썬 객체의 직렬화 및 사제화 : 1 부

See all articles