投影されたgeoTiffをGDALおよびPythonでWGS84に変換する


16

次の質問がやや馬鹿げている場合はおologiesび申し上げますが、私はこのGISのことをまったく知りません。

Pythonでgdalを使用して、投影されたgeoTiff画像をWGS84に変換しようとしています。次のようなものを使用して、投影されたGeoTiffs内のポイントを変換するプロセスの概要を示す投稿を見つけました。

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

1つの簡単な方法は、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

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

さらに、マルチプロセッシングツールを使用しても、マシンの全機能を使用して大きなタスクを実行できます。


パブロに感謝します。マルチプロセッシングツールは、私が間違いなく検討するものです!
JT.WK

gdal 2.0では、マルチプロセッシングのネイティブサポートがあります-gdalwarpコマンドに-wo NUM_THREADS = ALL_CPUSを追加するだけです。
valveLondon

3
os.sys組み込みモジュールです。os.systemコマンドが必要です
マイクT

1
私の答えは時代遅れです、subprocess.callはより良いアプローチです。
パブロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.