HDF to Geotiff используя Python API GDAL

Ответить
Rumato
Активный участник
Сообщения: 104
Зарегистрирован: 06 окт 2012, 15:35
Репутация: 0
Контактная информация:

HDF to Geotiff используя Python API GDAL

Сообщение Rumato » 05 июн 2013, 14:18

Добрый день, подскажите, пожалуйста, как проделать следующее. Есть HDF-файл MODIS, необходимо извлечь нужные данные и переконвертировать их в Geotiff. Вот что я пока написал:

Код: Выделить всё

from osgeo import gdal
filename = 'MOD07_L2.A2013036.0535.005.2013079062.hdf'

ds = gdal.Open(filename)

#Open output format driver, see gdal_translate --formats for list
format = "GTiff"
driver = gdal.GetDriverByName( format )
#Output to new format
dst_ds = driver.CreateCopy( 'test.tif', ds, 1 )
это не рабочая программа, после её выполнения ошибка:
ERROR 1: Unable to export GeoTIFF files with zero bands.

Объясните, пожалуйста, что я не так делаю и в чём ошибка.
Последний раз редактировалось Rumato 27 июн 2013, 18:46, всего редактировалось 1 раз.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: HDF to Geotiff используя Python API GDAL

Сообщение Александр Мурый » 05 июн 2013, 17:46

Ошибка в том, что вы пытаетесь записать геотифф, не прочитав поднаборы данных (SUBDATASET), содержащиеся в HDF-файле.

Я бы сделал как-то так:

Код: Выделить всё


# -*- coding: utf-8 -*-

from osgeo import gdal

hdf = gdal.Open("MOD07_L2.A2004026.0110.004.2004026151642.hdf")

sdslist = hdf.GetSubDatasets()

names = []
for s in sdslist:
names.append(s[0])

sds = []
for n in names:
sds.append(gdal.Open(n))

sds[0].GetMetadata()
format = "GTiff"
driver = gdal.GetDriverByName( format )
dst_ds = driver.CreateCopy( "test.tif", sds[0], 1 )


В списке "sds" содержатся все поднаборы (SDS), в этом примере их всего 56. В итоге мы записываем в геотифф первый поднабор (sds[0]). Ест-но, можно пройтись в цикле по всем поднаборам и сохранить их в геотифф под нужными именами.
Редактор материалов, модератор форума

Rumato
Активный участник
Сообщения: 104
Зарегистрирован: 06 окт 2012, 15:35
Репутация: 0
Контактная информация:

Re: HDF to Geotiff используя Python API GDAL

Сообщение Rumato » 05 июн 2013, 18:28

Если я беру ваши код, то тогда появляется такая ошибка

Код: Выделить всё

ERROR 1: CPLMalloc(-482798304): Silly size requested.

ERROR 1: CPLMalloc(-482798304): Silly size requested.

ERROR 1: CPLMalloc(-1116485888): Silly size requested.

Ошибка сегментирования (core dumped)

В чём может быть проблема?)

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: HDF to Geotiff используя Python API GDAL

Сообщение gamm » 05 июн 2013, 19:21

Rumato писал(а):В чём может быть проблема?)
для Модиса есть специальная тулза от производителя, лучше пользоваться ей (на сайте гислаба есть описание, ссылку не помню). Она знает, как устроены именно продукты MODIS, и позволяет выдавать трансформированные файлы.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: HDF to Geotiff используя Python API GDAL

Сообщение Александр Мурый » 05 июн 2013, 19:35

gamm писал(а): для Модиса есть специальная тулза от производителя, лучше пользоваться ей (на сайте гислаба есть описание, ссылку не помню). Она знает, как устроены именно продукты MODIS, и позволяет выдавать трансформированные файлы.
Да, есть MRT/MRTSwath/HEG и прочие. Но вопрос был про Python+GDAL.
Rumato писал(а):В чём может быть проблема?)
Так просто не скажешь. Какая у вас версия GDAL? Какой именно код вы запускаете? Можете выложить ваш HDF-файл?

Надеюсь, вы поменяли имя файла в коде на своё? :)
Редактор материалов, модератор форума

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: HDF to Geotiff используя Python API GDAL

Сообщение Александр Мурый » 06 июн 2013, 13:04

Ваш HDF-файл (MOD07_L2.A2013036.0535.005.2013079062.hdf) не находится по имени в LAADS. Но там на это же время съёмки есть файл MOD07_L2.A2013036.0535.005.2013036133243.hdf.

