Добрый день,
Есть СК Выборга с афинными коэффициентами:
"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?
Аффинные коэффициенты в СК нотациях MapInfo и WKT дают разный результат
-
- Интересующийся
- Сообщения: 49
- Зарегистрирован: 16 апр 2015, 19:02
- Репутация: 0
-
- Гуру
- Сообщения: 5292
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1015
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
-
- Интересующийся
- Сообщения: 49
- Зарегистрирован: 16 апр 2015, 19:02
- Репутация: 0
Re: Аффинные коэффициенты в СК нотациях MapInfo и WKT дают разный результат
подскажите, какой файл смотреть в Вашем проекте на 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
коэффициенты поменял, результат не изменился.
Код с использованием библиотеки 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
-
- Гуру
- Сообщения: 5292
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1015
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Аффинные коэффициенты в СК нотациях MapInfo и WKT дают разный результат
https://github.com/triroakenshield/sql_ ... nverter.csкакой файл смотреть в Вашем проекте на GitHub-е.
Код: Выделить всё
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;
}
где то x y перепутан, поменяй местами elt_0_2 и elt_1_2точки полигона в WGS84 должны быть в районе 60,7 28,6, в результате 15.09 -59.57
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 39 гостей