reaffine в Postgis

Ответить
Zorgis
Интересующийся
Сообщения: 39
Зарегистрирован: 16 апр 2015, 19:02
Репутация: 0

reaffine в Postgis

Сообщение Zorgis » 07 фев 2019, 17:51

Добрый день,
в MS SQL Spatial есть функции работы с аффинными параметрами affine и reaffine
declare @g geometry = ('POINT(28.6 60.7)') ;
select @g.STAsText() as g1,
dbo.affine(dbo.cs2cs(@g, '+proj=longlat +datum=WGS84 +no_defs',
'+proj=tmerc +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +lon_0=27.95 +lat_0=0 +k_0=1 +x_0=250000 +y_0=-11057.63'),
0.999477237, 0.031204196, -485909.751, -0.031204196, 0.999477237, -6699985.630
).STAsText() as g2
с результатом POINT (9293.80746505788 8894.16130681336)

и обратный вариант
declare @g geometry = ('POINT(9293.80746505788 8894.16130681336)');
SELECT @g.STAsText() as g1, [dbo].cs2cs(dbo.reaffine(@g, 0.999477237, 0.031204196, -485909.751, -0.031204196, 0.999477237, -6699985.630),
'+proj=tmerc +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +lon_0=27.95 +lat_0=0 +k_0=1 +x_0=250000 +y_0=-11057.63',
'+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs').STAsText() as g2
с результатом POINT (28.654569065671609 60.811221527775487)

В Postgis есть функция ST_Affine, аналогичная первому варианту
SELECT ST_AsText(ST_Affine(
ST_Transform(ST_GeomFromText('POINT(28.6 60.7)'),'+proj=longlat +datum=WGS84 +no_defs',
'+proj=tmerc +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +lon_0=27.95 +lat_0=0 +k_0=1 +x_0=250000 +y_0=-11057.63'),
0.999477237, 0.031204196, -0.031204196, 0.999477237, -485909.751, -6699985.630))
Как получить аналог второго варианта? Функции reaffine в Postgis не нашел.
Последний раз редактировалось Zorgis 07 фев 2019, 19:26, всего редактировалось 1 раз.

trir
Гуру
Сообщения: 4290
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 781
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: reaffine в Postgis

Сообщение trir » 07 фев 2019, 18:22

ну я же тебе приводил код этих функций

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

        public double[] Affine(double[] points, double[] koeff)
        {
            double nx, ny;
            for (int i = 0; i < points.Length; i += 2)
            {
                nx = koeff[0] * points[i] + koeff[1] * points[i + 1] + koeff[2];
                ny = koeff[3] * points[i] + koeff[4] * points[i + 1] + koeff[5];
                points[i] = nx;
                points[i + 1] = ny;
            }
            return points;
        }

        public double[] ReAffine(double[] points, double[] koeff)
        {
            double k, kx, ky;
            k  = koeff[0] * koeff[4] - koeff[1] * koeff[3];
            kx = koeff[1] * koeff[5] - koeff[2] * koeff[4];
            ky = koeff[0] * koeff[5] - koeff[2] * koeff[3];

            for (int i = 0; i < points.Length; i += 2)
            {
                points[i] = (koeff[4] * points[i] - koeff[1] * points[i + 1] + kx) / k;
                points[i + 1] = -1 * (koeff[3] * points[i] - koeff[0] * points[i + 1] + ky) / k;
            }
            return points;
}
если достаточно помедитировать над кодом ReAffine - можно понять, что это то же аффинное преобразование, только с другой матрицей и можно вывести формулу преобразования этой матрицы, простая математика

Zorgis
Интересующийся
Сообщения: 39
Зарегистрирован: 16 апр 2015, 19:02
Репутация: 0

Re: reaffine в Postgis

Сообщение Zorgis » 07 фев 2019, 19:50

ну я же тебе приводил код этих функций
функции тестировал, поскольку они недокументированные, использовал 2 варианта порядка коэффициентов
double[] koeffs = new double[] {0.999477237, 0.031204196, -0.031204196, 0.999477237, -485909.751, -6699985.630};
//double[] koeffs = new double[] {0.999477237, 0.999477237, 0.031204196, -0.031204196, -485909.751, -6699985.630};
Point affinePoint = getPointGeometry(28.6, 60.7);
Point transformedGeom = (Point) JTS.transform(affinePoint, fromWGS84ToVyborg);
double[] affinePoints = new double[]{transformedGeom.getX(), transformedGeom.getY()};
double[] affineResultPoints = affine(affinePoints, koeffs);

