파이썬에서 GDAL로 지오텍 읽기, 수정 및 쓰기


11

Python GDAL 바인딩 및 numpy를 사용하여 원격 감지 이미지 처리의 로프를 배우려고합니다. 첫 번째 시도로 Landsat8 geotiff 파일을 읽고 간단한 조작을 수행하고 결과를 새 파일에 씁니다. 아래의 코드는 원본 래스터가 조작 된 래스터가 아닌 출력 파일에 덤프된다는 점을 제외하고는 잘 작동하는 것으로 보입니다.

의견이나 제안은 환영 할 만하지 만 특히 조작 된 래스터가 결과에 표시되지 않는 이유에 대한 메모입니다.

import os
import gdal

gdal.AllRegister()

file = "c:\~\LC81980242015071LGN00.tiff"
(fileRoot, fileExt) = os.path.splitext(file)
outFileName = fileRoot + "_mod" + fileExt

ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()

[cols, rows] = arr.shape
arr_min = arr.Min()
arr_max = arr.Max()
arr_mean = int(arr.mean())

arr_out = numpy.where((arr < arr_mean), 10000, arr)

driver = gdal.GetDriverByName("GTiff")
outdata = driver.Create(outFileName, rows, cols, 1, gdal.GDT_UInt16)
outband = outdata.GetRasterBand(1)
outband.WriteArray(arr_out)
outdata = None

print arr_min
> 0
print arr_max
> 65535
print arr_mean
> 4856

Windows 7 32 비트 시스템에서 Python 2.7.1을 사용합니다.


DEM (Ubuntu, python 2.7.1)에서 작동하도록하고 평균 값 이하의 모든 것을 10000으로 설정하고 새로운 tiff에 기록하여 예상 결과를 얻었습니다. 지오 트랜스 폼을 새 이미지에 복사하지 않으므로 이미지가 투영되지 않으므로 이미지를 보려고 할 때이를 고려해야 할 수도 있습니다. 당신의 출력과 질문을 편집 할 수있는 경우 gdainfo -stats original.tiffgdal-config --version너무 그 도움을 줄 수.
Steven Kay

안녕하세요, 이것을 조사해 주셔서 감사합니다! 나는 지형 변환을 무시하고 나중에 씹을 것으로 생각했습니다. 전체 출력 이미지 (Irfanview 사용)를 볼 수 있으므로 그렇게 생각할 수 없습니다. 오늘 밤 자리에 돌아 왔을 때 요청한 정보를 생성하겠습니다.
Hans Roelofsen

안녕하세요, 귀하가 요청한 정보를 제공하기 위해 고심하고 있습니다. Python GDAL 바인딩을 사용하고 있으며 지정한 명령이 Python 명령과 어떻게 일치하는지 잘 모르겠습니다. 어쨌든 여기 에서 얻은 GDAL-1.11.2-cp27-none-win32를 사용하고 있습니다 . 원래 .tiff에 대한 통계로 게시물을 업데이트하겠습니다.
Hans Roelofsen

arr_min은 무엇입니까?
fluidmotion

arr_min = 0. 게시물을 업데이트하여 표시했습니다. 감사!
Hans Roelofsen

답변:


13

스크립트에 ds.FlushCache 메소드가 누락되어 수정이 끝나면 메모리에있는 것을 디스크에 저장합니다. 수정 된 버전의 예제를 아래에서 참조하십시오. 투영과 지리 변환을 입력으로 설정하기 위해 두 줄을 추가했습니다.

import os
import gdal

file = "path+filename"
ds = gdal.Open(file)
band = ds.GetRasterBand(1)
arr = band.ReadAsArray()
[cols, rows] = arr.shape
arr_min = arr.min()
arr_max = arr.max()
arr_mean = int(arr.mean())
arr_out = numpy.where((arr < arr_mean), 10000, arr)
driver = gdal.GetDriverByName("GTiff")
outdata = driver.Create(outFileName, rows, cols, 1, gdal.GDT_UInt16)
outdata.SetGeoTransform(ds.GetGeoTransform())##sets same geotransform as input
outdata.SetProjection(ds.GetProjection())##sets same projection as input
outdata.GetRasterBand(1).WriteArray(arr_out)
outdata.GetRasterBand(1).SetNoDataValue(10000)##if you want these values transparent
outdata.FlushCache() ##saves to disk!!
outdata = None
band=None
ds=None

아웃 파일이 투사되지 않습니다. HDF5 파일을 읽고 내보내 GetProjection()려는 밴드에서 투영을 선택 하면 올바른 EPSG가 전달되지만 적용되지 않는 것 같습니다. GDAL 워프가 없습니까? 감사!
Michael

outdata.GetRasterBand(1).WriteArray(arr_out)밴드가 여러 개인 다중 스펙트럼 이미지를 작성하려면 무엇을 대체해야 합니까?
사이 키란

driver.Create ()의 "1"은 밴드 수를 나타냅니다. 그런 다음 outdata.GetRasterBand (band_number)를 사용하여 각 밴드에 쓸 수 있습니다. 0이 아닌 1에서 시작합니다.
Andrea Massetti
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.