Вот немного модифицированный код с заданием СК и привязки для выходных растров.

Код: Выделить всё


# -*- coding: utf-8 -*-

from osgeo import gdal

hdf = gdal.Open("MOD07_L2.A2013036.0535.005.2013036133243.hdf")

sdslist = hdf.GetSubDatasets()

names = []
for s in sdslist:
names.append(s[0])

sds = []
for n in names:
sds.append(gdal.Open(n))

sds[0].GetMetadata()
geotrans = gdal.GCPsToGeoTransform(sds[0].GetGCPs())

dst_name = 'test.tif'
format = "GTiff"
driver = gdal.GetDriverByName( format )
dst_ds = driver.CreateCopy( dst_name, sds[0], 1 )

dst_ds.SetGeoTransform( geotrans )

Выходной файл выглядит так:
Спойлер
Driver: GTiff/GeoTIFF
Driver: GTiff/GeoTIFF
Files: test.tif
test.tif.aux.xml
Size is 270, 406
Coordinate System is:
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84",6378137,298.257223563,
AUTHORITY["EPSG","7030"]],
AUTHORITY["EPSG","6326"]],
PRIMEM["Greenwich",0],
UNIT["degree",0.0174532925199433],
AUTHORITY["EPSG","4326"]]
GeoTransform =
72.61358152370448, 0.09138855169054706, -0.01614752960649682
56.87450003221814, -0.01283870520476875, -0.04353679844333359
Metadata:
_FillValue=-999.900024414062
add_offset=0
ALGORITHMPACKAGEACCEPTANCEDATE=June 1997
ALGORITHMPACKAGEMATURITYCODE=at-launch
ALGORITHMPACKAGENAME=ATBD-MOD-07
ALGORITHMPACKAGEVERSION=2
AREA_OR_POINT=Area
ASSOCIATEDINSTRUMENTSHORTNAME=MODIS
ASSOCIATEDPLATFORMSHORTNAME=Terra
ASSOCIATEDSENSORSHORTNAME=MODIS
AUTOMATICQUALITYFLAG=Passed
AUTOMATICQUALITYFLAGEXPLANATION=Passed: >10% usable; Failed: <10% usable
Cell_Across_Swath_Sampling=3, 1348, 5
Cell_Along_Swath_Sampling=3, 2028, 5
DAYNIGHTFLAG=Day
DayProcessedPct=100.00
DESCRREVISION=5.0
EASTBOUNDINGCOORDINATE=102.177911199456
EQUATORCROSSINGDATE=2013-02-05
EQUATORCROSSINGLONGITUDE=69.892629225641
EQUATORCROSSINGTIME=05:50:24.423577
EXCLUSIONGRINGFLAG=N
Geolocation_Pointer=Internal geolocation arrays
GRINGPOINTLATITUDE=56.7207627145075, 51.6164652863306, 34.8842174273705, 38.4203751007484
GRINGPOINTLONGITUDE=66.4970233788397, 102.179098596375, 91.7817180465794, 65.5421173305603
GRINGPOINTSEQUENCENO=1, 2, 3, 4
HDFEOSVersion=HDFEOS_V2.9
history=$Id: MOD07.V2.CDL,v 1.1.2.4 2002/03/04 15:47:57 gumley Exp $

