На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Странности с преобразованием координат

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1 2 3 След.
RSS
Странности с преобразованием координат, ошибка или так задумано?
 
Обнаружил некорректную (как мне кажется) работу функций mapGeo2Plane и mapPlane2Geo при B>90 градусов. Конечно, широта B>90 - это "мнимые" координаты, тем не менее на большинстве картографических проекций такие области существуют, там могут располагаться графические объекты и, соответственно, с координатами этих объектов приходится работать. Поэтому математическая корректность преобразований и их однозначность важны на все области карты, даже за пределами широты 90 градусов.

Итак, проблема. Открываем карту Подольска.
Пусть B0=90, L0=0.
После преобразования BL -> XY, получаем: (B0,L0) -> X0=10002137; Y0=7500000.

Далее присваиваем:
X1 = X0 + 100 (т.е. X1=10002237)
Y1 = Y0

X2 = X0
Y2 = Y0 + 100 (т.е. Y0=7500100)

Выполняем преобразование XY -> BL:
(X1,Y1) -> B1=90.000895; L1=39.000000
(X2,Y2) -> B2=-90; L2=-60
Первая странность: во 2-м случае мы оказались в южном полюсе, отойдя всего-то на 100 метров от северного полюса!
Но это еще не всё. Делаем обратное преобразование для 1-й точки:
(B1,L1) -> X1'=10002137; Y1'=7500000.

Таким образом, после прямого и обратного преобразования результирующая точка (X1',Y1') не совпала с исходной точкой (X1,Y1)!
Уважаемые разработчики, не могли бы вы устранить указанные проблемы?
Изменено: snav - 16.11.2010 19:23:10
 
Здравствуйте !
Я тоже думал что то что Вы написали является странностью (см. СООБЩЕНИЕ НА ФОРУМЕ) но когда прочитал фразу
Цитата
// Добавить в конец метрики объекта точку11/05/07
// Obj     - идентификатор объекта карты в памяти
// b;l     - координаты точки в радианах
// subject - номер подобъекта (если = 0; обрабатывается объект)
// Значение координат должно соответствовать системе координат;
// проекции и эллипсоиду карты

// При ошибке возвращает ноль

function  mapAppendPointGeo(Obj : HObj; B,L : double; subject : integer = 0) : integer;
{$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF}
external sGisAcces;
а в случае с Вашими преобразованиями
Цитата

// Преобразование из геодезических координат в радианах
// в метры на местности в соответствии с проекцией карты
// (поддерживается не для всех карт !)
// hmap - идентификатор открытых данных
// Bx;Ly  - преобразуемые координаты
// на входе радианы; на выходе - метры
// При ошибке возвращает 0

function mapGeoToPlane(Map : HMap; var BX , LY : double) : integer;
 {$IFNDEF LINUXAPI} stdcall {$ELSE} cdecl {$ENDIF};
 external sGisAcces;
понял что странности со мной а не с ядром.
------
Проблема вся в том, что преобразования в приполярных областях правильно обрабатываются картой созданной в стереографической проекции, а Ваша карта цитирую:
Цитата
Итак, проблема. Открываем карту Подольска.
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Цитата
snav пишет:
Обнаружил некорректную (как мне кажется) работу функций mapGeo2Plane и mapPlane2Geo при B>90 градусов. Конечно, широта B>90 - это "мнимые" координаты, тем не менее на большинстве картографических проекций такие области существуют, там могут располагаться графические объекты и, соответственно, с координатами этих объектов приходится работать. Поэтому математическая корректность преобразований и их однозначность важны на все области карты, даже за пределами широты 90 градусов.
...
Уважаемые разработчики, не могли бы вы устранить указанные проблемы?

Существуют области,которые визуально севернее полюса. Например, азимутальная проекция на северном полюсе.
Но в этом случае, при переходе полюса широта начинает понижаться.
Другими словами, нет проекций с изображением широты более 90 градусов.

Но Вы и не устанавливаете такую широту явно.
Для 1-ой точки Вы даете метры за пределами края Земли.
При пересчете в градусы координаты автоматически корректируются до 90 градусов и при
обратном пересчете Вы получаете метры на полюсе без Вашей добавки.

Во втором случае Вы двигаетесь на полюсе по широте и резко попадаете в совершенно другую зону (на другой стороне Земли), что приводит к приземлению на южном полюсе (эффект черной дыры, временной туннель).
Вы не отошли на полюсе на 100 метров, а отлетели.
Поскольку проекция Гаусса-Крюгера (как и UTM) не позволяет так "далеко" уходить от осевого меридиана.

Отойдите немного от полюса южнее и можете покружить.

Если поможет, другое сравнение.
Поделите 10 на 0.001. А теперь на 0. А всего-то изменили знаменатель на 0.001.
 
Цитата
Oleg Belenkov пишет:
Другими словами, нет проекций с изображением широты более 90 градусов.
Как нет? А цилиндрические! А конические! Там везде есть области, выходящие за пределы +-90 градусов по широте. Если пользователь нанес туда объект, с ним нужно работать.

Насчет карты Подольска - извините, я не знаю, какая там проекция (я думал, что коническая). Но дело даже не в этом.
Допустим, что на многих проекциях действительно есть ограничения на значения широты. Но ведь преобразование XY -> BL -> XY в любом случае должно работать корректно и приводить в исходную точку! А у вас исходная и конечная точка не совпадают. Разве это нормально?
Изменено: snav - 16.11.2010 22:11:05
 
Господин sven !
Убедительная просьба перед тем как постить на форуме темы выражающие Ваше недовольство в ГИС Технологиях,
изучить хотябы азы геодезии. Это отступление.
-----------
Теперь по теме
Код
 А цилиндрические! А конические! 
- у цилиндрической и конической проекции вообще нет широт больше чем 90
Другое дело косая цилиндрическая. Косая цилиндрическая  проекция - частнай случай стереографической проекции в которой поверхность замли разворачивается не относительно оси земли, а  произвольной оси в любой точке.
------
Теперь по поводу Вашего высказывания что в геодезии А=В=А. (цитата  XY -> BL -> XY )
Проблема в том, что геодезия это не Декартова СК и не формулы товарища Пифагора.
Тут действуют немного иная математика. В простонародии она называется комплексной (в частности для полярных координат). Отсюда следует что :
Если координата задана с широтой 91 градус Вы автоматически влезли в пространство комплексных чисел на 1 градус и возврат из него назад в реальный диапозон непредсказуем (см. "Математику комплексных чисел").
ВОзмём к примеру Ваши фразы "а цилиндрическая" и "(X1,Y1) -> B1=90.000895"
- В Нормальной цилиндрической проекции полюс представляет собой линию (верхний срез карты) а не точку. и если Вы указываете широту (другими словами растояние от экватора) большую чем полуширина карты то вы автоматически уходите с неё. (как и сказано выше уходите в другое по отношению к карте пространство). За картой Ваши широта и долгота уже не действуют.

- теперь коническая проекция. В ней полют сосредоточен в одной точке, а вся планета Земля (от -180 до 180 градусов по долготе) разворачивается в виде сектора круга (не всего а сектора). В секторе круга имеется мёртвая зона. При задании широты в 91 градус вы уходите в неё в которой Ваша сетка уже не деёствует.
Изменено: KFF - 01.01.2014 14:44:49
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Цитата
KFF (Фёдор) пишет:
Убедительная просьба перед тем как постить на форуме темы выражающие Ваше недовольство в ГИС Технологиях,
изучить хотябы азы геодезии. Это отступление.
Уважаемый Федор.
Уверяю вас, с принципами построения проекций и используемым там матаппаратом я знаком. Поэтому, пожалуйста, без наездов.
А то что вы написали - показывает, что вы не поняли суть моих вопросов.
Изменено: snav - 17.11.2010 06:01:46
 
Ладно, перенесём обсуждение проблемы (с Вашей точки зрения) в математическую плоскость.
Привожу примеры пересчёта координат с метров в радианы и наоборот
в цилиндрической и коническиой проекцяих в исходных кодах (на Паскале):
// Коническая Ламберта
Код
function pj_mlfn(phi,sphi,cphi:double;fEn:TEnParam):double;
begin
 result:=fEn[0]*phi-cphi*sphi*(fEn[1]+
 sqr(sphi)*(fEn[2]+sqr(sphi)*(fEn[3]+sqr(sphi)*fEn[4])));
end;

// радианы в метры
function lccaForward(pntBL: T3dPoint; PJ : PCustomProj):T3dPoint; // ellipsoid
var S,r: double;
begin
  S := pj_mlfn(pntBL.phi, sin(pntBL.phi), cos(pntBL.phi),PJ.PM.EN)-PJ.PM.B;
  r  := PJ.PM.D - fS(S,PJ.PM.C);
  result.x := PJ.k0 * (r* sin(pntBL.lam*PJ.PM.A));
  result.y := PJ.k0 * (PJ.PM.D-r*cos(pntBL.lam*PJ.PM.A));
end; 

function pj_inv_mlfn(arg,es:double; en:TEnParam;var errno : integer):double;
var s,t, k :double;
    i : integer;
