2012-05-04 17 views
12

Açıklama: Bir şekilde anahtar konu dışında kaldım: os.system veya altprocess kullanma - sadece python API'sı.GDAL python ile başka bir ızgaraya eşleştirmek için bir ızgara nasıl projelendirilir ve yeniden örneklenir?

Dikey veri dönüşümleri için bir NOAA GTX ofset kılavuzunun bir bölümünü dönüştürmeye çalışıyorum ve bunu GDAL'da python ile nasıl yapacağınızı tamamen takip etmiyorum. Bir ızgara almak istiyorum (bu durumda bir Bathymetry Attributed Grid, ancak bir geotif olabilir) ve yapmak istediğim şablon olarak kullanıyorum. Bunu doğru yapabilirsem, insanların bu türden verileri kullanmasına büyük ölçüde yardımcı olacağını hissediyorum.

İşte sahip olduğum şey kesinlikle çalışmıyor. Gdalinfo'yu sonuçtaki hedef veri kümesinde (dst_ds) çalıştırdığımda, BAG kaynak kılavuzuna uymuyor.

from osgeo import gdal, osr 

bag = gdal.Open(bag_filename) 
gtx = gdal.Open(gtx_filename) 

bag_srs = osr.SpatialReference() 
bag_srs.ImportFromWkt(bag.GetProjection()) 

vrt = gdal.AutoCreateWarpedVRT(gtx, None, bag_srs.ExportToWkt(), gdal.GRA_Bilinear, 0.125) 

dst_ds = gdal.GetDriverByName('GTiff').Create(out_filename, bag.RasterXSize, bag.RasterYSize, 
              1, gdalconst.GDT_Float32) 
dst_ds.SetProjection(bag_srs.ExportToWkt()) 
dst_ds.SetGeoTransform(vrt.GetGeoTransform()) 

def warp_progress(pct, message, user_data): 
    return 1 

gdal.ReprojectImage(gtx, dst_ds, None, None, gdal.GRA_NearestNeighbour, 0, 0.125, warp_progress, None) 

Örnek dosyaları (ancak yapacağını, değişik çıkıntıların üst üste, ancak hiçbir iki ızgaraları):

Yapmaya çalıştığım şeye eşdeğer komut satırı:

gdalwarp -tr 2 -2 -te 369179 4773093 372861 4775259 -of VRT -t_srs EPSG:2960 \ 
    MENHMAgome01_8301/mllw.gtx mllw-2960-crop-resample.vrt 
gdal_translate mllw-2960-crop-resample.{vrt,tif} 
+0

WKT'nin çıktı değeri torba_srs? "Çanta" nın verdiği aynı SRS'nin doğrulandığını doğruladınız mı? Bazı WKT'ye rastladım ... iyi, iyi biçimlendirilmemiş ... Komut satırı sürümü EPSG: 2960'ı (NAD83 olan?) Belirtir. Uzun zamandır gdal kullanmamıştım, ama eğer buna rastlarsam, reprojeksiyonun uygun SRS değerlerini kullandığından emin olarak başlayacağım. Üzgünüm, iyi bir cevap değil ... bu yüzden bir yorum. – Kasapo

cevap

20

Cevabınız için Jamie'ye teşekkürler.

#!/usr/bin/env python 

from osgeo import gdal, gdalconst 

# Source 
src_filename = 'MENHMAgome01_8301/mllw.gtx' 
src = gdal.Open(src_filename, gdalconst.GA_ReadOnly) 
src_proj = src.GetProjection() 
src_geotrans = src.GetGeoTransform() 

# We want a section of source that matches this: 
match_filename = 'F00574_MB_2m_MLLW_2of3.bag' 
match_ds = gdal.Open(match_filename, gdalconst.GA_ReadOnly) 
match_proj = match_ds.GetProjection() 
match_geotrans = match_ds.GetGeoTransform() 
wide = match_ds.RasterXSize 
high = match_ds.RasterYSize 

# Output/destination 
dst_filename = 'F00574_MB_2m_MLLW_2of3_mllw_offset.tif' 
dst = gdal.GetDriverByName('GTiff').Create(dst_filename, wide, high, 1, gdalconst.GDT_Float32) 
dst.SetGeoTransform(match_geotrans) 
dst.SetProjection(match_proj) 

# Do the work 
gdal.ReprojectImage(src, dst, src_proj, match_proj, gdalconst.GRA_Bilinear) 

del dst # Flush 
+0

Mükemmel bir şekilde çalışır - dosya isimlerini düzgün bir şekilde sys.argv dosyasından alan bir betiğe koyabilirsiniz. – Spacedman

3

Soruyu doğru anlıyorsam, gdalwarp ve gdal_translate alt işlemleri olarak çalıştırarak hedefinizi gerçekleştirebilirsiniz.

import subprocess 

param = ['gdalwarp',option1,option2...] 
cmd = ' '.join(param) 
process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
stdout = ''.join(process.stdout.readlines()) 
stderr = ''.join(process.stderr.readlines()) 

if len(stderr) > 0: 
    raise IOError(stderr) 

En zarif çözüm olmayabilir, ama bu işi olacaktır: Tam o örneğin aşağıdakileri yapın seçeneklerinizi birleştirin. Çalıştırıldıktan sonra, verilerinizi gdal kullanarak numpy'ye yükleyin ve yolunuza devam edin.

+0

alt işlemi kesinlikle görüntüyü düzeltecektir. Ancak, bir şekilde GDAL python API tek çözümünü hedeflediğimi belirterek cevapsız kaldım. –

+0

Python betiğinin ne yaptığını yapmak için gerekli seçenekleri görmek güzel olurdu. – Spacedman

İlgili konular