16

明確化: 私はどういうわけか重要な側面を省略しました: os.system または subprocess を使用せず、Python API だけです。

NOAA GTX オフセット グリッドのセクションを垂直データム変換用に変換しようとしていますが、Python を使用して GDAL でこれを行う方法を完全には踏襲していません。グリッド (この場合は Bathymetry Attributed Grid ですが、geotif の可能性があります) をテンプレートとして使用したいと思います。これがうまくできれば、この種のデータを活用するのに大いに役立つと感じています。

ここに私が持っているものがありますが、それは間違いなく機能していません。結果の宛先データセット (dst_ds) で gdalinfo を実行すると、ソース グリッド 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)

サンプル ファイル (ただし、2 つのグリッドが重なっているが投影法が異なる場合):

私がやろうとしていることと同等のコマンドライン:

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}
4

2 に答える 2

29

答えてくれたジェイミーに感謝します。

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

# 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
于 2012-05-10T16:42:04.290 に答える
3

質問を正しく理解できれば、gdalwarp と gdal_translate をサブプロセスとして実行することで目的を達成できます。オプションを組み立てて、たとえば次のようにします。

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)

これは最も洗練されたソリューションではないかもしれませんが、仕事は完了します。実行したら、gdal を使用してデータを numpy にロードし、そのまま続行します。

于 2012-05-09T15:36:12.183 に答える