使用GDAL和Python将投影的geoTiff转换为WGS84


16

如果以下问题有些愚蠢,我深表歉意,但是我对这整个GIS只是非常陌生。

我正在尝试使用python中的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文件,这是最好的方法吗?是否存在可以一步完成任务的功能?

谢谢!

Answers:


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)坐标系是已知的,但可以像目标一样显式设置。

如果您不必通过Python使用GDAL API,则可能更容易完成工作。

这里有一个有关API扭曲的教程,它说对Python的支持不完整(我不知道详细信息):http : //www.gdal.org/warptut.html


1
感谢您对mdsumner的回答!虽然我追求的解决方案应该是用python编写的,但也许只要在python脚本中循环此命令就可以摆脱现实。
JT.WK 2011年

16

正如mdsumner所说,使用命令行比使用python绑定要容易得多,除非您要执行非常复杂的任务。

因此,如果像我一样喜欢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 2011年

在gdal 2.0中,本机支持多处理-只需将-wo NUM_THREADS = ALL_CPUS附加到gdalwarp命令即可。
valveLondon 2012年

3
os.sys是一个内置模块;您需要os.system命令吗
Mike T

1
我的答案已经过时,subprocess.call是一个更好的方法。
Pablo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.