Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами

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

Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами

Сообщение Zorgis » 06 фев 2019, 15:13

подскажите, пож-та, как корректно перевести СК в нотации 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?

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

Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами

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

Может ли параметр Bounds (-1000000, -1000000) (10000000, 10000000) оказывать влияние на корректность преобразования?
нет

ты не в ту строну аффинные трансформации делаешь, нужно inverseTransform

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

Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами

Сообщение Zorgis » 06 фев 2019, 19:25

судя по описанию в 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 раз.

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

Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами

Сообщение trir » 06 фев 2019, 19:36

это не правильно:

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

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)
или AffineTransform(double[] flatmatrix)
в geotools есть возможность применить inverseTransform к геометрии типа полигона или линии?
внимательно изучи исходник, который я приводил

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2229
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1501
Откуда: Казань

Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами

Сообщение Игорь Белов » 06 фев 2019, 21:35

Zorgis писал(а):
06 фев 2019, 15:13
как корректно перевести СК в нотации MapInfo с параметрами афинного преобразования
Можно так. Подходящий WKT без аффинных параметров:

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

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

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

Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами

Сообщение Zorgis » 07 фев 2019, 12:33

trir писал(а):
06 фев 2019, 19:36
в geotools есть возможность применить inverseTransform к геометрии типа полигона или линии?
внимательно изучи исходник, который я приводил
исходник посмотрел. в исходнике геометрия разбирается на точки, точки преобразуются и затем геометрия собирается. вопрос был о том, есть ли в 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"."

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

Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами

Сообщение Zorgis » 07 фев 2019, 12:35

Игорь Белов писал(а):
06 фев 2019, 21:35
Можно так. Подходящий WKT без аффинных параметров:
спасибо. действительно подходит. я программист и только начинаю осваивать картографические премудрости. Как получен этот WKT? Могли бы вы привести алгоритм перехода от MapInfo с аффинными параметрами к этому варианту?

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

Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами

Сообщение trir » 07 фев 2019, 12:58

Как получен этот WKT?
там ведь ссылка на статью: http://gis-lab.info/qa/local-cs.html

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

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.8074650580529 8894.16130681336)
в исходнике геометрия разбирается на точки, точки преобразуются и затем геометрия собирается
и по ходу тебе придётся делать тоже самое...

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

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 
результат : POINT (28.654569065671609 60.811221527775487)
Подходящий WKT без аффинных параметров:
это не спортивно

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

Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами

Сообщение Zorgis » 07 фев 2019, 16:23

Как получен этот WKT?
там ведь ссылка на статью: http://gis-lab.info/qa/local-cs.html
ссылка есть, утилиты установил, файлы создал. результаты под Windows 7 не воспроизвести.
proj -I -f "%.16g" +init=epsg:28404 cat_s42z4.tsv > cat_longlat.tsv
projection initialization failure

нужен простой алгоритм, как имея параметры аффинного преобразования получить на выходе WKT без параметров, хотя бы ключевые моменты.
результат : POINT (9293.8074650580529 8894.16130681336)
в исходнике геометрия разбирается на точки, точки преобразуются и затем геометрия собирается
и по ходу тебе придётся делать тоже самое...
круто. насколько понимаю, это spatial надстройка над MS SQL Server? Мы работаем с PostgreSQL и Postgis.

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 не нашел. Непонятно, как получить обратный вариант.

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

Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами

Сообщение trir » 07 фев 2019, 17:33

Аналога функции reaffine в Postgis не нашел. Непонятно, как получить обратный вариант.
1. Переписать мою функцию
2. Использовать математику

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2229
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1501
Откуда: Казань

Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами

Сообщение Игорь Белов » 07 фев 2019, 21:42

Zorgis писал(а):
07 фев 2019, 12:35
Как получен этот WKT? Могли бы вы привести алгоритм перехода от MapInfo с аффинными параметрами к этому варианту?
Нетрудно заметить, что речь идёт не просто об аффинном, а о конформном преобразовании: E = A, D = -B. Именно так должно быть в геодезии, и это важно в данном случае.

Статья основана на том, что среди проекций PROJ.4 есть одна, в которой можно задавать произвольный разворот, а именно косая проекция Меркатора. Она обладает двумя важными свойствами: 1) она конформная; 2) она родственна проекции Гаусса-Крюгера, на которой и построены все локальные системы в России и вокруг. Если грамотно задать параметры проекции, в окрестности центра проекции координатное пространство будет практически неотличимо от локальной системы координат.
  1. В статье предполагается наличие координат для одного набора пунктов в двух СК, местной и глобальной. В Вашей задаче таких данных нет, надо их сгенерировать. Можно обойтись при этом без MapInfo, но с MapInfo проще, меньше вероятность грубых ошибок. Для начала необходимо определиться с центром проекции. Пусть это будет почтамт Выборга. Создадим в центре точку и несколько точек вогруг него на расстояниях порядка десяти-пятнадцати километров. От MapInfo нам нужно два текстовых файла: географические координаты "Долгота/широта (Пулково 1942)" и координаты в местной системе "Vyborg".
  2. Собственно, четвёртый пункт статьи: построить предварительную проекцию в нотации PROJ.4; утилитой proj конвертировать географические координаты в плоские; утилитой helmkey или как-то иначе вычислить параметры конформного преобразования; создать финальную проекцию.
  3. Конвертировать описание проекции из нотации PROJ.4 в WKT. Простой способ: добавить пользовательскую проекцию в QGIS; создать новый шейп-файл в этой проекции. Файл с расширением .qpj содержит ответ.
Настоятельно рекомендую во избежание неприятных неожиданностей заменить имена ГСК, ИГД, эллипсоида из .qpj "Krassovsky, 1942", "unknown", "krass" на "GCS_Pulkovo_1942", "D_Pulkovo_1942", "Krasovsky_1940" соответственно.
The purpose of computing is insight, not numbers

Аватара пользователя
Игорь Белов
Гуру
Сообщения: 2229
Зарегистрирован: 04 янв 2011, 22:00
Репутация: 1501
Откуда: Казань

Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами

Сообщение Игорь Белов » 07 фев 2019, 23:42

trir писал(а):
07 фев 2019, 12:58
это не спортивно
Это по существу темы.
The purpose of computing is insight, not numbers

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

Re: Как получить WKT без афинных параметров из MapInfo СК с афинными параметрами

Сообщение Zorgis » 08 фев 2019, 18:17

Нетрудно заметить, что речь идёт не просто об аффинном, а о конформном преобразовании: E = A, D = -B. Именно так должно быть в геодезии, и это важно в данном случае.
спасибо за разбор. надо будет попробовать.

Ответить

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

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

Сейчас этот форум просматривают: AlexRomantsov и 6 гостей