begin
  k:=1/(1-es);
  result := arg;

  for i:=MAX_ITER downto 0 do //rarely goes over 2 iterations */
  begin
   t := 1-es*sqr(sin(result));
   t := (pj_mlfn(result,sin(result),cos(result),en)-arg)*(t*sqrt(t))*k;
   result := result-t;
   if (abs(t)<EPS) then break;
  end;
  errno := -17*byte((i<1) or (abs(t)>=EPS));
end;
// метры в радианы
function lccaInverse(pntXY: T3dPoint; PJ : PCustomProj):T3dPoint;// ellipsoid & spheroid
var theta, dr,
    S, dif : double;
    i      : integer;
    xy     :  T3dPoint;
begin
  xy.x  := pntXY.X/PJ.k0;
  xy.y  := pntXY.Y/PJ.k0;
  theta := arctan2(xy.x,PJ.PM.D-xy.y);
  dr    := xy.y-xy.x*tan(0.5*theta);
  result.lam := theta/PJ.PM.A;
  S := dr;
  for i:=MAX_ITER downto 0 do
  begin
   dif := (fS(S,PJ.PM.C)-dr)/fSp(S,PJ.PM.C);
   s   := s-dif;
   if (abs(dif)<1e-12) then break;
  end;
  if i=0 then pj.errno:=-1;
  result.phi := pj_inv_mlfn(S + PJ.PM.B, PJ.ellps.es, PJ.PM.EN,pj.errno);
end; 

Это формулы пересчёта которые используются в большинстве ГИС
Подставьте пожалуйста в них значения больше 90 градусов и посмотрите какие результаты Вы получите.
(непосредственно скопировав код с форума)
--------
Теперь цилиндрическая (равноплощадная):
Код
function TCEAForward(LP : T3dPoint;PJ:PCustomProj): T3dPoint; //spheroid
begin
 result.x:=PJ.PM.A*cos(lp.phi)*sin(lp.lam);
 result.y:=PJ.k0*(arctan2(tan(lp.phi),cos(lp.lam))-PJ.C0.phi);
end;

function TCEAInverse(PntXY : T3dPoint; PJ:PCustomProj): T3dPoint; // spheroid
var  XY : T3dPoint;
begin
 xy.y := PntXY.y*PJ.PM.A+PJ.C0.phi;
 xy.x := PntXY.x*PJ.k0;
 result.phi:=arcsin(sqrt(1-sqr(xy.x))*sin(xy.y));
 result.lam:=arctan2(xy.x,sqrt(1-sqr(xy.x))*cos(xy.y));
end; 

Обратите внимание ,что все преобразоания начинаются с АРКСИНУСА (arctan2 в прямом преобразовании).
Вопрос ВАМ:
чему равне арксинус числа большего еденице, или обрабтный вопрос
от сколько радиан арксинус будет больше еденицы ?
--------------
Отвеетив на вопрос, Вы сами себе ответите на все заданные Выше вопросы.
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Федор, я не спорю, что не на всех проекциях возможна работа с В>90. Тем не менее на многих проекциях это не вызывает никаких математических сложностей.
Но дело даже не в этом. Если функция не может выполнить преобразование координат, то согласно описанию она должна возвращать код ошибки. Сейчас же, почему-то, функции сообщают, что все прошло успешно, а координаты при этом дают не понятно какие. Так быть не должно! Если функция говорит, что ошибки нет, то я должен быть уверен, что возвращаемые координаты математически корректны. В частности, если цепочка преобразований XY -> BL -> XY прошла без ошибок, то, по моему глубокому убеждению, конечное значение должно совпасть с исходным.
Изменено: snav - 17.11.2010 18:34:54
 
Код
Если функция не может выполнить преобразование координат, то согласно описанию она должна возвращать код ошибки

Тут я с Вами на все 100% согласен. Разработчикам ядра следовало бы поставить проверку входных параметров "на дурака". К проблема с координатами не единственная в ядре ГИС и не только КБ.
К примеру попробуйте в качестве параметра (HMap, HSite, HObj, HSelect и.т.п) указать любое целое положительное число. Вместо кода ошибки функции, получатеся код сбоя системы (в простонародии Exeption)
Не тот глуп кто не знает, а тот, кто не знает где искать.
 
Цитата
KFF (Фёдор) пишет:
[CODE]Разработчикам ядра следовало бы поставить проверку входных параметров "на дурака".
И не только от дурака. Программисты не знают, какая проекция используется на карте. У нас есть координаты точек, но мы не можем проверить, возможно ли для них преобразование координат. Этой информацией обладают разработчики GisToolKit. Соответственно только они могут сообщить об ошибке, если преобразование невозможно.

Уважаемые разработчики, можно ли это сделать?
Изменено: snav - 25.11.2010 18:27:02
Страницы: 1 2 3 След.
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности