Мапить леса

Угу, разрешение, мягко говоря, херовое. А осваивать Landsat население не хочет - простота ему дороже точности.

Собрать landsat по инструкции Zverik’а не сложно http://gis-lab.info/qa/landsat-tiles.html
Неплохое описание основных типов композитов http://gis-lab.info/qa/landsat-bandcomb.html

Это для вас просто. Или для меня. Или для Zverik-а. А четыре пятых присутствующих здесь перестанут читать, когда увидят первый раз слово “Линукс”. И на этом все кончится. Обсуждали уже…

да по инструкции с гислаба всё просто. Но только действительно линукс …

Наличие леса в интересующем районе можно глянуть хотябы на этом сайте https://fetch.astrodigital.com

Попробовал сгенерировать плавные полигоны. Порядок таков:
Нужен QGIS с модулем GRASS

  • Выкачать с http://earthenginepartners.appspot.com/science-2013-global-forest/download_v1.1.html tiff, не помню какой, но вроде первый.
  • Обрезать
  • gdal_calc.py блаблабла --calc=“1*(A>1)” #если значение пиксела больше 1, то выставить его в 1, если меньше 1 - то выставить его в 0.
  • gdal_sieve.py #убрать мелкие кусты
  • gdal_polygonize.py #получается вектор, но с границами из прямых линий
  • в GRASS v.generalize method=chaiken #получается вектор со сглаженными границами
  • git clone --recursive https://github.com/pnorman/ogr2osm
  • python ogr2osm/ogr2osm.py forest_generalised.shp #конвертация в .osm
  • Открываю JOSM, копирую кусок границы большого участка тайги на отдельный слой данных, и вручную корректирую разные отроги леса.

http://www.openstreetmap.org/#map=13/43.4542/132.3072

Это всё можно склеить в одну последовательность в модуле QGIS Processing, только я не умею им пользоваться.

Что-то не очень точно получается. Граница с погрешностью гдето ±20 метров. Да и в некоторых местах наверно лучше по дорогам разрезать полигон.

хороший сценарий, будет время надо его рапробовать.
надеюсь наши гис-гуру займутся ентим преобразованием, вместо наполнения форума :slight_smile:

20 метров хороший показатель для черновой закраски “пустых земель”, да и никто не запрещал потом подкорректировать по бингу мапбоксу сканексу.

Да, для массовой обрисовки нужно наверное придумать такой алгоритм, что бы полигоны бы сжимались внутрь где-нибудь на километр, и сильно упрощались. Тогда большие массивы будут залиты лесом, а их изрезанные границы - будут рисовать плагином FreeDraw по бингу.

Кстати интересно как это сработает с объектами с более чёткой границей вроде свежевспаханных полей. Мне кажется результат должен быть лучше.

Поделюсь своими радостью и граблями. Инструкция от Ильи-Зверика действительно очень простая (“оно работает!!!”). Однако я столкнулся с тем, что в репозиториях Ubuntu (14.04) оказалась старая версия QGis (2.0.1), которая выдавала странную ошибку Python при попытке запустить нарезку тайлов QTiles. Прописал в системе репозитории “от производителя” (http://qgis.org/ru/site/forusers/alldownloads.html#debian-ubuntu), поставил свежую версию QGis (2.10.1) - всё заработало. Вторая моя грабля из разряда copy-paste (чистая невнимательность) - по инструкции, в настройках QTiles рекомендуется выбрат формат jpg, а в строке для подключения в JOSM написано png. Но кто ж смотрит на такие мелочи… :roll_eyes:

Готовые тайлы (до 13 зума) с одного снимка заняли 57 МБ.

Спасибо BushmanK и Zverik за инструкции!

-del

Потому что нужно автоматизированное решение:

  • Плагин для JOSM
  • Ссылка на сервер тайлов ZXY которую можно вставить даже в iD
  • что угодно простое

d1g и pfg21, я последний раз объясню, почему то, о чем вы говорите, малореально.

  1. Данные Landsat 8 обновляются все время, и делать, например, сервер, на котором бы заранее были подготовлены тайлы, например, на целую область (в смысле, административную единицу) - бессмысленная трата места на сервере и времени, потому что до того времени, как кто-нибудь соберется воспользоваться этими данными, произойдут еще изменения и то, что там есть, устареет, а новых снимков там не будет.

  2. Данные Landsat 8 - весьма объемная штука, так что одним только “выкачиванием последнего” на какую-то территорию можно забить любые имеющиеся винты - одна сцена - это 2Гб в несжатом виде.

  3. Для маппинга разных вещей нужны снимки, которые сделаны в разное время года на одну и ту же территорию.

  4. Выбор сцен - ручная задача в любом случае, потому что облака, низкий контраст и все такое. Если кто-то хоть раз пытался не требовать готового на форуме, а самостоятельно с этим поэкспериментировать, то он бы знал, что это так.

  5. Для детекции разных природных объектов (леса, болота, кустарник, заливные луга и все такое) нужны композиты разных каналов. Это увеличивает и объем готового результата и объем работы.

  6. Сборка композита - автоматизированный, но ручной процесс, потому что нужно подбирать параметры сжатия гистограммы исходя из визуальной различимости искомых объектов в сцене, которая зависит от кучи условий при съемке каждой конкретной сцены, иначе композит теряет кучу информации. Автоматика дает результат средней паршивости.

  7. Софтина с “одной кнопкой” (почему не с одной, я описал уже выше) - возможна. Есть коммерческие аналоги, например, http://www.geosage.com/highview/features_landsat8.html Но это достаточно сложная штука, которая по объему разработки тянет на коммерческий продукт. И тут возникает вопрос: что проще, нескольким желающим перестать бояться командной строки и ImageJ и научиться делать простые вещи самостоятельно, или пресловутым профессионалам (только не в ГИС, а в разработке ГИС, что несколько разные вещи - к вторым лично я, например, себя точно не отношу, я сам - квалифицированный пользователь) напрячься и написать инструмент для особо ленивых?

  8. Почему не “плагин для JOSM” из того, что сказано выше, должно быть очевидно, но я поясню: если такая программа будет существовать, то делать ее только для нужд узкого сообщества OSM абсолютно бессмысленно, это должен быть самостоятельный инструмент, которым смогут воспользоваться и другие.

Для тех, кто верит в одну кнопку, я приведу скриншот, который демонстрирует минимально необходимый набор инструментов настройки для сборки композита из Landsat 8, который существует в коммерческом продукте:

Меньше - не имеет смысла. Имеет смысл - больше.

Как вариант, можно это не делать, а просто сохранить в shape файл. В JOSM плагин OpenData его спокойно воспримет.

Есть ли рендеры отображающие вырубки landuse=logging?

OSMand отображает

В инструкции Zverik’а по сборке landsat похоже опечатка: после корекции цвета результат помещается в result2.tif, а все дальнейшие операции расписаны для result.tif.

Расскажу о своём способе векторизовать леса из проекта, указанного в первом посте. Может кому-то будет интересно.

Нам потребуется:

  • Квадраты леса treecover2000, взятые тут

  • QGIS (точнее gdal calc)

  • GlobalMapper (необязательно, уверен есть способ и в QGIS, но я его не изучал)

  • JOSM

  • JOSM-модуль Scanaerial

  • JOSM-модуль RemoveRedundantPoints (опционально)

Процесс подготовки:

  1. Качаем квадраты нужной территории по ссылке выше.

  2. Далее нужно пересчитать их с помощью команды gdal calc. Формулу я взял у trolleway тут, но с другим значением. Экспериментальным путём решил выставить 55, чтобы убрать лишние редколесья и оставить только густой лес и чтобы граница леса была поменьше. Использовал её через приложение OSGeo4W Shell, которое идёт в пакете с QGIS (может ещё как-то можно использовать gdal, не знаю). Итог такой (соответственно, ссылку на файл и полученный результат меняем под себя):

    gdal_calc -A "D:\Downloads\Hansen_GFC2014_treecover2000_60N_130E.tif" --outfile="D:\Downloads\Hansen_GFC2014_treecover2000_60N_130Emod.tif" --calc="1*(A>55)"
    
  3. Далее нам нужно порезать их на тайлы png с прозрачностью (transparency которая, такие тайлы очень удобно потом использовать). Про QGIS ничего не знаю, пошёл проще и использовал GlobalMapper (экспорт в веб-формат, тайлы OSM, png, transparent, без пустых тайлов, зум 12). Максимальный зум 12-й, больше нет смысла. Меньше делать есть смысл только для обзорной карты, в работе они не используются.

  4. Готовые тайлы подключаем к JOSM. Ссылка:

    tms[12]:file:/путь/до/тайлов/{zoom}/{x}/{y}.png
    

    Я использую в связке со слоем Mapnik-a, что выглядит следующим образом: Это очень удобно, потому что можно оценить где леса уже отрисованы, а где нет (не всегда новые леса видны будут на Mapnike, поэтому придется увеличивать до максимума, чтоб они отрисовались. А лучше, конечно, просто скачать данные, например через Overpass-запрос, чтоб точно не наделать дублей).

  5. Устанавливаем Scanaerial как написано тут. Затем редактируем scanaerial.cfg под наши нужды:
    в разделе [WMS] устанавливаем:

    fixedzoomlevel = 12
    

    и добавляем наш “сервер” -

    server_api = tms
    server_name = Hansen GFC2015 treecover2000
    server_url = file:/путь/до/тайлов/{zoom}/{x}/{y}.png
    

    На все остальные строчки в начале ставим #, чтоб они не учитывались.
    Настройки раздела [SCAN] методом проб и ошибок я выбрал для себя следующие:

    [SCAN]
    douglas_peucker_epsilon = 0.60
    deactivate_simplifying = 0
    colour_str = 30
    maxfilter_setting = 5
    size_limit = 30000
    

    size_limit делайте под себя, из расчёта, что 1000 = квадрат 50.2 x 50.2 км. Если кусок замкнутого леса огромен и вы выставили, например, 10000, то ждать придётся долго (в моём случае конца процесса я не дождался, после 2.5 часов я сбросил просто). Если же кусок леса относительно небольшой, то хоть 100500+ ставь, он обработает только его и быстро. Поэтому у меня по умолчанию стоит 30000, когда наталкиваюсь на огромный кусок, ставлю 1000, делаю квадраты-мультиполигоны и склеиваю границы. Обработка полного куска 1000 на моём ноуте занимает 3-6 минут. 5000 как-то обрабатывались 45 минут.
    И в разделе [TAGS] добавляем:

    natural = wood
    

    и также всё остальное - #.

Процесс векторизации:
В JOSM вызываем инструмент Scanaerial (у меня это клавиша X) и тыкаем на кусок леса. Получится что-то типа: Далее чистим от мелких областей (которых процентов 90 в участниках отношений и которые почти все являются артефактами). Выделяем всё, что входит в мультиполигон, Поиск " areasize:-30000" (можно поэкспериментировать с числом) и отметить Найти в выделенном. Затем удалить новое выделенное. Я ещё упрощаю внешнюю линию с модулем RemoveRedundantPoints на max значении 53, а потом режу полученную линию если более 2000 точек остаётся в ней. На результат при имеющихся погрешностях это не сильно влияет, зато значительно сокращает количество точек. Если после всего этого мультиполигон по-прежнему велик, можно его разделить на несколько. Вот и всё, черновой вариант большого куска леса готов.
Также, так как данные от 2000 года, можно их сразу проверить. Подключаем в JOSM ещё один слой, который отображает изменения леса с 2000 по 2014:

tms[12]:http://earthengine.google.org/static/hansen_2014/loss_tree_gain/{zoom}/{x}/{y}.png

и смотрим те места, которые выделены красным (леса больше нет) и синим (новый лес вырос) цветом.
Параллельно, если хочется сразу качественно сделать, можно в фоне подгружать и Бинг-слой и делать финальную отрисовку по нему. И также подготовить слой с последними снимками Landsat-8. Я использую всё вместе сразу.

Вывод: на мой взгляд, очень удобный и простой способ черновой отрисовки больших массивов леса для дальнейшей ручной коррекции его краёв. Для 12 зума качество получается очень даже приемлемое. Таким образом я отрисовал Приморский и юг Хабаровского краёв. На это ушло примерно 6-8 дней по 2-4 часа в день (по бОльшей части из-за того, что много экспериментировал с разными настройками и способами). Несмотря на приличные (по меркам рисования 17-18 зумов) погрешности, качество автоотрисовки предложенным методом значительно выше в сравнении с быстрой ручной отрисовкой больших кусков леса (что видно даже на картинке выше). Небольшие массивы леса лучше всё же рисовать руками.
Пожалуй, процесс подготовки самый сложный. Потом процесс рисования и коррекции ничем не отличается от простого рисования в JOSM.

Спасибо за подробную инструкцию!

Здесь лучше добавить информацию о вырубках и приросте леса:

gdal_calc.py -A "treecover2000.tif" -B "gain.tif" -C "loss.tif" --outfile="treecover_with_gain_and_loss.tif" --NoDataValue=0 --calc="1*((1*(A>55)+B-C)>0)"