INPUTPOINTER=MOD021KM.A2013036.0535.005.2013036133009.hdf, MOD03.A2013036.0535.005.2013036113519.hdf, MOD35_L2.A2013036.0535.005.2013036133228.hdf, gdas1.PGrbF00.130205.06z, MODIS_REGCOEF_col5.2.terra, MODIS_senzen.bin, terra_bias.dat.v2, terra_det.dat.v2, destripe_config_terra.dat.v1
INSTRUMENTNAME=Moderate Resolution Imaging Spectroradiometer
LandProcessedPct=99.93
LOCALGRANULEID=MOD07_L2.A2013036.0535.005.2013036133243.hdf
LOCALINPUTGRANULEID=MOD021KM.A2013036.0535.005.2013036133009.hdf, MOD03.A2013036.0535.005.2013036113519.hdf, MOD35_L2.A2013036.0535.005.2013036133228.hdf, gdas1.PGrbF00.130205.06z, MODIS_REGCOEF_col5.2.terra, MODIS_senzen.bin, terra_bias.dat.v2, terra_det.dat.v2, destripe_config_terra.dat.v1
LOCALVERSIONID=005
long_name=TAI time at start of scan replicated across the swath
LONGNAME=MODIS/Terra Temperature and Water Vapor Profiles 5-Min L2 Swath 5km
LowConfidentClearPct=84.31
MaxSolarZenithAngle=77.57
MinSolarZenithAngle=51.34
NightProcessedPct=0.00
NonCloudObstructionFoundPct=6.47
NORTHBOUNDINGCOORDINATE=56.7107203611966
ORBITNUMBER=69869
Parameter_Type=MODIS Input
PARAMETERNAME=Water_Vapor_Infrared
PGEVERSION=5.3.12
PROCESSINGENVIRONMENT=Linux minion5080 2.6.18-308.24.1.el5PAE #1 SMP Tue Dec 4 18:28:32 EST 2012 i686 i686 i386 GNU/Linux
PRODUCTIONDATETIME=2013-02-05T13:32:43.000Z
PRODUCTIONHISTORY=PGE03:5.3.12
PROFILES_ALGORITHM_VERSION_NUMBER=1
QAPERCENTMISSINGDATA=85
RANGEBEGINNINGDATE=2013-02-05
RANGEBEGINNINGTIME=05:35:00.000000
RANGEENDINGDATE=2013-02-05
RANGEENDINGTIME=05:40:00.000000
REPROCESSINGACTUAL=processed once
REPROCESSINGPLANNED=further update is anticipated
scale_factor=1
SCIENCEQUALITYFLAG=Not Investigated
SCIENCEQUALITYFLAGEXPLANATION=See http://modis-atmos.gsfc.nasa.gov/validation.html for more details on MODIS Atmosphere data quality.
ShadowFoundPct=0.00
SHORTNAME=MOD07_L2
Snow_IceSurfaceProcessedPct=8.68
SOUTHBOUNDINGCOORDINATE=35.0168687325194
STABILITY_INDICES_ALGORITHM_VERSION_NUMBER=1
SuccessfulRetrievalPct=14.63
SunglintProcessedPct=0.00
ThinCirrusIR_FoundPct=5.73
ThinCirrusSolarFoundPct=15.35
title=MODIS Level 2 Atmospheric Profiles

