Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами
-
- Интересующийся
- Сообщения: 49
- Зарегистрирован: 16 апр 2015, 19:02
- Репутация: 0
Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами
подскажите, пож-та, как корректно перевести СК в нотации MapInfo с параметрами афинного преобразования:
"Vyborg", 1008, 1001, 7, 27.95, 0, 1, 250000, -11057.626, 7,
0.999477237, 0.031204196, -485909.751, -0.031204196, 0.999477237, -6699985.630
или
CoordSys Earth Projection 8, 1001, "m", 27.95, 0, 1, 250000, -11057.626 Affine Units "m", 0.999477237, 0.031204196, -485909.75099999999, -0.031204196, 0.999477237, -6699985.6299999999 Bounds (-1000000, -1000000) (10000000, 10000000)
в WKT без параметров афинного преобразования?
у меня получился такой вариант:
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:
AffineTransform affTr = new AffineTransform();
affTr.translate(-485909.751, -6699985.630);
affTr.scale(0.999477237, -0.031204196);
affTr.rotate(0.031204196, 0.999477237);
Вместо полученного из MapInfo центроида 28.79 60.72 получается 14.65 -59.64.
Может ли параметр Bounds (-1000000, -1000000) (10000000, 10000000) оказывать влияние на корректность преобразования?
Могут ли в библиотеке geotools использоваться противоположные знаки перед параметрами афинного преобразования нотации MapInfo?
"Vyborg", 1008, 1001, 7, 27.95, 0, 1, 250000, -11057.626, 7,
0.999477237, 0.031204196, -485909.751, -0.031204196, 0.999477237, -6699985.630
или
CoordSys Earth Projection 8, 1001, "m", 27.95, 0, 1, 250000, -11057.626 Affine Units "m", 0.999477237, 0.031204196, -485909.75099999999, -0.031204196, 0.999477237, -6699985.6299999999 Bounds (-1000000, -1000000) (10000000, 10000000)
в WKT без параметров афинного преобразования?
у меня получился такой вариант:
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:
AffineTransform affTr = new AffineTransform();
affTr.translate(-485909.751, -6699985.630);
affTr.scale(0.999477237, -0.031204196);
affTr.rotate(0.031204196, 0.999477237);
Вместо полученного из MapInfo центроида 28.79 60.72 получается 14.65 -59.64.
Может ли параметр Bounds (-1000000, -1000000) (10000000, 10000000) оказывать влияние на корректность преобразования?
Могут ли в библиотеке geotools использоваться противоположные знаки перед параметрами афинного преобразования нотации MapInfo?
-
- Гуру
- Сообщения: 5298
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1015
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами
нетМожет ли параметр Bounds (-1000000, -1000000) (10000000, 10000000) оказывать влияние на корректность преобразования?
ты не в ту строну аффинные трансформации делаешь, нужно inverseTransform
-
- Интересующийся
- Сообщения: 49
- Зарегистрирован: 16 апр 2015, 19:02
- Репутация: 0
Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами
судя по описанию в geotools inverseTransform применяется к точке или массиву точек.
попробовал применить createInverse для трансформации геометрии полигона:
AffineTransform affTr2 = new AffineTransform();
affTr2.translate(-485909.751, -6699985.630);
affTr2.scale(0.999477237, -0.031204196);
affTr2.rotate(0.031204196, 0.999477237);
AffineTransform affTrInverse = affTr2.createInverse();
MathTransform aTransform = new AffineTransform2D(affTrInverse);
Geometry affineTransformedGeometry = JTS.transform(VyborgPolygon, aTransform);
affineTransformedGeometry = JTS.transform(affineTransformedGeometry, fromVyborgToWGS84);
или
MathTransform aTransform = new AffineTransform2D(affTr2);
Geometry affineTransformedGeometry = JTS.transform(VyborgPolygon, aTransform.inverse());
Выдает ошибку - Angle 1,278,368,043,427,777.5 is too high.
в geotools есть возможность применить inverseTransform к геометрии типа полигона или линии?
попробовал применить createInverse для трансформации геометрии полигона:
AffineTransform affTr2 = new AffineTransform();
affTr2.translate(-485909.751, -6699985.630);
affTr2.scale(0.999477237, -0.031204196);
affTr2.rotate(0.031204196, 0.999477237);
AffineTransform affTrInverse = affTr2.createInverse();
MathTransform aTransform = new AffineTransform2D(affTrInverse);
Geometry affineTransformedGeometry = JTS.transform(VyborgPolygon, aTransform);
affineTransformedGeometry = JTS.transform(affineTransformedGeometry, fromVyborgToWGS84);
или
MathTransform aTransform = new AffineTransform2D(affTr2);
Geometry affineTransformedGeometry = JTS.transform(VyborgPolygon, aTransform.inverse());
Выдает ошибку - Angle 1,278,368,043,427,777.5 is too high.
в geotools есть возможность применить inverseTransform к геометрии типа полигона или линии?
Последний раз редактировалось Zorgis 06 фев 2019, 19:43, всего редактировалось 1 раз.
-
- Гуру
- Сообщения: 5298
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1015
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами
это не правильно:
используй AffineTransform(double m00, double m10, double m01, double m11, double m02, double m12)
или AffineTransform(double[] flatmatrix)
Код: Выделить всё
AffineTransform affTr2 = new AffineTransform();
affTr2.translate(-485909.751, -6699985.630);
affTr2.scale(0.999477237, -0.031204196);
affTr2.rotate(0.031204196, 0.999477237);
или AffineTransform(double[] flatmatrix)
внимательно изучи исходник, который я приводилв geotools есть возможность применить inverseTransform к геометрии типа полигона или линии?
- Игорь Белов
- Гуру
- Сообщения: 2232
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1506
- Откуда: Казань
Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами
Можно так. Подходящий WKT без аффинных параметров:Zorgis писал(а): ↑06 фев 2019, 15:13как корректно перевести СК в нотации MapInfo с параметрами афинного преобразования
Код: Выделить всё
PROJCS["Vyborg",GEOGCS["GCS_Pulkovo_1942",DATUM["D_Pulkovo_1942",SPHEROID["Krasovsky_1940",6378245,298.3],TOWGS84[23.92,-141.27,-80.9,0,0.35,0.82,-0.12]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Hotine_Oblique_Mercator_Azimuth_Center"],PARAMETER["latitude_of_center",60.70875],PARAMETER["longitude_of_center",27.95],PARAMETER["azimuth",0.0001],PARAMETER["rectified_grid_angle",1.788323934760878],PARAMETER["scale_factor",0.9999647541967648],PARAMETER["false_easting",-26282.71441803458],PARAMETER["false_northing",10799.75097746806],UNIT["Meter",1]]
The purpose of computing is insight, not numbers
-
- Интересующийся
- Сообщения: 49
- Зарегистрирован: 16 апр 2015, 19:02
- Репутация: 0
Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами
исходник посмотрел. в исходнике геометрия разбирается на точки, точки преобразуются и затем геометрия собирается. вопрос был о том, есть ли в geotools готовый аналог, пока нашел только конструкторы InverseTransform, принимающие массив точек.
Есть функция createInverse(), но она выдает ошибку "The transform result may be 89,474,536.006 meters away from the expected position"
согласен, нужно использовать конструктор со всеми параметрами сразу:это не правильно:
AffineTransform affTr2 = new AffineTransform();
affTr2.translate(-485909.751, -6699985.630);
affTr2.scale(0.999477237, -0.031204196);
affTr2.rotate(0.031204196, 0.999477237);
используй AffineTransform(double m00, double m10, double m01, double m11, double m02, double m12)
/* @param m00 the X coordinate scaling element of the 3x3 matrix
* @param m10 the Y coordinate shearing element of the 3x3 matrix
* @param m01 the X coordinate shearing element of the 3x3 matrix
* @param m11 the Y coordinate scaling element of the 3x3 matrix
* @param m02 the X coordinate translation element of the 3x3 matrix
* @param m12 the Y coordinate translation element of the 3x3 matrix
* @since 1.2*/
AffineTransform affTr2 = new AffineTransform(0.999477237, 0.999477237, 0.031204196, -0.031204196, -485909.751, -6699985.630);
affTr2 = affTr2.createInverse();
MathTransform aTransform = new AffineTransform2D(affTr2);
Geometry affineTransformedGeometry = JTS.transform(VyborgPolygon, aTransform);
affineTransformedGeometry = JTS.transform(affineTransformedGeometry, fromVyborgToWGS84);
Point affineFunctionCentroid = affineTransformedGeometry.getCentroid();
выдает ошибку " The transform result may be 89,474,536.006 meters away from the expected position. Are you sure that the input coordinates are inside this map projection area of validity? The point is located 0°00.0'E away from the central meridian and 90°00.0'S away from the latitude of origin. The projection is "Transverse_Mercator"."
-
- Интересующийся
- Сообщения: 49
- Зарегистрирован: 16 апр 2015, 19:02
- Репутация: 0
Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами
спасибо. действительно подходит. я программист и только начинаю осваивать картографические премудрости. Как получен этот WKT? Могли бы вы привести алгоритм перехода от MapInfo с аффинными параметрами к этому варианту?
-
- Гуру
- Сообщения: 5298
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1015
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами
там ведь ссылка на статью: http://gis-lab.info/qa/local-cs.htmlКак получен этот WKT?
Код: Выделить всё
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
это не спортивноПодходящий WKT без аффинных параметров:
-
- Интересующийся
- Сообщения: 49
- Зарегистрирован: 16 апр 2015, 19:02
- Репутация: 0
Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами
ссылка есть, утилиты установил, файлы создал. результаты под Windows 7 не воспроизвести.Как получен этот WKT?
там ведь ссылка на статью: http://gis-lab.info/qa/local-cs.html
proj -I -f "%.16g" +init=epsg:28404 cat_s42z4.tsv > cat_longlat.tsv
projection initialization failure
нужен простой алгоритм, как имея параметры аффинного преобразования получить на выходе WKT без параметров, хотя бы ключевые моменты.
круто. насколько понимаю, это spatial надстройка над MS SQL Server? Мы работаем с PostgreSQL и Postgis.результат : POINT (9293.8074650580529 8894.16130681336)
в исходнике геометрия разбирается на точки, точки преобразуются и затем геометрия собирается
и по ходу тебе придётся делать тоже самое...
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))
Преобразование проходит с таким же результатом : POINT (9293.8074650580529 8894.16130681336)
Аналога функции reaffine в Postgis не нашел. Непонятно, как получить обратный вариант.
-
- Гуру
- Сообщения: 5298
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1015
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами
1. Переписать мою функциюАналога функции reaffine в Postgis не нашел. Непонятно, как получить обратный вариант.
2. Использовать математику
- Игорь Белов
- Гуру
- Сообщения: 2232
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1506
- Откуда: Казань
Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами
Нетрудно заметить, что речь идёт не просто об аффинном, а о конформном преобразовании: E = A, D = -B. Именно так должно быть в геодезии, и это важно в данном случае.Zorgis писал(а): ↑07 фев 2019, 12:35Как получен этот WKT? Могли бы вы привести алгоритм перехода от MapInfo с аффинными параметрами к этому варианту?
Статья основана на том, что среди проекций PROJ.4 есть одна, в которой можно задавать произвольный разворот, а именно косая проекция Меркатора. Она обладает двумя важными свойствами: 1) она конформная; 2) она родственна проекции Гаусса-Крюгера, на которой и построены все локальные системы в России и вокруг. Если грамотно задать параметры проекции, в окрестности центра проекции координатное пространство будет практически неотличимо от локальной системы координат.
- В статье предполагается наличие координат для одного набора пунктов в двух СК, местной и глобальной. В Вашей задаче таких данных нет, надо их сгенерировать. Можно обойтись при этом без MapInfo, но с MapInfo проще, меньше вероятность грубых ошибок. Для начала необходимо определиться с центром проекции. Пусть это будет почтамт Выборга. Создадим в центре точку и несколько точек вогруг него на расстояниях порядка десяти-пятнадцати километров. От MapInfo нам нужно два текстовых файла: географические координаты "Долгота/широта (Пулково 1942)" и координаты в местной системе "Vyborg".
- Собственно, четвёртый пункт статьи: построить предварительную проекцию в нотации PROJ.4; утилитой proj конвертировать географические координаты в плоские; утилитой helmkey или как-то иначе вычислить параметры конформного преобразования; создать финальную проекцию.
- Конвертировать описание проекции из нотации PROJ.4 в WKT. Простой способ: добавить пользовательскую проекцию в QGIS; создать новый шейп-файл в этой проекции. Файл с расширением .qpj содержит ответ.
The purpose of computing is insight, not numbers
- Игорь Белов
- Гуру
- Сообщения: 2232
- Зарегистрирован: 04 янв 2011, 22:00
- Репутация: 1506
- Откуда: Казань
Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами
Это по существу темы.trir писал(а): ↑07 фев 2019, 12:58это не спортивно
The purpose of computing is insight, not numbers
-
- Интересующийся
- Сообщения: 49
- Зарегистрирован: 16 апр 2015, 19:02
- Репутация: 0
Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами
спасибо за разбор. надо будет попробовать.Нетрудно заметить, что речь идёт не просто об аффинном, а о конформном преобразовании: E = A, D = -B. Именно так должно быть в геодезии, и это важно в данном случае.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость