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

Создание, открытие, отображение карты

Поиск  Пользователи  Правила  Войти
Форум » Linux » ГИС Панорама для Linux
Страницы: 1 2 След.
RSS
Создание, открытие, отображение карты, Создание, открытие, отображение карты
 
Здравствуйте.

1. Создаю карту из тестовой карты что у вас в примерах (Podolsk.sxf, Topo100t.rsc) с помощью

_VECIMP long int _VECAPI ImportFromAnySxf(HMAP hmap, const char * sxfname,                                          const char * rscname,
                                         char * mapname, long int size, HMESSAGE handle, HSELECT select).

2. Открываю созданные векторные данные с помощью
_MAPIMP HMAP _MAPAPI mapOpenMap(const char *mapname, long int mode = 0).

3. Необходимо подготовить Image для отображения на экране (как создать Image из данных понятно и как отобразить тоже).
Вопрос как из открытых векторных данных (что я открыл в Пункте 2) получить карту с нужным мне масштабом 1:50 и 1:100 под окно 1400*920 pix
с координатами центра отображения NZ=7 X=6140000 Y=419000 м (проекция ГК и проекция Каврайского с возможностью смены проекций)?
Есть примеры в поставке или может кто подскажет последовательность действий?


Код
Скрытый текст

Что делать дальше нужна помощь.

Спасибо.
Astra Linux Special Edition 1.6 релиз «Смоленск»/ГИС Конструктор МО РФ
 
Просьба уточнить, в какой программе и версии работаете?
 
Astra LInux 1.6 SE.
Panorama 12. ГИС Конструктор с сертификатом от МО РФ.
Изменено: Алексей Scout - 15.03.2021 15:40:02
Astra Linux Special Edition 1.6 релиз «Смоленск»/ГИС Конструктор МО РФ
 
Здравствуйте.

Для установки масштаба отображения, можно, например, воспользоваться функцией компонента QDMapView SetViewScale или MAPAPI функций mapSetViewScale (mapapi.h).
Функции изменения масштаба рассматриваются в пунктах 3.6.3 «Открытие и создание пользовательских карт» и 3.6.4 «Управление визуализацией и печатью» Руководства программиста и используются в примерах myfirst и mapview.

В примерах myfirst и mapview реализованы примеры изменения положения карты. Для myfirst, примера на компонентах, используется функция SetMapLeftTop. В примере mapview есть используется функции ShiftLeftTopCorner и  SetCenter.

Для трансформации проекции, можно, например, воспользоваться функцией mapSetDocProjection (mapapi.h)
Использование функции mapSetDocProjection рассматривается в пункте 3.6.5 «Управление системой координат карты» Руководства программиста.

 
Константин, спасибо.
Выше, я привел фрагмент кода для преобразования карты в проекцию ГК перед отображением.
Ниже привожу фрагмент для преобразования в проекцию Каврайского.

Скрытый текст

1) Все ли верно?
2) И где вообще можно прочитать какие именно данные необходимо заносить при смене различных проекций?
Просто нет конкретных примеров что именно надо заполнять при смене проекций. Приходится экспериментировать.
Спасибо.
Изменено: Алексей Scout - 16.03.2021 14:14:09
Astra Linux Special Edition 1.6 релиз «Смоленск»/ГИС Конструктор МО РФ
 
Проекция Каврайского имеет другой код проекции:
Код
   KAVRAJSKY                   = 18, // Псевдоцилиндрическая равновеликая синусоидальная проекция Каврайского
см. mapcreat.h

Все параметры проекции могут быть нулевые, кроме FalseNorthing, FalseEasting - при необходимости.
 
Преобразование карты перед отображением,  четыре разных проекции (работаю с картой Подольска, та что в поставке).
Посмотрите пожалуйста все ли верно.
Отображать планирую в окне с центром в точке х=6140000 у=419000 зона 7.
Не обладаю знаниями в картографии, собираю по частям информацию.
Скрытый текст
Изменено: Алексей Scout - 18.03.2021 16:39:13
Astra Linux Special Edition 1.6 релиз «Смоленск»/ГИС Конструктор МО РФ
 
Не совсем то:
Код
mapreg.AxisMeridian = mapGetAxisMeridianByZone(nz); (nz=7)
mapreg.ZoneNumber = mapreg.AxisMeridian; (0.680678 )
скорее
Код
mapreg.ZoneNumber = nz;
mapreg.AxisMeridian = mapGetAxisMeridianByZone(mapreg.ZoneNumber); 