TOTAL_OZONE_ALGORITHM_VERSION_NUMBER=1
units=seconds since 1993-1-1 00:00:00.0 0
valid_range=0, 3155800064
VERSIONID=5
WaterProcessedPct=0.07
WESTBOUNDINGCOORDINATE=65.5544904883144
Image Structure Metadata:
INTERLEAVE=BAND
Corner Coordinates:
Upper Left ( 72.6135815, 56.8745000) ( 72d36'48.89"E, 56d52'28.20"N)
Lower Left ( 66.0576845, 39.1985599) ( 66d 3'27.66"E, 39d11'54.82"N)
Upper Right ( 97.2884905, 53.4080496) ( 97d17'18.57"E, 53d24'28.98"N)
Lower Right ( 90.7325935, 35.7321095) ( 90d43'57.34"E, 35d43'55.59"N)
Center ( 81.6730875, 46.3033047) ( 81d40'23.11"E, 46d18'11.90"N)
Band 1 Block=270x3 Type=Float64, ColorInterp=Gray
Description = TAI time at start of scan replicated across the swath
NoData Value=-999.9000244140625
Unit Type: seconds since 1993-1-1 00:00:00.0 0
Редактор материалов, модератор форума

Rumato
Активный участник
Сообщения: 104
Зарегистрирован: 06 окт 2012, 15:35
Репутация: 0
Контактная информация:

Re: HDF to Geotiff используя Python API GDAL

Сообщение Rumato » 06 июн 2013, 16:11

Александр Мурый, большое спасибо что помагаете, этот hdf-файл результат приёма нашей университетской станцией (у нас в универе есть отдел космического мониторинга), мне не подходят те решения, которые предлагали товарищи (Утилиты NASA), так как мне нужно автоматизировать некоторые процесы и распараллелить их.

Ваша программа хорошо работает с данными взятыми с сайта NASA, но вот те что мне дали в отделе, с теми не совсем всёравно выскакиевает эта ошибка.

ERROR 1: CPLMalloc(-566848224): Silly size requested.

ERROR 1: CPLMalloc(-566848224): Silly size requested.

ERROR 1: CPLMalloc(-1161312512): Silly size requested.

Ошибка сегментирования (core dumped)
scienceview.ru/temp/MOD07_L2.A2013036.0535.005.2013079062316.hdf

По ссылке что выше сам файл, с которым сейчас работаю. Если разъясните что к чему буду искренне благодарен.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: HDF to Geotiff используя Python API GDAL

Сообщение Александр Мурый » 06 июн 2013, 16:41

Проверил с вашим файлом — вроде бы, работает. Вот пример полученного геотиффа.
test.tif.zip
(9.57 КБ) 546 скачиваний
В чём у вас проблема, не очень понятно… Какая у вас ОС, какая версия GDAL?
Редактор материалов, модератор форума

Rumato
Активный участник
Сообщения: 104
Зарегистрирован: 06 окт 2012, 15:35
Репутация: 0
Контактная информация:

Re: HDF to Geotiff используя Python API GDAL

Сообщение Rumato » 06 июн 2013, 16:52

Gdal 1.9.2 версии, операционка Ubuntu.

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: HDF to Geotiff используя Python API GDAL

Сообщение Александр Мурый » 06 июн 2013, 18:19

Надо определить, на каком этапе вылезает ошибка. Попробуйте выполнять действия в интерпретаторе построчно.
Редактор материалов, модератор форума

Rumato
Активный участник
Сообщения: 104
Зарегистрирован: 06 окт 2012, 15:35
Репутация: 0
Контактная информация:

Re: HDF to Geotiff используя Python API GDAL

Сообщение Rumato » 08 июн 2013, 08:24

Код: Выделить всё


for n in names:
... sds.append(gdal.Open(n))
...
ERROR 1: CPLMalloc(-375692544): Silly size requested.

ERROR 1: CPLMalloc(-375692544): Silly size requested.

ERROR 1: CPLMalloc(-1059362816): Silly size requested.

Ошибка сегментирования (сделан дамп памяти)

vot posle etix strok proisvodit oshibka, delal eto v interpretotore, Ubuntu obnovil, kak viyasnilos ne udashno:)

Rumato
Активный участник
Сообщения: 104
Зарегистрирован: 06 окт 2012, 15:35
Репутация: 0
Контактная информация:

Re: HDF to Geotiff используя Python API GDAL

Сообщение Rumato » 25 июн 2013, 16:46

Извиняюсь, что долго не отвечал, дела учебные отнимали много времени, как выяснилось, после обновления Ubuntu и установки заново Gdal, программа заработала. У меня остался как-бы последний вопрос: вот как обращаться и сохранять из HDF-файла, растр по имени?

Т.е. У меня в файлеесть поля данных, растров: Scan_Start_Time, Water_Vapor, Total_Ozone и т.д. мне нужно что-то типа вот так наверное: dst_ds = driver.CreateCopy( dst_name, "Total_Ozone", 1 ) ?

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 793
Ваше звание: званий не имею
Откуда: Москва

Re: HDF to Geotiff используя Python API GDAL

Сообщение Александр Мурый » 26 июн 2013, 00:24

Вот пример сохранения всех геопривязанных поднаборов данных в геотиффах с нужными именами:

Код: Выделить всё


# -*- coding: utf-8 -*-

from osgeo import gdal

hdf = gdal.Open('MOD07_L2.A2013036.0535.005.2013079062316.hdf')
sdslist = hdf.GetSubDatasets()

names = []
for s in sdslist:
names.append(s[0])

sds = []
for n in names:
sds.append(gdal.Open(n))

out_names = [s.rsplit(':', 1)[1] for s in names]

for ind, name in enumerate(out_names):
geotrans = gdal.GCPsToGeoTransform(sds[ind].GetGCPs())
if geotrans:
dst_name = name + '.tif'
format = "GTiff"
driver = gdal.GetDriverByName( format )
dst_ds = driver.CreateCopy( dst_name, sds[ind], 1 )
dst_ds.SetGeoTransform( geotrans )

Редактор материалов, модератор форума

Rumato
Активный участник
Сообщения: 104
Зарегистрирован: 06 окт 2012, 15:35
Репутация: 0
Контактная информация:

Re: HDF to Geotiff используя Python API GDAL

Сообщение Rumato » 27 июн 2013, 18:46

Александр Мурый, большое спасибо за помощь! Ваши ответы хорошо помогли мне разобрать что и как, спасибо!

Ответить

Вернуться в «GDAL/OGR»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 16 гостей