Трассировка рек

Всем привет.

Предлагаю потестировать мою новую программу - RiverTrace.
Её предназначение заключается в автоматизации прорисовки линий рек по спутниковым снимкам (поддерживаются Bing и TMS).

Для запуска трассировки пользователь должен выбрать две точки: первая определяет начало линии, вторая - её направление.
При первом запуске программа создаст файл конфигурации, редактированием которого можно производить более тонкую настройку параметров алгоритма.

Вызов программы осуществляется через JOSM, с помощью плагина ext_tools.
В настройках плагина Ext Tools для RiverTrace надо назначить три команды:
1.
Название: RiverTrace (1 param)
Параметры: путь\к\программе\RiverTrace.exe lat1 {lat} lon1 {lon}
Назначение: Задаёт первую точку
2.
Название: RiverTrace (2 param + go)
Параметры: путь\к\программе\RiverTrace.exe lat2 {lat} lon2 {lon} go
Назначение: Задаёт вторую точку, запускает трассировку
3.
Название: RiverTrace (go)
Параметры: путь\к\программе\RiverTrace.exe go
Назначение: Запускает трассировку с ранее заданными параметрами

Затем этим командам надо задать горячие клавиши (к примеру, “U”, “I” и “O”) через настройки JOSM.

При первом запуске достаточно вызвать команду go (“O”), создастся объект реки с зашитыми в программу параметрами.

Скриншоты:

Ссылка на скачку версии 0.0.1.
Ссылка на скачку версии 0.0.2.
Ссылка на скачку версии 0.0.3.
Ссылка на скачку версии 0.0.4.
Ссылка на скачку версии 0.0.5.
Ссылка на скачку версии 0.0.6.

Vort
Получится ли добавить усредненную ширину реки и проставлять её автоматом с градацией, например, 5 метров ? Микромаппинг не нужен, т.е. если получатся сегменты от 5-10 км будет нормально. Очень нужная информация для топокарты. Спасибо.

Как-то мудрено. Отчего разом не передать координаты обеих точек? Возможно, ext_tools для этого не подойдет (давно с ним “не общался”), но есть ведь и CommandLine, уж он-то точно умеет просить пользователя указать обе точки и разом передать их в трейсер.
Параметры командной строки, в этом случае, будут:

RiverTrace.exe lon1,lat1 lon2,lat2

Смогли бы скомпилять такой вариант приложения? А уж xml для CommandLine я прикручу, если вдруг вам лень будет :slight_smile:

Имеется в виду простановка тега est_width на создаваемую линию?
Если да, то сейчас мой алгоритм делает оценку ширины в начальной точке, могу занести её в тег.
Средними значениями пока что заниматься не стоит, так как алгоритм к переменной ширине пока что плохо приспособлен.

Так сделано именно из-за ext_tools, вариант с двумя точками поддерживается, я его просто не анонсировал:
RiverTrace lat1 64.9035637 lon1 52.2209239 lat2 64.9032122 lon2 52.2213061 go

Боюсь, данный вариант не подходит, из доступних типов параметров лишь point годится, а он передается как “lon1,lat1”. Это, либо, скрипт надстройку добавлять, которая пропарсит координаты да запустит ваше приложение, либо таки, список доступных параметров вашего приложения расширять. Второй пункт, само собой, предпочтительнее.
Так что, желательно таки заиметь какой-то вариант запуска

RiverTrace.exe lon1,lat1 lon2,lat2

Он, кстати, не имеет колkизий с текущими вариантами, поскольку в каждом параметре имеется запятая, в отличии от существующих вариантов. Но нескольо ломает голову. Так что, возможны любые вариации на ваше усмотрение, будь то “point1 lon1,lat1 point2 lon2,lat2”, “commandline lon1,lat1 lon2,lat2”, “lon1,lat1 lon2,lat2 goconnamdline”, … Лишь бы, координаты одной точки принимались как “lon1,lat1”, т.е. через запятую, без пробелов, как один параметр/значение.

