แปลง geoTiff ที่คาดการณ์เป็น WGS84 ด้วย GDAL และ Python


16

ขออภัยหากคำถามต่อไปนี้ค่อนข้างงี่เง่า แต่ฉันเพิ่งใหม่กับสิ่ง GIS ทั้งหมดนี้

ฉันพยายามแปลงภาพ geoTiff ที่คาดการณ์ไว้เป็น WGS84 โดยใช้ gdal ใน python ฉันได้พบโพสต์ที่แสดงกระบวนการในการแปลงคะแนนภายใน 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 ผ่าน Python

มีแบบฝึกหัดเกี่ยวกับการแปรปรวนกับ API ที่นี่มันบอกว่าการสนับสนุนสำหรับ Python ไม่สมบูรณ์ (ฉันไม่ทราบรายละเอียด): http://www.gdal.org/warptut.html


1
ขอบคุณสำหรับคำตอบ mdsumner ที่ยอดเยี่ยม! ในขณะที่วิธีแก้ปัญหาที่ฉันควรจะเขียนในหลามบางทีฉันสามารถหนีไปได้ด้วยการวนลูปคำสั่งนี้ในสคริปต์ไพ ธ อน
JT.WK

16

ดังที่ mdsumner กล่าวว่าคุณสามารถใช้บรรทัดคำสั่งได้ง่ายกว่าการผูก python นอกจากว่าคุณต้องการทำงานที่ซับซ้อนมาก

ดังนั้นถ้าคุณชอบงูใหญ่อย่างฉันคุณสามารถเรียกใช้เครื่องมือบรรทัดคำสั่งด้วย:

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))  

และแม้แต่ใช้เครื่องมือหลายตัวประมวลผลใช้พลังเต็มที่ของเครื่องของคุณในการทำงานขนาดใหญ่


ขอบคุณ Pablo เครื่องมือหลายตัวประมวลผลเป็นสิ่งที่ฉันจะตรวจสอบอย่างแน่นอน!
JT.WK

ที่ gdal 2.0 มีการสนับสนุนดั้งเดิมสำหรับการประมวลผลหลายตัว - เพียงผนวก -wo NUM_THREADS = ALL_CPUS ต่อท้ายคำสั่ง gdalwarp ของคุณ
valveLondon

3
os.sysเป็นโมดูลในตัว; คุณต้องการos.systemคำสั่ง
Mike T

1
คำตอบของฉันล้าสมัย subprocess.call เป็นวิธีที่ดีกว่า
Pablo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.