Аффинные коэффициенты в СК нотациях MapInfo и WKT дают разный результат

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

Аффинные коэффициенты в СК нотациях MapInfo и WKT дают разный результат

Сообщение Zorgis » 04 фев 2019, 13:55

Добрый день,

Есть СК Выборга с афинными коэффициентами:

"Vyborg", 1008, 1001, 7, 27.95, 0, 1, 250000, -11057.626, 7,
0.999477237, 0.031204196, -485909.751, -0.031204196, 0.999477237, -6699985.630

которое дает правильный результат при использовании утилиты TransCoor в MapInfo.

При подстановке тех же коэффициентов в нотации WKT:
FITTED_CS[\"SRG\",
"PARAM_MT[\"Affine\",
PARAMETER[\"num_row\", 3],
PARAMETER[\"num_col\", 3],
PARAMETER[\"elt_0_0\", 0.999477237],
PARAMETER[\"elt_0_1\", 0.031204196],
PARAMETER[\"elt_0_2\", -485909.751],
PARAMETER[\"elt_1_0\", 0.999477237],
PARAMETER[\"elt_1_1\", -0.031204196],
PARAMETER[\"elt_1_2\", -6699985.630]],
PROJCS[\"unnamed\",GEOGCS[\"Krassovsky, 1942\",DATUM[\"Pulkovo_1942\",SPHEROID[\"Krassovsky\",6378245,298.3], TOWGS84[24,-123,-94,0.02,-0.25,-0.13,1.1]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]],
PROJECTION[\"Transverse_Mercator\"], PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",27.95],PARAMETER[\"scale_factor\",1],
"PARAMETER[\"false_easting\",250000],PARAMETER[\"false_northing\",-11057.626],UNIT[\"Meter\",1.0]]]

функция библиотеки geotools CRS.parseWKT(VyborgWithAffineWKTString) проходит парсинг, но на выходе функций

CoordinateReferenceSystem targetCs = CRS.decode("EPSG:4326");
MathTransform fromVyborgWithAffineWKTToWGS84 = CRS.findMathTransform(WKTWithAffineVyborg, targetCs, true);
VyborgWKTGeom = JTS.transform(VyborgPolygon, fromVyborgWithAffineWKTToWGS84);

выдает некорректные результаты в WGS84.

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

В чем может быть проблема? Насколько надежны функции библиотеки geotools в плане трансформации с использованием WKT?

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

Re: Аффинные коэффициенты в СК нотациях MapInfo и WKT дают разный результат

Сообщение trir » 04 фев 2019, 14:03

в WKT нет аффиных коэфициентов
перепутаны elt_1_0 и elt_1_1
но у меня всё работает :roll:

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

Re: Аффинные коэффициенты в СК нотациях MapInfo и WKT дают разный результат

Сообщение Zorgis » 04 фев 2019, 16:08

подскажите, какой файл смотреть в Вашем проекте на GitHub-е.
коэффициенты поменял, результат не изменился.

Код с использованием библиотеки geotools:

String VyborgCSString =
"PROJCS[\"unnamed\",GEOGCS[\"Krassovsky, 1942\",DATUM[\"Pulkovo_1942\",SPHEROID[\"Krassovsky\",6378245,298.3]," +
"TOWGS84[24,-123,-94,0.02,-0.25,-0.13,1.1]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433]]," +
"PROJECTION[\"Transverse_Mercator\"]," +
"PARAMETER[\"latitude_of_origin\",0],PARAMETER[\"central_meridian\",27.95],PARAMETER[\"scale_factor\",1]," +
"PARAMETER[\"false_easting\",250000],PARAMETER[\"false_northing\",-11057.626],UNIT[\"Meter\",1.0]]";

String VyborgWithAffineWKTString = "FITTED_CS[\"SRG\",\n" +
"PARAM_MT[\"Affine\",\n" +
" PARAMETER[\"num_row\", 3],\n" +
" PARAMETER[\"num_col\", 3],\n" +
" PARAMETER[\"elt_0_0\", 0.999477237],\n" +
" PARAMETER[\"elt_0_1\", 0.031204196],\n" +
" PARAMETER[\"elt_0_2\", -485909.751],\n" +
" PARAMETER[\"elt_1_0\", -0.031204196],\n" +
" PARAMETER[\"elt_1_1\", 0.999477237],\n" +
" PARAMETER[\"elt_1_2\", -6699985.630]],\n" +
VyborgCSString + "]";

CoordinateReferenceSystem WKTWithAffineVyborg = CRS.parseWKT(VyborgWithAffineWKTString);

String VyborgGeomString = "MULTIPOLYGON (((12258.32 12606.95, 12335.95 12518.52, 12388.08 12481.92, " +
"12417.19 12426.17, 12483.96 12391.04, 12669.3 12304.97, 12791.46 12259.21, 13043.21 11709.78, " +
"13821.46 12527.77, 14246.44 12984.29, 14532.39 13111.08, 14529.24 13551.33, 14308.43 13668.12, " +
"13996.18 13831.45, 13680.91 13996, 13573.2 14049.24, 13476.09 14095.83, 13378.66 14137.59, " +
"12377.77 14546.68, 12257.33 14593.27, 12038.88 14681.64, 11933.88 14725.29, 11697 14821.4, " +
"11691.61 14807.04, 11693.19 14791.62, 11702.73 14772.58, 11728.14 14746.13, 11808.92 14693.95, " +
"11857.94 14664.69, 11876.54 14651.98, 11911.95 14626.59, 11881.31 14600.21, 11838.88 14567.6, " +
"11818 14555.35, 11736.3 14529.04, 11669.13 14510.45, 11623.29 14488.21, 11586.98 14455.56, " +
"11566.57 14436.49, 11530.7 14369.8, 11477.6 14260.02, 11468.97 14240.5, 11441.74 14183.35, " +
"11407.25 14113.93, 11387.73 14074, 11333.53 13957.32, 11252.59 13795.77, 11225.23 13743.72, " +
"11206.79 13729.4, 11199.98 13694.61, 11180.42 13601.04, 11178.98 13594.12, 11157.94 13533, " +
"11151.85 13515.27, 11111.53 13454.42, 11053.84 13339.13, 11126.45 13271.98, 11191.46 13279.67, " +
"11238.2 13278.06, 11272.6 13261.91, 11318.16 13258.32, 11382.5 13265, 11421.41 13277.47, " +
"11443.83 13309.67, 11449.43 13348.9, 11456.19 13370.2, 11467.64 13388.73, 11479.13 13392.69, " +
"11491.51 13385.07, 11512.46 13350.5, 11513.96 13302.94, 11534.1 13249.76, 11564.45 13198.92, " +
"11615.69 13156.92, 11675.8 13146.14, 11717.74 13114.98, 11754.85 13050.49, 11813.88 13005.56, " +
"11859.98 12945.87, 11964.63 12847.09, 12104.62 12756.51, 12108.21 12718.05, 12151.82 12670.51, " +
"12183.65 12661.84, 12258.32 12606.95, 12258.32 12606.95)))";

GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory();
WKTReader reader = new WKTReader(geometryFactory);
MultiPolygon VyborgPolygon = (MultiPolygon) reader.read(VyborgGeomString);

CoordinateReferenceSystem targetCs = CRS.decode("EPSG:4326");
MathTransform fromVyborgWithAffineWKTToWGS84 = CRS.findMathTransform(WKTWithAffineVyborg, targetCs, true);
VyborgWKTGeom = JTS.transform(VyborgPolygon, fromVyborgWithAffineWKTToWGS84);

точки полигона в WGS84 должны быть в районе 60,7 28,6, в результате 15.09 -59.57

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

Re: Аффинные коэффициенты в СК нотациях MapInfo и WKT дают разный результат

Сообщение trir » 04 фев 2019, 18:09

какой файл смотреть в Вашем проекте на GitHub-е.
https://github.com/triroakenshield/sql_ ... nverter.cs

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

public double[] Affine(double[] points, double[] koeff)
        {
            double nx, ny;
            for (int i = 0; i <= points.Length * 2; 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;
}
точки полигона в WGS84 должны быть в районе 60,7 28,6, в результате 15.09 -59.57
где то x y перепутан, поменяй местами elt_0_2 и elt_1_2

Ответить

Вернуться в «Координаты и привязка»

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

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