Можно стандартный width + source:width

https://yadi.sk/d/v8Os57mx37Gkxx
RiverTrace.exe 52.21272,64.912122 52.21302,64.9124
Правильно получилось?

Там и так на линии теги трассировщика, можно будет догадаться откуда ширина :slight_smile:
Вот новый вариант с width тегом:
https://yadi.sk/d/QXdd5HDU37H4tq

Отдельно хочу отметить, что точность вычисления ширины зависит от параметра shoreContrast.

А CommandLine ещё живой, что-то у меня при попытке поставить точку падает свежий dev JOSM :frowning:
Хотя он и валится от ошибок, но всё же запускает скрипт. Однако есть пару замечаний:

  1. Программ падает если её заблокирован доступ в интернет.
  2. Ширину думаю не стоит указывать аж с точностью до децеметров, это всё равно не так. А то по факту одно русло почти одинаковое определяет от 50 до 30 метров разброса.
  3. Почему-то направление оказалось в обратную сторону, хотя я ожидал от старта к финишу.
  4. Кстати почему второй параметр называется направление, хотя это точка окончания. А ведь первоначально я думал, что он пойдёт в этом направление на пару километров.
    Где там параметр отвечающий за упрощение линии, а то слишком часто ставит точки.

А ещё вот баг.

Согласен, округлять лучше до целого в бОльшую сторону.

Без снимков ей всё равно нечего делать.
Можно было бы при обрыве связи выдать частично просчитанный результат.
Но в таком случае пользователь не догадается о проблеме.
Да и запустить просчёт заново в случае ошибки совсем не сложно (командой “go”).
Программа хранит кеш тайлов, поэтому закачивать их заново не прийдётся.

При хороших условиях можно и дециметры определить.
Но эти условия организовать непросто, поэтому округлил пока что до метров.

У истока будет такое качество снимков, что программа явно не заработает.
Поэтому логичнее трассировать от устья и поэтому программа ставит обратное направление.
Если трассировка всё же была сделана от истока к устью, то можно в JOSM`е нажать “R”.

Это начальное направление, не точка окончания и не среднее направление.
Эту точку желательно задавать точно.
И, если повезёт, алгоритм действительно пройдёт многие километры.

С частыми точками хоть видно, что результат получен автоматически.
Упрощение же даст ложную уверенность в том, что артефакты алгоритма соответствуют реальным особенностям течения реки.
Если упрощение всё же нужно, то в JOSM есть “Shift+Y”.

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

{
  "zoom": 15,
  "lat1": 63.317077565183347,
  "lon1": 50.903440293103969,
  "lat2": 63.316583735136184,
  "lon2": 50.90418058279208,
  "iterationCount": 100,
  "sampleWidthScale": 3.0,
  "sampleLengthScale": 1.6,
  "shoreContrast": 10.0,
  "maxDifference": 15.0,
  "debug": true
}

Придуманный мной алгоритм не совершенен и поэтому не все варианты исходных данных программа сможет достойно обработать.

Версия с мелкими обновлениями:
https://yadi.sk/d/XFKTs7fU37KDYS

Вот пример конфига на 16 км.
Наверное, самые лучшие условия для программы:

{
  "zoom": 15,
  "lat1": 62.8569152351328,
  "lon1": 83.558586189330242,
  "lat2": 62.85716975568868,
  "lon2": 83.5589724274284,
  "iterationCount": 410,
  "sampleWidthScale": 1.7,
  "sampleLengthScale": 0.9,
  "shoreContrast": 10.0,
  "maxDifference": 14.0,
  "debug": false
}

upd. Ещё пример, 25 км, 1300 точек:

{
  "zoom": 15,
  "lat1": 65.599729815974456,
  "lon1": 79.337964368957415,
  "lat2": 65.599565824953331,
  "lon2": 79.3383720647277,
  "iterationCount": 1300,
  "sampleWidthScale": 1.7,
  "sampleLengthScale": 1.4,
  "shoreContrast": 10.0,
  "maxDifference": 14.0,
  "debug": false
}

Полностью переделал алгоритм трассировки.
Линии стали ровнее, стабильность и скорость работы - выше.
Новый алгоритм ещё есть куда улучшать, так что качество можно будет повысить ещё больше.

Старые конфиги к новой версии не подойдут.
Поэтому перед первым запуском конфиг надо будет удалить.
https://yadi.sk/d/6MH1_oO237iMtT

freeExec, “баг” исправлен, теперь тот участок алгоритм проходит без проблем.
Вот конфиг для обработки проблемного места с помощью новой версии:

{
  "zoom": 15,
  "lat1": 63.317077565183347,
  "lon1": 50.903440293103969,
  "lat2": 63.316583735136184,
  "lon2": 50.90418058279208,
  "iterationCount": 300,
  "scanRadiusScale": 2.0,
  "angleRange": 90.0,
  "angleStep": 4.0,
  "shoreContrast": 10.0,
  "advanceRate": 0.5,
  "debug": false
}

Ещё примеры:

{
  "zoom": 15,
  "lat1": 62.856922610057147,
  "lon1": 83.558591564418052,
  "lat2": 62.8571379736939,
  "lon2": 83.558934887171958,
  "iterationCount": 350,
  "scanRadiusScale": 2.0,
  "angleRange": 90.0,
  "angleStep": 4.0,
  "shoreContrast": 10.0,
  "advanceRate": 0.5,
  "debug": false
}
{
  "zoom": 16,
  "lat1": 65.523875376680152,
  "lon1": 79.349939041104491,
  "lat2": 65.523948165209333,
  "lon2": 79.350097291436356,
  "iterationCount": 2250,
  "scanRadiusScale": 3.0,
  "angleRange": 60.0,
  "angleStep": 4.0,
  "shoreContrast": 10.0,
  "advanceRate": 0.5,
  "debug": false
}
{
  "zoom": 16,
  "lat1": 65.600895688575221,
  "lon1": 79.333481006589,
  "lat2": 65.600913416477042,
  "lon2": 79.333886020150246,
  "iterationCount": 1000,
  "scanRadiusScale": 3.0,
  "angleRange": 80.0,
  "angleStep": 4.0,
  "shoreContrast": 10.0,
  "advanceRate": 0.5,
  "debug": false
}

upd. Добавил программе ещё скорости:
https://yadi.sk/d/bmuq3ek037tCQQ

Теперь, когда качество линий стало лучше, я добавил в программу алгоритм упрощения:
https://yadi.sk/d/6QH4akRh37tdAB

(опять надо будет пересоздать конфиг)

Добавил проверку на самопересечения:
https://yadi.sk/d/OV-kJ5x_3883qf

Теперь вот в такой ситуации

алгоритм остановится, вместо того, чтобы войти в цикл.

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

Ещё программа в режиме отладки теперь умеет выдавать вот такие картинки:

По которым можно понять почему линия повернула в ту или иную сторону.

https://yadi.sk/d/RQk2M74G38Sdcn

upd.
Мелкие исправления:
https://yadi.sk/d/3idqBKRq38eSqW

Добавлен параметр, отвечающий за шумоподавление - линии должны стать ещё более плавными.
https://yadi.sk/d/IJtyg5zA38szY4

upd. Скорость обработки снимков повышена в 1.5 - 2 раза. Без учёта времени на скачку, на моём компьютере программа просчитывает около 50 тайлов в секунду.
https://yadi.sk/d/bTOSjfhU398udU

Погонял чуток.
Как-то много тыкать :wink:
Я бы может предпочел накидать контрольных точек, а потом ждать, чем все время дергатся и вводить новые точки.

Спасибо за тест.

Если трассировка постоянно обрывается, то проблема либо в низком качестве снимка либо в неоптимальном конфиге трассировщика.
При удачном стечении обстоятельств, алгоритм проходит тысячи точек и десятки километров с одного запуска.