Страница 1 из 1

Устаканить информацию по привязке

Добавлено: 04 дек 2009, 17:01
Luzerka
Доброго времени. Обчитался я статей, каша походу полная.
Текущая цель(начальная): Хоть как нибудь добиться программной реализации привязки карты.
Что необходимо для привязки:
1. географические координаты точек
2. координаты точек на карте(проекция участка зем поверх), представляющие собой номер пикселья по х и номер пикселя по у. Они соответствуют географическим координатам.
3. географическая система координат(предположительно буду использовать WGS84)
4. какая-то проекция.
Читал статьи и форумы, читал... и каким-то образом вышел на цикл(?) статей про Полиномиальные преобразования.
("Полиномиальные преобразования", "Полиномиальные преобразования - Математика", "Полиномиальные преобразования - примеры реализации")
Стало понятно, что это как раз то, что нужно для привязки карты.
Но тогда встает вопрос, а где там применяется проекция? попробую сам ответить - возможно проекция применяется в контрольных точках.( ? :) )

Вопросы по полиномиальным преобразованиям тоже возникли, задам здесь же.
x,y - координаты в исходной системе координат (известны)
x',y' - координаты в конечной системе координат (известны)
вот как в статьях сказано.
х и у - это исходная, т.е допустим координаты х и у на карте в проекции
х' и y' - это координаты ширины и долготы в пространстве
Так чтоли?) Если да, то тогда в каком виде брать широты и долготу, есть же разные виды представления их

По статье примеры реализации: Там идет перевод из какой-то локальной системы координат в проекцию.
Но как можно на растровой карте отобразить такую точку: (557124.596,5479746.857)?

З.Ы: Извиняюсь, возможно, за несовсем понятное изложение некоторых вопросов, но старался как мог. Спасибо

Re: Устаканить информацию по привязке

Добавлено: 04 дек 2009, 23:45
Максим Дубинин
это не "какая-то локальная СК", это любая локальная СК
проекция при полиномиальных преобразованиях никчему
проекционные преобразования и полиномиальные - абсолютно разные (есть нюансы, но вам они в данном случае точно не нужны).
обычно после привязки, растру просто назначают (описывают) проекцию, согласно проекции использованных x',y'

Re: Устаканить информацию по привязке

Добавлено: 04 дек 2009, 23:52
Luzerka
Спасибо большое за ответ:)
А в данном случаи не нужны, потому что проекции дают более точную привязку, а я насчет нее пока не заморачиваюсь?:)
Но все равно не понятно: как можно на растровой карте отобразить такую точку: (557124.596,5479746.857)?

Re: Устаканить информацию по привязке

Добавлено: 05 дек 2009, 00:20
Максим Дубинин
точность тут непричем
в общем случае, такую точку можно отобразить на растровой карте спроецированной в ту же СК что и эти цифры.

Re: Устаканить информацию по привязке

Добавлено: 05 дек 2009, 15:31
Luzerka
кое-какой прогресс у меня наметился.взял кусок карты, и попробовал привязать, использовал пример на C# из статьи. Но в чем проблема, по долготе высчитывается все точно, я бы даже сказал очень точно ) видимо просто малюсенькая карта. а вот по широте... широта скачит с амплитудой 20 целых. причем граница проведеная вертикально ровно по середине карты :)
Навсякий приложу пример, что у меня получилось, если кому не лень будет смотреть )
закачал на слил slil.ru/28358326

Re: Устаканить информацию по привязке

Добавлено: 05 дек 2009, 20:34
Luzerka
наблюдательным путем выявил, что возле всех точек при подходе к ним координаты становились кооректными, за исключением одной. свдинул эту точку случайным образом на 10 метров примерно и переопределил для ней координаты. и стало все хорошо. В тех статьях я читал, что небольшое отклонение может приводить к потере точности, но чтобы потеря точности была такой огромной я даже не ожидал.
Каким же образом тогда нужно привязывать карты, чтобы не терялась точность? Неужели каждой карте необходимо уделять некоторое большое кол-во времени, чтобы подобрать точки ?

Re: Устаканить информацию по привязке

Добавлено: 06 дек 2009, 00:51
Максим Дубинин
что значит огромная? 20 чего? метров? это нормальная ошибка
Luzerka писал(а):Неужели каждой карте необходимо уделять некоторое большое кол-во времени, чтобы подобрать точки ?
Именно так, поздравляю, вы постигли главную хитрость процесса привязки.

