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

С некоторых пор фаззер (в связи со злоупотреблениями) выдаётся желающим лично по просьбам в IRC под роспись. :3

twms ещё понятно, а тут за что… ладно, будем смотреть что за зверь IRC…

А что за злоупотребления? Планируется ли добавить плагин к остальным плагинам в JOSM?

В Кемеровской области нарисовали тучу пересекающихся полигонов.

Поставил как написано в инструкции. При старте josm-а выдаётся сообщение, что плагин завершился с ошибкой, в консоли:

загрузка модуля ‘fuzzer’ (версия 15)
org.openstreetmap.josm.plugins.PluginException: В модуле fuzzer произошла ошибка
at org.openstreetmap.josm.plugins.PluginInformation.load(PluginInformation.java:280)
at org.openstreetmap.josm.plugins.PluginHandler.loadPlugin(PluginHandler.java:475)
at org.openstreetmap.josm.plugins.PluginHandler.loadPlugins(PluginHandler.java:533)
at org.openstreetmap.josm.plugins.PluginHandler.loadLatePlugins(PluginHandler.java:572)
at org.openstreetmap.josm.gui.MainApplication.main(MainApplication.java:245)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at org.openstreetmap.josm.plugins.PluginInformation.load(PluginInformation.java:271)
… 4 more
Caused by: java.lang.NoSuchMethodError: org.openstreetmap.josm.tools.I18n.tr(Ljava/lang/String;)Ljava/lang/String;
at fuzzer.FuzzySelectAction.(FuzzySelectAction.java:61)
at fuzzer.FuzzerPlugin.(FuzzerPlugin.java:18)
… 9 more

Josm версии 4487

Fuzzer подхвачен немцами, допилен и переименован в scanaerial.

http://wiki.openstreetmap.org/wiki/Scanaerial

Поставил scanaerial может я делаю что-то нето, но он висит продолжительное время хотя скачал маленькую область карты 1км на 500м, выбрал в пункте меню? тыкнул на озеро. И всё я сомневаюсь, что при таком подходе это всё занимает столь долгое время.

lenux, там можно поколдовать немного с настройками. Иногда нормально отрабатывает (на реках), иногда “уходит в работу” и не возвращается :slight_smile:

В частности, можно уменьшить douglas_peucker_epsilon (я поставил 4.20) - это параметр “упрощённости” получаемой линии. Чем больше, тем грубее будет полученная линия.

И параметр, снимающий “повисание” - colour_str. Чем ниже, тем более точно скрипт пытается найти указанный цвет. Т.е. на неконтрастном снимке его нужно уменьшать. Например на базовом 30 - у меня озеро скрипт не смог найти (тупит и всё). Поставил 20 - нашлось достаточно быстро.

Напоминаю, настройки хранятся в файле ~/.josm/plugins/ext_tools/scanaerial/scanaerial.cfg

Хотя местами, конечно, чудеса выдаёт:

Причём приблизил изначально достаточно близко, чтобы одно поле вместилось… Видать приближение в josm не ограничивает область, на которой скрипт пытается обводить однородные объекты…

progserega, это вполне нормальный скан бинга. На зуме, где у него куча зачёркнутых фотоаппаратов :slight_smile:

Скан-то нормальный, проблема-то в том, что плагин “закозявило” на этом поле…

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

Цитата:
limiting the area would not help much. The script needs to detect the borders and i dont think that it will be ever possible to detekt grainfields, grassland and the like.
I had very good results in scanning the lakes in sibiria (you can find many examples around Anadyr). These lakes have a contour with very high contrast.
There are many promising ideas to improve scanaerial, but i have no time in near future to code them.

progserega Поставил, у меня Python нагружает всего одно ядро процессора из 4х. Вот и не спешность в работе.

Посмотрел scanaerial.cfg там в секции WMS настройки для Bing, а что нужно для космоснимков прописать?

Разобрался:
там надо исправить
wmsname = IRS
wms_server_url = http://irs.gis-lab.info/?layers=irs&

Может быть кому-то будет интересно.

На днях я реализовал еще один плагин для обводки лесов и прочего, работает аналогично Scanaerial, но с некоторыми отличиями.

Во-первых он написан на Java как обычный плагин, в силу чего:

  • Никаких дополнительных зависимостей, кидаем джарку в plugins и включаем в настройках, в меню появляется новый пункт
  • Сканирование производится по кешу первого видимого Imagery слоя JOSM, поддерживается TMS/Scanex/Bing - то есть снимки повторно с сервера не выкачиваются
  • Учитывается смещение снимков
  • По моим ощущения работает быстрее

Отличия в схеме работы, возможно будут меняться:

  • Картинка прогоняется через медианный фильтр (размер - vectorizer.image.filter.median.size, 0 - отключить фильтр)
  • Для определения цвета используется не сфера в пространстве RGB, а эллипсоид, определяемый на основе распределения цветов окрестности начальной точки заданного размера (размер окрестности - vectorizer.color.area.size, по умолчанию 3 - это значит что не стоит кликать ближе чем на 3 пикселя к краю, если надо выделять маленькие области - можно уменьшить). Радиус эллипсоида по каждой из осей определяется как (3*среднеквадратичное отклонение) и дополнительно увеличивается на vectorizer.color.ellipsoid.expand

JAR: https://github.com/downloads/alno/josm-vectorizer/vectorizer.jar
Исходники: https://github.com/alno/josm-vectorizer

Тестировал только на IRS и Bing.
Из известных багов - может падать, если выделяется область вблизи смены уровня максимального зума снимков.

P.S. Кое-где в коде пришлось копировать куски из ядра JOSM в силу того, что они в ядре плохо доступны:

  • Преобразование координат тайлов в lat/lon из слоев - почему-то там поддерживаются исключительно целые координаты, хотя формула вполне допускает дробные, и обратная формула также выдает дробные.
  • Douglas-Peucker почему-то protected внутри команды упрощения, пришлось скопировать.

Классная штука! Ещё бы научилась сама докачивать снимки если лес распространяется на не загруженную область.

Можно сделать, но надо тогда внести ограничение на размер области, чтобы случайно не выделить всю планету. Хотя это ограничение в любом случае сделать стоит.

А этот алгоритм будет работать для png с уже “готовой” RGB палитрой из, скажем, 10 цветов ?

Из-за использование палитры проблем не должно быть, потому что цвет берется не напрямую из растра, а из BufferedImage, которая осуществляет преобразование и возвращает RGB.

Единственная проблема, которая мне видится - если цветов будет мало, то много могут оказаться за рамками 3*sigma и будут дырки в полигоне - тогда надо увеличить значение параметра vectorizer.color.ellipsoid.expand.

Вообще этот эллипсоид может быть сведен к стандартной сфере с заданным радиусом, если поставить vectorizer.color.area.size=0 - тогда не учитывается никаких пикселей кроме центрального, начальные радиусы очевидно становятся равными 0 (эллипсоид вырождается в точку), и тогда vectorizer.color.ellipsoid.expand означает радиус.

Если есть примеры такого слоя - скажите, интересно будет потестить.

Растеризованный генплан, который был изначально векторным (как вариант, jpeg
преобразуется в png только с цветами стиля векторизации с помощью gimp или imagemagick. Совсем глупый пример - карта созданная mapnik).
Импортируется в piclayer, либо просто используется WMS.

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

А что это за участок именно? Какие координаты? Хочу посмотреть как именно перескакивает, возможно такие случаи можно решить более тонкой [авто]настройкой фильтра.