2012-05-04 15 views
12

Wyjaśnienie: Jakoś pominąłem kluczowy aspekt: ​​nie używając os.system lub podprocesu - tylko API Pythona.Jak projektować i próbkować siatkę, aby pasowała do innej siatki z pytonem GDAL?

Próbuję przekonwertować sekcję siatki przesunięcia GTX NOAA dla pionowych transformacji bazy danych i nie całkowicie śledzić, jak to zrobić w GDAL z pythonem. Chciałbym wziąć siatkę (w tym przypadku Batymetry Attended Grid, ale może to być geotif) i użyć go jako szablonu, który chciałbym zrobić. Jeśli mogę to zrobić dobrze, mam wrażenie, że bardzo pomoże to ludziom w korzystaniu z tego rodzaju danych.

Oto, co mam, to zdecydowanie nie działa. Kiedy uruchamiam gdalinfo na wynikowym docelowym zbiorze danych (dst_ds), nie pasuje on do źródłowej siatki BAG.

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) 

przykład pliki (ale każde dwie siatki, gdzie nakładają się na siebie, ale są w różnych występów zrobi):

Wiersz poleceń odpowiada temu, co próbuję wykonać:

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

Jakie jest wyjście z WKT dla bag_srs? Czy zweryfikowaliście, że to ten sam SRS, który daje "torba"? Znalazłem WKT, który jest ... no, nie jest dobrze sformatowany ... Zauważyłem, że wersja wiersza poleceń określa EPSG: 2960 (co jest NAD83?). Nie używałem gdal od dłuższego czasu, ale jeśli wpadłbym na to, domyślam się, że zacznę od upewnienia się, że reprojection używa właściwych wartości SRS. Niestety, nie jest to dobra odpowiedź ... dlatego jest to komentarz. – Kasapo

Odpowiedz

20

Podziękowania dla Jamiego za odpowiedź.

#!/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

Działa idealnie - można go zawinąć w skrypt, który pobiera nazwy plików z sys.argv dla schludności. – Spacedman

3

Jeśli dobrze rozumiem pytanie, można osiągnąć swój cel poprzez uruchomienie gdalwarp i gdal_translate jak podprocesów. Wystarczy zmontować opcji wykonaj następujące czynności na przykład:

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) 

To może nie być najbardziej eleganckie rozwiązanie, ale będzie to zadanie. Po uruchomieniu, po prostu załaduj dane do numpy za pomocą gdala i kontynuuj.

+0

podproces zdecydowanie poprawiłby obraz. Jednak jakoś nie wspomniałem o tym, że dążyłem do rozwiązania opartego wyłącznie na pythonie GDAL API. –

+0

Byłoby miło zobaczyć opcje wymagane do wykonania skryptu Pythona. – Spacedman