double[] reaffinePoints = new double[]{9293.80746505788, 8894.16130681336};
double[] reaffineResultPoints = reAffine(reaffinePoints, koeffs);
Point reaffinePoint = getPointGeometry(reaffineResultPoints[0], reaffineResultPoints[1]);
Point transformedReaffineGeom = (Point) JTS.transform(reaffinePoint, fromVyborgToWGS84);
в обоих случаев результаты некорректные
если достаточно помедитировать над кодом ReAffine - можно понять, что это то же аффинное преобразование, только с другой матрицей и можно вывести формулу преобразования этой матрицы, простая математика
с математикой у меня не настолько все хорошо. вы хотите сказать, что в Postgis намеренно исключена функция reaffine, потому что пользователю достаточно изменить коэффициенты для получения результата?

trir
Гуру
Сообщения: 4290
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 781
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: reaffine в Postgis

Сообщение trir » 07 фев 2019, 19:57

я уже показывал как их использовать

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

declare @g geometry = ('POINT(28.6 60.7)') ;
select @g.STAsText() as g1,  
dbo.affine(dbo.cs2cs(@g, '+proj=longlat +datum=WGS84 +no_defs', 
'+proj=tmerc +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +lon_0=27.95 +lat_0=0 +k_0=1 +x_0=250000 +y_0=-11057.63'),
0.999477237, 0.031204196, -485909.751, -0.031204196, 0.999477237, -6699985.630
).STAsText() as g2

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

declare @g geometry = ('POINT(12258.32 12606.95)');
SELECT  @g.STAsText() as g1, [dbo].cs2cs(dbo.reaffine(@g, 0.999477237, 0.031204196, -485909.751, -0.031204196, 0.999477237, -6699985.630),  
 '+proj=tmerc +ellps=krass +towgs84=24,-123,-94,0.02,-0.25,-0.13,1.1 +units=m +lon_0=27.95 +lat_0=0 +k_0=1 +x_0=250000 +y_0=-11057.63',  
 '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs').STAsText() as g2 
И нафига менять порядок коэффициентов?
0.999477237, 0.031204196, -485909.751, -0.031204196, 0.999477237, -6699985.630
поскольку они недокументированные
документация давно лежит на форуме
MapInfo
<название проекции>, <номер проекции + 3000>, <параметры
проекции (см. предыдущий раздел)>, <единицы
измерения>, A, B, C, D, E, F, x1, y1, x2, y2

x’ = Ax + By + C
y’ = Dx + Ey + F

Zorgis
Интересующийся
Сообщения: 39
Зарегистрирован: 16 апр 2015, 19:02
Репутация: 0

Re: reaffine в Postgis

Сообщение Zorgis » 07 фев 2019, 20:01

спасибо. вымучили, наконец.

trir
Гуру
Сообщения: 4290
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 781
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: reaffine в Postgis

Сообщение trir » 08 фев 2019, 08:54

x'=a*x+b*y+c
y'=d*x+e*y+f

k=a*e-b*d
kx=b*f-c*e
Ky=a*f-c*d
x=(e*x'-b*y'+kx)/k
y=-1*(d*x'-a*y'+ky)/k

x=(e/k)*x'+(-b/k)*y'+kx/k
y=(-d/k)*x'+(-a/k)*y'+ky/k

koeff[0]=e/k
koeff[1]=-b/k
koeff[2]=kx/k
koeff[3]=-d/k
koeff[4]=-a/k
koeff[5]=ky/k

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

        public double[] ReAffine2(double[] points, double[] koeff)
        {
            double k, kx, ky;
            k = koeff[0] * koeff[4] - koeff[1] * koeff[3];
            kx = koeff[1] * koeff[5] - koeff[2] * koeff[4];
            ky = koeff[0] * koeff[5] - koeff[2] * koeff[3];
            double[] koeff2 = { koeff[4]/k, -koeff[1]/k, kx/k, -koeff[3]/k, -koeff[0]/k, ky/k };
            return Affine(points, koeff2);
        }

Zorgis
Интересующийся
Сообщения: 39
Зарегистрирован: 16 апр 2015, 19:02
Репутация: 0

Re: reaffine в Postgis

Сообщение Zorgis » 08 фев 2019, 10:41

И нафига менять порядок коэффициентов?
0.999477237, 0.031204196, -485909.751, -0.031204196, 0.999477237, -6699985.630
потому что в приведенном вами SQL-примере и в функции geotools он именно такой.
MapInfo
<название проекции>, <номер проекции + 3000>, <параметры
проекции (см. предыдущий раздел)>, <единицы
измерения>, A, B, C, D, E, F, x1, y1, x2, y2
Вы привели пример 3000 - афинные параметры + ограничение по границам. Границы только для ругани при выходе фичи за эти границы? Или они могут оказывать какое-то влияние на перепроецирование?

trir
Гуру
Сообщения: 4290
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 781
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: reaffine в Postgis

Сообщение trir » 08 фев 2019, 10:48

границы только для MapInfo

Zorgis
Интересующийся
Сообщения: 39
Зарегистрирован: 16 апр 2015, 19:02
Репутация: 0

Re: reaffine в Postgis

Сообщение Zorgis » 08 фев 2019, 11:44

ок. спасибо.

Ответить

Вернуться в «PostGIS/PostgreSQL»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость