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

Меркатор в SXF

Поиск  Пользователи  Правила  Войти
Форум » Общие вопросы » Системы координат
Страницы: 1
RSS
Меркатор в SXF, Проблема с преобразованием координат из sxf файла
 
Есть sxf файл 1:100000, содержимое паспорта:
Код
Вид эллипсоида = 1            // => Красовского 1942 г. (большая полуось – 6378245 м, сжатие – 1: 298.3);
Проекция карты = 8            // => цилиндрическая прямая равноугольная (Меркатора) (код устарел, применять 36)
Система координат = 6         // => прямоугольная условная для обзорных карт, зависит от типа проекции, значений главных параллелей и осевого меридиана
Единица измерения в плане = 0 // => метры (или дискреты)
Обобщенный тип карты = 2      // => обзорно-географическая;

Первая главная параллель = 26.4 // градусов
Вторая главная параллель = 0
Осевой меридиан = 0
Параллель главной точки = 0
Смещение на север = 0
Смещение на восток = 0
Суть проблемы - нужно преобразование координат (желательно в proj нотации) из приведенного файла в wgs-84

Если смотреть в Panorama Mini, некая точка имеет координаты:
Код
X=3147698.737 Y=3231753.836
или в WGS-84:
B=030.24895418 L=032.40974704
Что визуально совпадает с гугл картами

Такое преобразование
Код
$ echo  32.40974703 30.24895418 | proj +proj=merc +lat_ts=26.4 +ellps=krass +units=m +no_defs
3233776.66   3149734.04
дает смещение в пару километров по обоим осям

Не могу понять откуда в панораме берутся такие цифры, и как получить такие же в proj
 
Цитата
Борис Ульянов написал:
Суть проблемы - нужно преобразование координат (желательно в proj нотации) из приведенного файла в wgs-84
дает смещение в пару километров по обоим осям....
Добрый день!
Вероятно, при преобразовании координат не все параметры проекции учитываются (датум, осевой меридиан, и.т.д.)
Прямоугольные координаты исходные и результирующие получены в одной и тоже системе координат?
 
Цитата
Елена Кузнецова написал:
Вероятно, при преобразовании координат не все параметры проекции учитываются (датум, осевой меридиан, и.т.д.)
Прямоугольные координаты исходные и результирующие получены в одной и тоже системе координат?
Добрый!

Согласен что что то не учитывается, пытаюсь понять что именно.
Про исходные и результирующие координаты не понял вопрос, насколько понимаю, у меня только исходные.
Попробую переформулировать:
  • есть sxf файл (дан в качестве примера)
  • я его конвертирую собственными средствами
  • результат визуально смещен на ~2км (относительно гугл карт)
  • открываю тот же файл в панорама мини - смещения нет
  • в панораме смотрю метрику некого объекта в прямоугольных (XY) и WGS координатах (BL)
  • пытаюсь получить преобразование, которое из XY сделает BL, но получаю то же смещение
=>  не понимаю как панорама получает BL из XY (может какие то умолчания не отраженные в паспорте?)

Еще хочу уточнить: когда в панораме смотришь метрику объекта в прямоугольных координатах, то показываются исходные значения
(файл просто открыт, никаких изменений/переключений проекций не делалось)?
 
Цитата
Елена Кузнецова написал:
В программе Панорама исходные координаты объектов отображаются в соответствие установленных параметров проекции в диалоге Паспорт карты.
В диалоге Паспорт карты у меня такое:

Тип карты: Пользовательская произвольная
Проекция: Цилиндрическая на шаре (Широта/Долгота)
Эллипсоид: Красовский 1940 (EPSG = 7024)

Странно, я считал, что в диалоге Паспорт должны отображаться значения прочитанные из sxf паспорта (согласно описанию формата), но это не так.
Может это все таки ошибка/разночтение в описании формата sxf и панораме?
Если нет, то получается что прямоугольные координаты, которые смотришь в диалоге объект/метрика, это не оригинальные значения, а уже преобразованные?
Изменено: Борис Ульянов - 26.07.2022 13:18:47 (заменил картинку на текст)
 
Цитата
Борис Ульянов написал:
Может это все таки ошибка/разночтение в описании формата sxf и панораме?Если нет, то получается что прямоугольные координаты, которые смотришь в диалоге объект/метрика, это не оригинальные значения, а уже преобразованные?
При импорте данных из формата sxf в программе ГИС Панорама координаты не меняются.

