GDAL 및 Python을 사용하여 투영 된 geoTiff를 WGS84로 변환


16

다음 질문이 다소 어리 석다면 사과하지만, 나는이 전체 GIS에 아주 새로운 것입니다.

파이썬에서 gdal을 사용하여 투영 된 geoTiff 이미지를 WGS84로 변환하려고합니다. 다음과 비슷한 것을 사용하여 투영 된 GeoTiff 내의 점을 변환하는 프로세스를 개략적으로 설명하는 게시물을 찾았습니다.

from osgeo import osr, gdal

# get the existing coordinate system
ds = gdal.Open('path/to/file')
old_cs= osr.SpatialReference()
old_cs.ImportFromWkt(ds.GetProjectionRef())

# create the new coordinate system
wgs84_wkt = """
GEOGCS["WGS 84",
    DATUM["WGS_1984",
        SPHEROID["WGS 84",6378137,298.257223563,
            AUTHORITY["EPSG","7030"]],
        AUTHORITY["EPSG","6326"]],
    PRIMEM["Greenwich",0,
        AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.01745329251994328,
        AUTHORITY["EPSG","9122"]],
    AUTHORITY["EPSG","4326"]]"""
new_cs = osr.SpatialReference()
new_cs .ImportFromWkt(wgs84_wkt)

# create a transform object to convert between coordinate systems
transform = osr.CoordinateTransformation(old_cs,new_cs) 

#get the point to transform, pixel (0,0) in this case
width = ds.RasterXSize
height = ds.RasterYSize
gt = ds.GetGeoTransform()
minx = gt[0]
miny = gt[3] + width*gt[4] + height*gt[5] 

#get the coordinates in lat long
latlong = transform.TransformPoint(x,y) 

내 질문은,이 점들을 변환하고 새로운 WGS84 GeoTiff 파일을 만들고 싶다면 이것이 가장 좋은 방법입니까? 1 단계의 작업과 같이 수행 할 기능이 있습니까?

감사!

답변:


21

한 가지 간단한 방법은 GDAL 명령 줄 도구를 사용하는 것입니다.

gdalwarp infile.tif outfile.tif -t_srs "+proj=longlat +ellps=WGS84"

배치 작업을위한 스크립팅을 통해 쉽게 호출 할 수 있습니다. 이렇게하면 래스터가 새 그리드로 왜곡되고 세부 정보를 제어하는 ​​다른 옵션이 있습니다.

http://www.gdal.org/gdalwarp.html

목표 (t_srs) 좌표계는 그림과 같이 PROJ.4이거나 다른 옵션 중에서 WKT가있는 실제 파일 일 수 있습니다. 소스 (-s_srs) 좌표계는 알려진 것으로 가정되지만 대상과 같이 명시 적으로 설정할 수 있습니다.

파이썬을 통해 GDAL API를 사용할 필요가 없다면 작업을 완료하는 것이 더 쉬울 수 있습니다.

여기에 API로 워핑하는 튜토리얼이 있습니다. 파이썬에 대한 지원이 불완전하다고 말합니다 (자세한 내용은 모르겠습니다) : http://www.gdal.org/warptut.html


1
큰 답변 mdsumner에 감사드립니다! 내가 찾은 솔루션은 파이썬으로 작성되어야하지만 파이썬 스크립트 에서이 명령을 반복하여 벗어날 수 있습니다.
JT.WK

16

mdsumner가 말했듯이 매우 복잡한 작업 을 실행하지 않으려면 파이썬 바인딩보다 명령 줄을 사용하는 것이 훨씬 쉽습니다 .

따라서 파이썬을 좋아한다면 나처럼 다음과 같이 명령 줄 도구를 실행할 수 있습니다.

import os  
os.sys('gdalwarp infile.tif outfile.tif -t_srs "+proj=longlat +ellps=WGS84"')

또는 파일 목록을 반복하십시오.

listoffiles=['file1, file2, file3, filen']  
for file in listoffiles:
    os.system('gdalwarp %s %s -t_srs "+proj=longlat +ellps=WGS84"' %(file,'new_'+file))  

또한 멀티 프로세싱 도구를 사용 하더라도 시스템의 모든 기능을 사용하여 큰 작업을 수행 할 수 있습니다.


고마워요 파블로 멀티 프로세싱 도구는 확실히 살펴볼 것입니다!
JT.WK

gdal 2.0에는 멀티 프로세싱이 기본적으로 지원됩니다. gdalwarp 명령에 -wo NUM_THREADS = ALL_CPUS를 추가하십시오.
Valve 런던

3
os.sys내장 모듈입니다. 당신은 os.system명령 을 원합니다
Mike T

1
내 대답은 구식입니다 .subprocess.call이 더 나은 방법입니다.
Pablo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.