Импорт данных MOD14A1 в формат ESRI shape
Эта статья описывает процесс подготовки к работе данных MOD14A1 (подробнее про эти данные). Исходно эти данные распространяются в HDF, который нельзя назвать удобным форматом для работы. Статья является синтезом других статей уже размещенных на нашем ресурсе, мы постараемся не дублировать информацию из них, а дать ссылки. Обратите внимание, что вам может быть не нужно осуществлять импорт именно в формат ESRI shape. Целевой формат зависит от того, что вам нужно сделать с данными в дальнейшем.
Многие этапы можно реализовать по другому. Исправления к процессу аналогичные по скорости и удобству всячески приветствуются.
Получение данных
Для начала работы необходимо получить фрагменты (тайлы) MODIS на вашу территорию и временной промежуток. Данные в исходном формате HDF можно скачать здесь.
Для загрузки можно использовать скрипт (скачать). Строка запуска:
python download_modis_data.py 2016 46 http://e4ftl01.cr.usgs.gov/MOLT/MOD14A1.006/ hdf
Начало работы
Для начала работы понадобится:
- Среда с установленным GDAL, python-gdal. Подойдет NextGIS QGIS.
- wget с дополнительными библиотеками
- Набор скриптов оберток для GDAL - DHI. В принципе они не обязательны, но могут оказаться полезными для автоматизации.
Конвертация в GeoTIFF
Исходная проекция данных - Синусоидальная (Sinusoidal), конвертация в неё, а не в другую, возможно более удобную сэкономит время на перепроецирование. Перепроецировать в другую систему координат лучше окончательный векторный слой.
Исходное разрешение: 1000 метров.
Исходные наборы данных: Формат HDF позволяет хранить в одном файле несколько наборов данных (SDS, subdatasets). Нам нужно импортировать только данные за 8 дней (допустим каналы с оценкой качества - Quality Assessment пока не нужны).
Конвертацию удобно проводить с помощью скрипта prepare_data.py (скачать). Строка запуска:
python prepare_data.py MODIS_Grid_Daily_Fire:FireMask с:\MCD14A1\2003\hdf\ с:\MCD15A1\2003\tif\ -e SIN
Узнать строку названия SDS (в примере выше это MODIS_Grid_Daily_Fire:FireMask) можно посмотрев метаданные одного из файлов HDF с помощью gdalinfo:
gdalinfo filename.hdf
Альтернативой prepare_data.py является MODIS Reprojection Tool (MRT). Его использование описано в статье: (Импорт продуктов MODIS уровней 2G, 3, 4 с помощью MRT).
Количество отдельных растров генерируемых при импорте данных с 2000 по 2010 год составляет около 3950 растров.
Конвертация в формат ESRI shape
Результатом предыдущего этапа является много растровых файлов в формате GeoTIFF. Если вам нужны именно растры, на этом можно остановиться. Если нет, конвертируем данные в вектор. Полученные файлы представляют собой 8-канальные растры (каждый канал соответствует одному дню), в которых каждой ячейке присвоено значение от 0 до 9.
Код ячейки | Значение ячейки | Значение ячейки |
---|---|---|
0 | отсутствует исходная информация | missing input data |
1 | не обрабатывалось (устарело) | not processed (obsolete) |
2 | не обрабатывалось (устарело) | not processed (obsolete) |
3 | вода | water |
4 | облако | cloud |
5 | не пожар | non-fire |
6 | неизвестно | unknown |
7 | пожар (низкая достоверность) | fire (low confidence) |
8 | пожар (номинальная достоверность) | fire (nominal confidence) |
9 | пожар (высокая достоверность) | fire (high confidence) |
Далее необходимо получить данные о пожарах для каждого дня в году, путем разложения растра поканально и извлечением только тех ячеек, значение которых равно 8 или 9. Для удобства оперирования данными в дальнейшем, их необходимо преобразовать в формат shp-файла.Для разложения растры на каналы используется команда gdal_translate. Ниже приведен пример запуска:
gdal_translate -b 1 input.tif output.tif
где -b указывает на то, что нужно извлечь канал, 1 - номер канала
С помощью команды gdal_calc необходимо извлечь только те ячейки, значение которых равно 8 ли 9, что соответствует пожарам с номинальной и высокой степенью достоверности, а остальным значениям присвоить значение NoData. Условием отбора является выражение “А*(А>7)”. Пример запуска команды:
gdal_calc -A input.tif --outputfile= output.tif --calc='A*(A>7)' --NoDataValue=0
С помощью команды gdal_polygonize можно преобразовать полученные ячейки в полигоны и присвоить им атрибутивную информацию в виде даты возгорания.
gdal_polygonize -nomask output.tif output.shp
где при необходимости можно указать файл маски, при этом поменяв параметр "-nomask" на "-mask" и искомый файл.
Таким образом можно легко извлечь необходимую информацию и преобразовать её в формат ESRI shapefile.
Также можно воспользоваться скриптом proc_fields.py, позволяющим создавать shp-файлы, содержащие полигоны зафиксированных в течение 1 дня горячих точек из исходного 8-канального растра, полученного на предыдущем этапе.
Для каждого 8-канального растра скрипт выполняет следующие действия:
- внутри каждого канала исходного изображения отбирает только те ячейки, значение которых равно 8 (номинальная достоверность наличия пожара в данной точке) и 9 (высокая достоверность наличия пожара), всем остальным ячейкам присваивает значение 0 (NoData);
- векторизует полученные данные с помощью команды gdal_polygonize. Результат: shp-файлы с полигонами пожаров, где название файла соответствует порядковому номеру дня в году;
- добавляет в каждый сформированный shp-файл поле со значением соответствующей даты возгорания в виде порядкового номера дня в году (н-р, 1 января - "1", 31 декабря - "365").
В дальнейшем, при необходимости, можно объединить ряд файлов в один, тем самым сформировав файл пожаров за определенный год, месяц или неделю (см. пункт 4).
Схема преобразования данных представлена на рисунке ниже:
4. Создание единого слоя
Для пакетного склеивания ежедневных shape-файлов удобно использовать расширение Merge Shapes из QGIS (подробнее про расширение). Склейка в данном случае осуществляется потайлово, но можно склеивать и все вместе.
5. Перепроецирование в WGS84 Lat/Long
Результирующие shape-файлы может понадобится перепроецировать из синусоидальной проекции в географическую систему координат WGS84. Можно делать это и на этапе импорта в GeoTIFF, но это не рекомендуется, так как займет во много раз больше времени чем перепроецировани уже отфильтрованного вектора.
Система координат растров после работы MRT следующая:
То есть используется Sinusoidal проекция на сфере радиусом 6370997 метров (цифра подтверждается MRT_Users_Manual.doc, стр. 57). В ArcGIS такая сфера соответствует сфере D_Sphere_ARC_INFO из папки Geographic Coordinate Systems\Spheroid based\. Соответственно для векторного файла PRJ файл будет выглядеть следующим образом:
PROJCS["World_Sinusoidal", GEOGCS["GCS_Sphere_ARC_INFO", DATUM["D_Sphere_ARC_INFO", SPHEROID["Sphere_ARC_INFO",6370997.0,0.0] ], PRIMEM["Greenwich",0.0], UNIT["Degree",0.0174532925199433] ], PROJECTION["Sinusoidal"], PARAMETER["False_Easting",0.0], PARAMETER["False_Northing",0.0], PARAMETER["Central_Meridian",0.0], UNIT["Meter",1.0] ]
Наложение растра только что импортированного MRT и границ субъектов РФ в Lat/Long WGS84 (источник) в ArcGIS (трансформация WGS84 -> Sinusoidal "на лету") приводит к достаточно хорошему соответствию, то есть система координат растра верна:
Для перепроецировании растра или вектора в Lat/Long WGS84 используем:
gdalwarp -s_srs "+proj=sinu +R=6370997.0 +nadgrids=@null +wktext" -t_srs EPSG:4326 A2000057_2.tif A2000057_2_wgs.tif
или
ogr2ogr -s_srs "+proj=sinu +R=6370997.0 +nadgrids=@null +wktext" -t_srs EPSG:4326 h19v02_wgs.shp h19v02.shp
Стоит повторить, что это лишь один из возможных путей импорта данных в векторных формат, однако он работает.