Для СК-42 есть более простой способ заполнения -
Код
  // Запросить параметры проекции и системы координат по коду EPSG
  // Если код EPSG задает геодезическую систему координат,
  // то устанавливается проекция Широта\Долгота и соответствующие
  // параметры эллипсоида и датум
  // Если код EPSG задает плоскую прямоугольную систему координат,
  // то все параметры устанавливаются из базы EPSG
  // epsgcode  - код EPSG, для СК-42 зоны 2-32 : 28402-28432, для СК-95 зоны 4-32: 20004-20032
  // mapreg    - параметры системы координат и проекции
  // datum     - параметры пересчета с эллипсоида рабочей системы координат
  //             к WGS84
  // ellipsoid - параметры пользовательского эллипсоида для рабочей
  //             системы координат
  // Для геодезических систем координат возвращает 2,
  // для плоских прямоугольных возвращает 1.
  // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGetParametersForEPSG(long int epsgcode, MAPREGISTEREX * mapreg,DATUMPARAM * datum, ELLIPSOIDPARAM * ellipsoid);
Для зоны 7 код EPSG равен 28400 + 7

SEANAUTIC и MERCATORMAP - это разные вещи.

Можно взять параметры по коду EPSG 3857 ("World Mercator"):
Код
mapGetParametersForEPSG(3857, &mapreg, &datum, &ellipsoid);
затем заменить эллипсоид:
Код
mapreg.EllipsoideKind = KRASOVSKY42;
mapGetEllipsoidParameters(KRASOVSKY42, &ellipsoid);
Хотя такую систему на практике не применяют.

Но если нужна система для морских карт ("Mercator 2SP"), тогда можно так:
Код
mapRegisterFromMapType(SEANAUTIC, &mapreg);
затем заменить эллипсоид -

Код
mapreg.EllipsoideKind = KRASOVSKY42;
mapGetEllipsoidParameters(KRASOVSKY42, &ellipsoid);

Судя по параметрам Вам нужна прямая коническая равнопромежуточная проекция Каврайского с параллелями 47 и 62 градуса -
Код
mapreg.MainPointParallel = tmp->geo.B_kavr_map; (0.942478 )
mapreg.AxisMeridian = tmp->geo.L_kavr_map; (0.658862 )
mapreg.FirstMainParallel = tmp->geo.first_latitude_map; (0.820305 )
mapreg.SecondMainParallel = tmp->geo.second_latitude_map; (1.0821 ) 

Есть прямая равнопромежуточная коническая проекция - CONICALEQUIDISTANT. Вероятно, нужно использовать ее для Вашей задачи.
Код
memset(&mapreg, 0, sizeof(mapreg));
mapreg.Length = sizeof(mapreg);

mapRegisterFromMapType(GEOGRAPHIC, &mapreg);

mapreg.MaterialProjection = CONICALEQUIDISTANT;
mapreg.EllipsoideKind = KRASOVSKY42; 
mapreg.MainPointParallel = tmp->geo.B_kavr_map; // (0.942478 ) 
mapreg.AxisMeridian = tmp->geo.L_kavr_map; // (0.658862 ) 
mapreg.FirstMainParallel = tmp->geo.first_latitude_map; // (0.820305 ) 
mapreg.SecondMainParallel = tmp->geo.second_latitude_map; // (1.0821 )  

mapGetEllipsoidParameters(KRASOVSKY42, &ellipsoid);
 
Цитата
Константин Ганюшин написал:
В примере mapview есть используется функции ShiftLeftTopCorner и  SetCenter.
Я не использую scrollArea, только Иксы. Есть окно наземной обстановки 1200*900 пикс. зона видимости в км (50, 100, 200, 300... 3000) и:
- координаты в метрах левого верхнего угла области просмотра в местной системе координат;
- координаты в метрах центра окна в местной системе координат;
- координаты в метрах центра окна в ГК, Меркатора и Каврайского.

Больше ни чего нет.

В ваших примерах поставки нет системы координат в окне, вы просто рисуете карту не привязывая ее к системе координат.

И как тут сообразить что во что пересчитать с учетом зоны видимости чтобы карту правильно подготовить для Image.
Изменено: Алексей Scout - 19.03.2021 15:47:06
Astra Linux Special Edition 1.6 релиз «Смоленск»/ГИС Конструктор МО РФ
 
Чтобы получить ответ - нужно задать вопрос.
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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