Как спроектировать и перепроверить сетку, чтобы сопоставить другую сетку с GDAL python?
уточнение: я как-то упустил ключевой аспект: не использовать ОС.система или подпроцесс-просто API python.
Я пытаюсь преобразовать раздел сетки смещения NOAA GTX для вертикальных преобразований данных и не полностью следовать тому, как это сделать в GDAL с python. Я хотел бы взять сетку (в данном случае сетку, приписываемую батиметрии, но это может быть геотиф) и использовать ее в качестве шаблона, который я хотел бы сделать. Если я смогу сделать это правильно, у меня такое чувство, что так и будет. очень помогает людям использовать этот тип данных.
вот что у меня это точно не работает. Когда я запускаю gdalinfo в результирующем наборе данных назначения (dst_ds), он не соответствует мешку исходной сетки.
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)
примеры файлов (но любые две сетки, где они перекрываются, но находятся в разных проекциях):
- http://surveys.ngdc.noaa.gov/mgg/NOS/coast/F00001-F02000/F00574/BAG/ F00574_MB_2m_MLLW_2of3.сумка
- http://vdatum.noaa.gov/download/data/VDatum_National.zip MENHMAgome01_8301 / mllw.gtx
командная строка, эквивалентная тому, что я пытаюсь сделать:
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}
2 ответов
спасибо Джейми за ответ.
#!/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
Если я правильно понимаю вопрос, вы можете достичь своей цели, запустив 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)
это может быть не самое элегантное решение, но оно выполнит свою работу. После его запуска просто загрузите данные в numpy с помощью gdal и продолжайте свой путь.