GDAL ve Python ile yansıtılan geoTiff'i WGS84'e dönüştürme


16

Aşağıdaki soru biraz aptalca özür dilerim, ama ben sadece tüm bu CBS şey için çok yeniyim.

Python içinde gdal kullanarak bazı yansıtılan geoTiff görüntüleri WGS84 dönüştürmek çalışıyorum. Aşağıdakine benzer bir şey kullanarak yansıtılan GeoTiff'ler içindeki noktaları dönüştürme işlemini özetleyen bir yazı buldum:

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) 

Benim sorum, bu noktaları dönüştürmek ve yeni bir WGS84 GeoTiff dosyası oluşturmak istiyorsanız, bu konuda en iyi yolu mu? 1 adımda görev gibi bir işlev var mı?

Teşekkürler!

Yanıtlar:


21

Daha basit bir yol, GDAL komut satırı araçlarını kullanmak olabilir:

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

Bu, toplu işler için komut dosyası oluşturma yoluyla yeterince kolayca çağrılabilir. Bu, raster yeni bir ızgaraya çarpacak ve ayrıntıları kontrol etmek için başka seçenekler var.

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

Hedef (t_srs) koordinat sistemi, gösterildiği gibi PROJ.4 veya WKT ile gerçek bir dosya olabilir. Kaynak (-s_srs) koordinat sisteminin bilindiği varsayılır, ancak açıkça hedef gibi ayarlanabilir.

GDAL API'sını Python ile kullanmak zorunda kalmazsanız, işi yapmak daha kolay olabilir.

Burada API ile çarpıtma için bir öğretici var, Python desteğinin eksik olduğunu söylüyor (ayrıntıları bilmiyorum): http://www.gdal.org/warptut.html


1
Büyük cevap mdsumner için teşekkürler! Ben peşinde olduğum çözüm python yazılmış olması gerekiyordu, belki de sadece bu komutu bir python betiği döngü ile kurtulmak olabilir.
JT.WK

16

Mdsumner'ın dediği gibi, çok karmaşık görevleri yürütmek istemiyorsanız komut satırını python bağlarından çok daha kolaydır .

Yani, benim gibi python isterseniz, komut satırı aracını aşağıdakilerle çalıştırabilirsiniz:

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

veya bir dosya listesi üzerinden yineleyin:

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

Ve çok işlemli araçlar bile büyük görevleri yerine getirmek için makinenizin tüm gücünü kullanır.


Teşekkürler Pablo. Çok işlemli araçlar kesinlikle içine bakacağım bir şey!
JT.WK

Gdal 2.0'da çoklu işlem için yerel destek vardır - gdalwarp komutunuza -wo NUM_THREADS = ALL_CPUS ekleyin.
Mayıs

3
os.sysyerleşik bir modüldür; os.systemkomutunu istiyorsun
Mike T

1
Cevabım eski, subprocess.call daha iyi bir yaklaşım.
Pablo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.