Re: Устаканить информацию по привязке

Добавлено: 06 дек 2009, 01:06
Luzerka
sim, нет. 20 градусов. это очень большая погрешность. А по привязке, я раньше привязывал карты в OziExplorer там я брал 3 точки, причем произвольных, и не было таких погрешностей.

Re: Устаканить информацию по привязке

Добавлено: 06 дек 2009, 01:54
Максим Дубинин
20 градусов быть не должно
проверяйте и перепроверяйте

Re: Устаканить информацию по привязке

Добавлено: 10 дек 2009, 19:07
Luzerka
Преобразовывая экранные координаты в географические - получаю некоторые значения. а преобразовывая эти некоторые значения обратно получаю совершенно другие координаты ) очень сильно отличающиеся от начальных. Почему такое происходит?

Re: Устаканить информацию по привязке

Добавлено: 12 дек 2009, 15:52
Luzerka
актуально до сих пор... Формулы же позволяют преобразовывать из одной ск в другую) а тут получается что не так.

Re: Устаканить информацию по привязке

Добавлено: 13 дек 2009, 17:44
Denis Rykov
Luzerka писал(а):Преобразовывая экранные координаты в географические - получаю некоторые значения. а преобразовывая эти некоторые значения обратно получаю совершенно другие координаты ) очень сильно отличающиеся от начальных. Почему такое происходит?
А что есть формулы которые переводят географические координаты в экранные?

Re: Устаканить информацию по привязке

Добавлено: 14 дек 2009, 00:25
Luzerka
вопщем народ. я туп наверное. но нифига не пойму)
из статьи полиномиальные преобразования примеры реализации взял код

Код: Выделить всё

            
            double[,] m = new double[n + 1, n + 1];
            double[] bForX = new double[n + 1];
            double[] bForY = new double[n + 1];
            for (int i = 0; i < points.Count; i++)
            {
                m[1, 1] = n;
                m[1, 2] = m[2, 1] += x1[i];
                m[1, 3] = m[3, 1] += y1[i];
                m[1, 4] = m[4, 1] = m[2, 2] += Math.Pow(x1[i], 2);
                m[1, 5] = m[5, 1] = m[2, 3] = m[3, 2] += x1[i] * y1[i];
                m[1, 6] = m[6, 1] = m[3, 3] += Math.Pow(y1[i], 2);
                m[2, 4] = m[4, 2] += Math.Pow(x1[i], 3);
                m[2, 5] = m[5, 2] = m[3, 4] = m[4, 3] += Math.Pow(x1[i], 2) * y1[i];
                m[2, 6] = m[6, 2] = m[3, 5] = m[5, 3] += x1[i] * Math.Pow(y1[i], 2);
                m[3, 6] = m[6, 3] += Math.Pow(y1[i], 3);
                m[4, 4] += Math.Pow(x1[i], 4);
                m[4, 5] = m[5, 4] += Math.Pow(x1[i], 3) * y1[i];
                m[4, 6] = m[6, 4] = m[5, 5] += Math.Pow(x1[i], 2) * Math.Pow(y1[i], 2);
                m[5, 6] = m[6, 5] += x1[i] * Math.Pow(y1[i], 3);
                m[6, 6] += Math.Pow(y1[i], 4);

                bForX[1] += x2[i];
                bForX[2] += x1[i] * x2[i];
                bForX[3] += y1[i] * x2[i];
                bForX[4] += Math.Pow(x1[i], 2) * x2[i];
                bForX[5] += x1[i] * y1[i] * x2[i];
                bForX[6] += Math.Pow(y1[i], 2) * x2[i];

                bForY[1] += y2[i];
                bForY[2] += x1[i] * y2[i];
                bForY[3] += y1[i] * y2[i];
                bForY[4] += Math.Pow(x1[i], 2) * y2[i];
                bForY[5] += x1[i] * y1[i] * y2[i];
                bForY[6] += Math.Pow(y1[i], 2) * y2[i];
            }
Из него следует, что мы заполняем матрицу m и bForX ну далее делаем их произведение и получаем коэфиценты а0-а5

Если привести указанный код выше, то получаем нечто такое

Изображение

а в самих формулах в статьи вот что:
Изображение

Откуда тогда такая матрица берется, которая из кода? я предположил, что это соединенная, через формулу обратной матрицы (A^-1 = 1/detA * C) но черт побери, никак ведь такой не получается...