Отображение координат возле курсора и в диалоге "Выбор объекта" осуществляется в проекции, которая установлена в диалоге "Паспорт карты".

Для карты можно установить отображение координат в другой системе отсчета. Для этого есть задача Текущие параметры проекции", которая вызывается через Главное меню - Параметры.
Если для данных установлены текущие параметры проекции, то плоские прямоугольные координаты (в метрах) во всех диалогах отображаются и редактируются в соответствии с установленными параметрами проекции. Например, карта создана в системе координат 42 года, а параметры проекции установлены по типу Топографическая UTM WGS 84. При этом во всех диалогах плоские координаты будут отображаться в проекции UTM на эллипсоиде WGS-84 в соответствии с выбранным осевым меридианом. При сохранении координат они автоматически преобразуются к проекции и системе координат карты.
Изменено: Елена Кузнецова - 27.07.2022 08:59:32
 
Я видимо что то упускаю:

- запускаю Панорама Мини (никаких ранее открытых карт)
- через диалог "файл/открыть файл" указываю свой sxf и классификатор => карта загружается
- не запуская никаких задач открываю диалог "задачи/паспорт карты"
- в диалоге вижу: "Проекция - Цилиндрическая на шаре (Широта/Долгота)"
- при этом в sxf файле 234 байт равен 8, что согласно спецификации значит "Проекция карты - цилиндрическая прямая равноугольная (Меркатора) (код устарел, применять 36)"

Отсюда вопросы:

- почему значение проекции в диалоге не совпадает с описанным в спецификации?
- если смотреть значения плоских прямоугольных координат (опять же ничего не меняя) то они взяты как есть из файла, или пересчитаны в проекцию из диалога "Паспорт карты"?

Уточню: если
Цитата
При импорте данных из формата sxf в программе ГИС Панорама координаты не меняются
Цитата
Отображение координат возле курсора и в диалоге "Выбор объекта" осуществляется в проекции, которая установлена в диалоге "Паспорт карты
и при этом в диалоге "Паспорт карты" отображается проекция не та что записана в sxf то получается противоречие
Изменено: Борис Ульянов - 27.07.2022 16:25:13
 
Цитата
Борис Ульянов написал:
Отсюда вопросы:- почему значение проекции в диалоге не совпадает с описанным в спецификации?- если смотреть значения плоских прямоугольных координат (опять же ничего не меняя) то они взяты как есть из файла, или пересчитаны в проекцию из диалога "Паспорт карты"?
Добрый день!
Для рассмотрения вопросов нужен пример данных. Просьба прислать карту в формате SXF и классификатор.
Данные можете прислать на почту технической поддержки panorama@gisinfo.ru
 
Вопросы с несоответствием данных в диалоге паспорт снялись (ошибка в старой версии Панорама Мини)

Но все же хотелось бы решить первоначальный вопрос - как пересчитать координаты так же, как это делает Панорама

Здесь https://gisweb.ru/forum/messages/forum12/topic6627/message46151/6627#message46151
говорится, что есть некая "другая" версия проекции Меркатора, и похоже это как раз мой случай
 
Код
//*********************************************************************
// Цилиндрическая прямая равноугольная Меркатора (устаревшая)
//*********************************************************************

#define  CONSTMOD            0.434294481903251827651       // 0.43429448

//--------------------------------------------------------------------
// Инициализация
//--------------------------------------------------------------------
void _fastcall TTranslate::InitMercatorMap()
{
  // вычисление постоянных по FirstMainParal
  va = BigAxis * cos(FirstMainParallel);
}

//---------------------------------------------------------------------
// Вычисление геодезических координат точки B,L по прямоугольным координатам точки X,Y
// Входные данные:
// x,y - координаты точки в метрах
// Выходные данные:
// b,l - широта и долгота точки в радианах
//---------------------------------------------------------------------
void _fastcall TTranslate::XY2BL_MercatorMap(double x, double y, double& b, double& l)
{
  double   xx;
  double   fd;
  double   fh;
  double   fc;
  double   h;
  double   c;
  double   delta = 0.000000001;   // 10-9

  // Ищем долготу
  l = (y - FalseEasting)/ va + AxisMeridian;

  x -= FalseNorthing;

  // Ищем широту
  if (x < 0.0)
    xx = -x;
  else
    xx = x;

  h = M_PI / 2. - 0.000001;        // Меркатор определен где-то до 87 градусов

  double mod = CONSTMOD;

  double step = xx * mod / va;   // x / radius -> ParallelCurvatureRadius(FirstMainParallel) ???
  if (step > 300)
  {
    b = h;
    goto end;
  }

  double rab = pow(10., step);
  double d = 0;

  fd = (1 + sin(d)) * pow(1 - ExscMerid * sin(d), ExscMerid) / ((1 - sin(d)) * pow(1 + ExscMerid * sin(d), ExscMerid));
  if (fd <= 0)
    fd = -rab;
  else
    fd = sqrt(fd) - rab;

  fh = (1 + sin(h)) * pow(1 - ExscMerid * sin(h), ExscMerid) / ((1 - sin(h)) * pow(1 + ExscMerid * sin(h), ExscMerid));
  if (fh <= 0)
    fh = -rab;
  else
    fh = sqrt(fh) - rab;

  if (fabs(fd) < delta)
  {
    b = d;
    goto end;
  }
  if (fabs(fh) < delta)
  {
    b = h;
    goto end;
  }

  while (h - d > delta)
  {
    if (fd * fh < 0)
    {
      c = (h + d) / 2.;

      double sinc = sin(c);
      double exscsinc = ExscMerid * sinc;
      fc = sqrt((1. + sinc) * pow(1. - exscsinc, ExscMerid) / ((1. - sinc) * pow(1 + exscsinc, ExscMerid))) - rab;

      if (fabs(fc) < delta)
      {
        b = c;
        goto end;
      }

      if (fd * fc < 0)
        h = c;
      else
      {
        d = c;
        fd = fc;
      }
    }
    else
    {
      b = 0.0;
      goto end;
    }

    b = c;
  }

end:;

  if (x < 0.0)
    b = -b;
}

//---------------------------------------------------------------------
// Вычисление прямоугольных координат X,Y по геодезическим координатам B,L
// Входные данные:
// b,l - геодезические координаты точки в радианах
// Выходные данные:
// x,y - координаты точки в системе Гаусса-Крюгера в метрах
//---------------------------------------------------------------------
void _fastcall TTranslate::BL2XY_MercatorMap(double b, double l, double& x, double& y)
{
  double mod = CONSTMOD;
  int flag = 0;

  // Перевод геодезических координат точки в прямоугольные координаты
  if (b < (MainPointParallel)) 
  { 
    b = -b; 
    flag = 1; 
  }

  double kci1 = asin(ExscMerid * sin(b));
  double u1 = tan(M_PI / 4. + b / 2.) / pow(tan(M_PI / 4. + kci1 / 2.), ExscMerid);

  if ((u1 < 0.000001) && (u1 > -0.000001))
    u1 = 0.000001;

  double xx = va / mod * log10(u1);
  double yy = va * (l - AxisMeridian);

  if (flag == 0)
    x = xx;
  else
    x = -xx;

  x += FalseNorthing;
  y = yy + FalseEasting;
}
Код
//--------------------------------------------------------------------
// Инициализация параметров эллипсоида
//--------------------------------------------------------------------
void TTranslate::InitEllipsoid(int ellipsoid, DATUMPARAM* datum, ELLIPSOIDPARAM* ellparam)
{
  if ((ellipsoid == USERELLIPSOID) && (ellparam != 0) && (ellparam->SemiMajorAxis > 0) && (ellparam->InverseFlattening >= 0))
  {
    BigAxis = ellparam->SemiMajorAxis;
    Alfa = ellparam->InverseFlattening;
  }
  else
  {
    if ((ellipsoid <= 0) || (ellipsoid > ELLIPSOIDCOUNT))
      ellipsoid = WGS_84;

    BigAxis = Spheroids[ellipsoid].SemiMajorAxis;
    Alfa = Spheroids[ellipsoid].InverseFlattening;
  }

  Ellipsoid = ellipsoid;

  AlfaTo1 = 1.0 - Alfa;

  E2 = 2. * Alfa - Alfa * Alfa;
  if (E2 > 0)
    ExscMerid = sqrt(E2);
  else
    ExscMerid = 0;

  E2_2 = E2 / (1. - E2);

  MiddleRadius = BigAxis * (1. - Alfa / 2.);

  // ...
}
 
Так все сошлось, спасибо!
Страницы: 1
Читают тему (гостей: 1)



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

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