Информация про плагин тут: http://wiki.openstreetmap.org/wiki/JOSM/Plugins/PicLayer
Для желающих посмотреть на новый способ привязки в действии - там есть ссылка Quick animated how-to: Piclayer Usage на гифку с процессом привязки. Внимание, новые маркеры на точках были сделаны уже после картинки, так что визуально оно немного отличается!
А вы пробовали? они там были, еще до меня… из пожеланий, которые будут скоро реализованы - undo для привязки, поддержка простых видов kmz (сейчас есть простые kml). Так же собираются еще пожелания, чтоб не захламлять тему вопросов новичков.
Как пересчитывать параметры старого .cal формата в world file я знал,
новые аффинные коэффициенты чересчур абстрактны:
сдвиг понятен, а над “новой” 2x2 матрицей надо ломать голову. К тому же
она вообще говоря не ортогональна, что в 99.9% случаев противоречит
здравому смыслу.
Ошибки в GCP было бы желательно также минимизировать инвертированием
матрицы методом наименьших квадратов (A^*Ax=A^*b вместо Ax=b
для прямоугольной A с числом GCP>3).
кажется, Вы используете PicLayer не по назначению он предназначен для отображения подложки в JOSM, а не для привязки картинок с последующим использованием в других программах. Для второго (да и для первого, вообще говоря) можно использовать QGIS.
Ортогональность, насколько мне не изменяет память, должна быть относительно чего-то, так что не понимаю последнюю фразу.
Опять - если не изменяет память, я применял точный метод нахождения обратной матрицы, так что ошибки могут быть только округления.
Надо подумать, как это наложить на существующий плагин…
Точный метод применим только к квадратным (и одновременно неособенным) матрицам. Если число точек N больше 3x,
то матрица для вычисления коэффициентов аффинного преобразования размерностью 2Nx6 очевидно неквадратная,
но умножив ее на саму себя транспонированную A^A получим обычную квадратную 6x6 (6x2N2Nx6=6x6),
которая и дает оптимальное решение в смысле наименьших квадратов.
Ошибки же возникают конечно не из-за округления, а из-за “ненулевого” размера самого пиксела и
невозможности “точно” совместить калибрационную точку (GCP) с пикселом.
Мне также не совсем понятна система единиц для M* коэффициентов, не заглядывая в исходники.
Вот конкретный пример
#JOSM PicLayer plugin calibration data
#Sun Nov 27 22:21:58 CET 2011
POSITION_Y=6708383.375731533
POSITION_X=602463.1049788792
M12=-714.691403694874
M11=0.508636037014039
M10=6.263463862108147E-5
M02=43.42632371753174
INITIAL_SCALE=673.3630407396365
M01=-2.1720970442278513E-4
M00=0.5060984647587284
Что означает, например M00=0.5 ?
(Ортогональность будет выполнена, если M00=M11 и M10=-M01.)
C:\Program Files\JOSM>java -jar -Xmx512M josm-tested.jar
Repository Root: http://josm.openstreetmap.de/svn
Build-Date: 2011-12-19 02:32:42
Last Changed Author: Don-vip
Revision: 4667
Repository UUID: 0c6e7542-c601-0410-84e7-c038aed88b3b
URL: http://josm.openstreetmap.de/svn/trunk
Last Changed Date: 2011-12-19 00:02:30 +0100 (Mon, 19 Dec 2011)
Last Changed Rev: 4667
ERROR: ''
java.lang.NullPointerException
at com.sun.org.apache.xerces.internal.jaxp.validation.StAXValidatorHelpe
r.validate(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.validation.ValidatorImpl.vali
date(Unknown Source)
at javax.xml.validation.Validator.validate(Unknown Source)
at org.openstreetmap.josm.data.Preferences.validateXML(Preferences.java:1436)
at org.openstreetmap.josm.data.Preferences.load(Preferences.java:580)
at org.openstreetmap.josm.data.Preferences.load(Preferences.java:542)
at org.openstreetmap.josm.data.Preferences.init(Preferences.java:678)
at org.openstreetmap.josm.gui.MainApplication.main(MainApplication.java:190)
Появилось после установки плагина. Похерило мне все настройки и плагином не даёт пользоваться.
usm78-gis
Матрица афинного преобразования в данном случае записана в сокращенной форме, М20=М21=0, М22=1 - принимаются по умолчанию. Это же принимается при расчете обратной матрицы. В ней, естественно, получаются те же значения на месте этих 0,0,1 и они отбрасываются для удобства записи в java2d AffineTransform
На счет ортогональности - понял, о чем речь, но не понял, каким оно сюда боком.
Кстати, если число точек больше 3, это уже не афинное преобразование…
На счет размерности ничего не могу сказать - это просто коэффициенты - из пиксельных координат картинки в josm-овские внутренние (в которых сдвиг записывается) - или наоборот
Это к вопросу о world файле, который тоже задает аффинное преобразование
m00
m01
m10
m11
m02
m12
но векторы (m00,m01) и (m10,m11) должны быть ортогональны
m00m10+m01m11=0
Т.е. любой world файл (а значит и для любого геотиффа с проекцией поддерживаемой josm)
коеффициенты можно прямо пересчитать в .cal
ok. остается разобраться, как josm-овские внутренние связаны с экранными пиксельными.
Итак, йосм у меня запустился, и плагин поставился и заработал.
Пробовал таскать точки, но поскольку они оказались почти на одной прямой, получилась полная лажа.
Вручную перемещать, масштабировать и вращать получается намного лучше. Что бы мне помогло? Всего лишь фиксация точки, вокруг которой производится поворот и масштабирование. Я бы совместил один перекрёсток на картинке и карте, зафиксировал бы эту точку, перешёл к другому перекрёстку и небольшими поворотами и масштабированием выровнял бы картинку по второй точке.
Поскольку уже реализовали постановку и фиксирование точек, то может добавить и описанную мной функциональность? Это вроде не сложно, а польза была бы огромной!
понимаю задачу, не представляю пока что, как ее организовать в плане интерфейса. может, если фиксирована только одна точка, то операции производить относительно нее?
Кстати, сейчас масштабирование, поворот и прочее делается относительно центра josm-экрана
Да, можно вокруг единственной установленной точки. Или вокруг только первой точки, если их несколько.
То, что вокруг центра, я вроде догадался. Но хотелось бы на крупном зуме очень точно поставить привязку, потом переместиться в другое место и там на крупном зуме очень точно прицелиться.
Пока писал, придумал ещё один способ. Делать преобразование по двум точкам, при этом сохраняя прямоугольность и соотношение сторон. (Забыл как такой тип преобразований называется).
Это вообще заменит сразу и поворот и масштабирование вокруг одной точки.