Рисование леса и других однородных полигонов - скрипт JOSM+python

Замечательную вещь для автоматического рисования леса сделали Komяpa и Upliner, сырую правда, но уже рабочую :slight_smile:
Вам потребуется:

  1. JOSM http://josm.openstreetmap.de/
  2. python 2.6 http://www.activestate.com/activepython/
  3. модуль для питона python-imaging http://www.pythonware.com/products/pil/
  4. плагин fuzzer для JOSM http://code.google.com/p/josm-plugins/downloads/list (спасибо Upliner-у)
    – поместить его в папку с плагинами JOSM (для windows путь в проводнике %AppData%\JOSM\plugins) и включить плагин в настройках JOSM
  5. скрипт на питоне fuzzyselect.py http://latlon.org/fuzzyselect.py (спасибо Komяpе)
    – создать папку fuzzer с этим файлом и поместить её в папку с плагинами JOSM

В JOSM появится меню Инструменты – Fuzzy select (Shift+K). Нажимаете, и тыкаете в центр куска леса или поля, получаете окно “Трассировка (разбор данных OSM)”, ждёте отработки скрипта (от 5 сек до минуты). Скрипт скачает изображение с WMS, определит границу леса (по разнице в цвете), и векторизует её. Плагин подхватит полигон или мультиполигон и вставит в JOSM.
Если повезет, быстро получите нормальный кусок леса, если нет, скрипт будет работать больше 2-3 минут и создаст лес на пол-региона или не сможет его векторизовать и ничего не выдаст.

discuss!

НАПОМИНАЮ, чаще всего – нужно использовать тег natural=wood, в России все леса входят в лесничества (лесной фонд), и большинство обслуживаются редко.
И только если леc обслуживается регулярно (очищается, рубится и делаются лесопосадки) – то ставим landuse=forest. см. Wiki

В процессе работы скрипта можно увидеть какой полигон распознался в текущий момент – в файле img.png в папке fuzzer. Масштаб может увеличиваться, т.к. сейчас скрипт расширяет область поиска по мере поиска замкнутой внешней границы леса.

Попробовать настроить параметры скрипта, чтобы он лучше ловил границы леса вы можете отредактировав файл fuzzyselect.py:

  1. Из какого WMS брать картинку для распознавания - в 30-32 строках раскомментьте нужное (пробелы в начале строк не удаляйте). Думаю лучше оставить YahooSat, он вроде контрастней, и разрешения достаточно (если у вас стоит кэширующая twms, то выбирайте строку с 127.0.0.1):
  a = "http://wms.latlon.org/?layer=yhsat&format=image/jpeg&force=noresize&width=700&bbox=%s,%s,%s,%s"%tuple(bbox)
#a = "http://127.0.0.1:8080/?layer=yhsat&format=image/bmp&force=noresize&filter=median&width=1200&bbox=%s,%s,%s,%s"%tuple(bbox)
#a = "http://irs.gis-lab.info/?layer=irs&format=image/jpeg&force=noresize&width=600&bbox=%s,%s,%s,%s"%tuple(bbox)
#a = "http://onearth.jpl.nasa.gov/wms.cgi?request=GetMap&layers=global_mosaic&styles=IR2&srs=EPSG:4326&width=1000&height=1000&format=image/jpeg&bbox=%s,%s,%s,%s"%tuple(bbox)
  1. Насколько чувствителен алгоритм распознавания границы цвета:
init=5                       # размер квадрата спутникового изображения, чем больше -- тем меньше разрешение и хуже видны дороги и границы = 4-5-10 is ok

color_str = 25               # разница цвета пикселей у границы, чем больше -- тем больше разных (близких к цвету указанной точки) цветов захватит скрипт = 20-25-30 is ok
medianfilter_str = 7         # сила усреднения цветов пикселей, чем больше -- тем расплывчатей границы леса = 5-7-13 is ok

douglas_peucker_epsilon = 2  # коэф. ступенчатости границ полигона, чем больше - тем меньше точек и поворотов будет в линиях = 0.71 - 3 is ok (don't set less than 0.71!)
zoom_no_more_than = 4        # количество увеличений площади анализа (картинки со спутника), если лес полностью не поместился в исходном квадрате
  1. Для выделения рек/озёр/водоёмов нужно лишь уменьшить color_str до 10 например (или около того), т.к. цвет воды очень не сильно колеблется.

О, я тоже нашел этот плагин :slight_smile: отбой вопроса в соседней теме.
Завтра попробуем.
А без питона никак?

ну если перепишешь питоновскую часть :slight_smile:

На чём? :slight_smile:

Конечно на Java. :slight_smile:

Хоть на javascript. :slight_smile:
на входе - широта-долгота клика как параметры командной строки, на выходе - .osm в stdout. что будет внутри, явовскую часть плагина слабо волнует :slight_smile:

А если джосм ругается, что “Cannot run program “pythonw” (In directory “C:\Users\1\AppData\Roaming\JOSM\plugins\fuzzer”): CreateProcess error=2, …”, в чем может быть проблема?
Если в проводнике руками ткнуть в fuzzyselect.py, то мелькает окошко python.exe, т.е. сам python доступен.

p.s. Python стоит 2.5, но проблема думаю не в этом… Может из-за того, что стоит в \program files\development\python25?

pythonw должен быть доступен в PATH.

что с ним делать, поподробнее пожалуйста.

а. я тормоз, это ехешник)) ехешники мы (виндузятники) запускать умеем.

ps. Заработал, когда прописал прямой путь на pithonw в PATH, который в “Переменные среды пользователя …” (а не в “Системные переменные” – сюда кстати Питон прописывается сам, но винда похоже эти переменные не видит).

[offtopic]
Сложно вам, виндузятникам…
[/offtopic]

Понизил color_str до 20, а то и зелёные поля часто рядом прихватывает))
Спасибо большое! главное, что оно работает))
Не, 20 маловато, 26 самый ок.

у меня вот этого не делается, просто серенькие полигоны, все отношения назначаю вручную. Что не так делаю, доктор?

Всё верно, скрипт сейчас не проставляет теги.

Насколько я понял, в данный момент скрипт не понимает, что подложка сдвинута?
Как-то странно создаются полигоны -не достают до края леса метров 50. Вместо прямой линии (просеки) - что-то пилообразное.
Если полигон не был создан, в стек команд добавляется пустой FuzzySelect. Не смертельно, но непонятно.
Сделал бы скриншот, но выложить некуда.

шоты на radikal.ru

Да, пилы имеются. Удаление руками каждой второй точки приводит к более благолепному виду.

Как обращаться со смещением непонятно, местами это важно.

Кстати, теги может и не нужны – мы же не только леса будем обклацывать, а и поля и прочее однородное.
Несколько раз рисовался аутер, а рядом с ним, за пределами иннер (ну то есть, я догадываюсь, что это такие роли, сейчас же они не ставятся пока…), то есть рисуется несколько наружных полигонов.
В целом неплохо – ткнул раз, и все леса на экране выделились)) но обещанной логике это немного не соответствует. Посему, предупреждаю.

А еще картинка курсора портится, не восстанавливается. Жму шифт-к, курсор становится крестиком, тыкаю, рисуется полигон, после жму s – мой любимый основной режим – курсор остаётся крестиком, и только перетыкиванием скажем последовательно “a” - “s”, курсов возвращается к нормальном рисуночку. Трассировщик озёр тем же страдал.

Чтобы не было “пил” и векторы были более сглажены - ставьте douglas_peucker_epsilon побольше (сверху он не ограничен)

Смещение вручную править, например, основной слой не грузить, а после работы скрипта всё выделять и перемещать.

Как прописать «прямой путь на pithonw в PATH, который в “Переменные среды пользователя …”»?

Мой компьютер - Свойства - Дополнительно - Переменные среды
дописываешь в path через точку с запятой нужный каталог

Переписывайте уж сразу i.cluster :
http://grass.itc.it/grass64/manuals/html64_user/i.cluster.html
Отлично отличает мелководье от глубокой воды в реках и озерах.
Правда очень тяжело бороться с лужами и весенней талой водой :wink:

http://grass.osgeo.org/wiki/Image_classification

А что в plugin’е так тормозит: закачка картинок или обработка на питоне?