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

трансформирование проекции растровой карты

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
трансформирование проекции растровой карты, mapSetDocProjection() трансформирует проекцию только векторных карт
 
Добрый день.

У нас в программе нужно открыть карту любого типа (векторная, растровая) и отобразить ее на глобусе. При этом модуль, отображающий карту на глобусе, предполагает, что карта -- в проекции с кодом EPSG 4326.

Для того, чтобы выполнить его пожелание, после открытия карты выполняются функции из mapapi.h: mapGetParametersForEPSG(4326, ...) и mapSetDocProjection(hMap, ...). И только после этого функция mapPaintToImage(hMap, ...). Полученной image и пользуется модуль отображения на глобусе.

В описании функции mapSetDocProjection() написано:

Код
// После установки общих параметров проекции изображение карты формируется
 // в заданной проекции. Векторные карты, имеющие другие параметры
 // проекции, трансформируются в процессе отображения.
 // Матрицы и растры не трансформируются при отображении и должны иметь 
 // те же параметры проекции, что и общие параметры документа


И действительно, векторные карты отображаются на глобусе нормально, а растровые - или не отображаются совсем, или отображаются и даже в нужном месте, но ужимаются в два раза по горизонтали.

Собственно, вопрос. Как трансформировать растровую карту к нужной проекции?
 
Цитата
Епифанов Сергей пишет:
Собственно, вопрос. Как трансформировать растровую карту к нужной проекции?

Для векторных карт преобразование к другой проекции и СК выполняется "на лету". Растровые карты необходимо предварительно трансформировать. В ГИС Карта2011 необходимо воспользоваться задачей "Преобразование проекции растра", вызываемой из диалога "Запуск приложений" (Задачи -> Запуск приложений), или вызвать следующую функцию:
// Преобразование растра к заданной проекции
//
// handle - диалог визуального сопровождения процесса обработки.
// namein - имя исходного растра;
// nameout - имя выходного растра;
// mapreg - адрес структуры с данными о заданной проекции
// (описание структуры MAPREGISTEREX см в mapcreate.h);
// datum - параметры пересчета геодезических координат с заданного эллипсоида
// на эллипсоид WGS-84 (может быть ноль),
// ellparam - параметры пользовательского эллипсоида (может быть ноль).
// Диалогу визуального сопровождения процесса обработки посылаются сообщения:
// - (WM_PROGRESSBAR) Извещение об изменении состояния процесса
// WPARAM - текущее состояние процесса в процентах (0% - 100
// Если функция-отклик возвращает WM_PROGRESSBAR, то процесс завершается.
// При ошибке возвращает ноль,

// код ошибки возвращается функцией picexGetLastError() (коды ошибок см. maperr.rh)
//==========================================================­======================
_MAPIMP long int WINAPI RswProjectionReformingEx(HMESSAGE handle, char * namein,
char * nameout, MAPREGISTEREX * mapreg,
DATUMPARAM * datum,
ELLIPSOIDPARAM* ellparam);
Функция RswProjectionReformingEx() из файла namein формирует файл nameout с новыми параметрами проекции и СК, указанными посредством структур MAPREGISTEREX, DATUMPARAM, ELLIPSOIDPARAM.
Функция RswProjectionReformingEx находится в библиотеке gispicex.dll для GIS ToolKit 11 (gisupicex.dll - GIS ToolKit 12 x32, gisu64picex.dll - GIS ToolKit 12 x64).
Функция RswProjectionReformingEx объявлена в файле mappicex.h.
Изменено: Елена Кузнецова - 24.03.2014 11:16:46
 
Елена, спасибо за подробный ответ!

Однако эта функция совсем не помогает. (В качестве параметров проекции и системы координат передавал ей парметры, полученные функцией mapGetParametersForEPSG(4326, ...) )
Да, стоит уточнить: мы используем Gis Toolkit 11.

Получается одна из трех проблем (я рассматриваю три примера файлов .rsw, которые можно найти в архиве с примерами карт на этом сайте).
  • Property.Rsw/Podolsk.rsw: преобразование успешно выполняется, и размер файла изменяется, однако новая карта отображается ровно так же неправильно, как старая.
  • Data.Rsw/Rome.rsw: возникает ошибка "для трансформирования растр должен иметь координаты привязки".
  • PODOLSK/image3d.rsw: возникает ошибка "параметры проекции исходного растра некорректны".

Я допускаю, что действительно у одного растра нет координат привязки, у другого что-то не то с параметрами. Но что тогда с первым файлом? И где взять рабочие примеры карт .rsw ?
 
Здравствуйте, Сергей!
Для преобразования проекции и СК исходный растр должен иметь следующие характеристики:
1. геопространственную  привязку.
2. Параметры проекции и СК
Если для растра не установлена геопространственная  привязка, то при добавлении в документ карты изображение растра отображается в юго-западном углу района.
Код
// Запросить флаг существования привязки растра
  // hMap       - идентификатор открытой векторной карты
  // number     - номер файла в цепочке
  // При ошибке возвращает 0
_MAPIMP long int _MAPAPI mapCheckExistenceRstLocation(HMAP hMap, long int number);
Если функция mapCheckExistenceRstLocation возвращает  1, то привязка для растра установлена.
Код
// Установить привязку растра в районе работ(в метрах)
  // hMap       - идентификатор открытой векторной карты
  // number     - номер файла в цепочке
  // location   - координаты юго-западного угла растра(в метрах)
  // При ошибке возвращает 0
_MAPIMP long int _MAPAPI mapSetRstLocation(HMAP hMap, long int number, DOUBLEPOINT *location);

  // Запросить привязку растра в районе работ(в метрах)
  // hMap       - идентификатор открытой векторной карты
  // number     - номер файла в цепочке
  // location   - координаты юго-западного угла растра(в метрах)
  // При ошибке возвращает 0
_MAPIMP long int _MAPAPI mapGetRstLocation(HMAP hMap, long int number, DOUBLEPOINT *location);

Выяснить, корректно ли установлены параметры проекции и СК в растр, можно вызвав функцию mapIsRstGeoSupported.
Код
// Запрос - поддерживается ли пересчет к геодезическим
  // координатам из плоских прямоугольных и обратно
  // hMap     - идентификатор открытой основной карты
  // number   - номер растра
  // Если нет - возвращает ноль
  _MAPIMP long int _MAPAPI mapIsRstGeoSupported(HMAP hMap, long int number);

Параметры проекции и СК передаются посредством трёх структур: MAPREGISTEREX, DATUMPARAM, ELLIPSOIDPARAM.
Код
// Запросить данные о проекции растра
  // number      - номер файла в цепочке
  // mapregister - адрес структуры, в которой будут размещены
  // данные о проекции
  // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapGetRstProjectionData(HMAP hMap, int number,
MAPREGISTEREX* mapregister);

  // Запросить данные о проекции растра по имени файла
  // name        - имя файла растра
  // mapregister - адрес структуры, в которой будут размещены
  // данные о проекции
  // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapGetRstProjectionDataByName(const char *name,
MAPREGISTEREX* mapregister);
_MAPIMP long int _MAPAPI mapGetRstProjectionDataByNameUn(const WCHAR *name,
MAPREGISTEREX* mapregister);
// Установить данные о проекции растра
  // number - номер файла в цепочке
  // mapregister - адрес структуры
  // При ошибке возвращает ноль
_MAPIMP  long int _MAPAPI mapSetRstProjectionData(HMAP hMap, int number,
MAPREGISTEREX* mapregister);

  // Запросить параметры эллипсоида растра
  // hMap   - идентификатор открытой основной векторной карты
  // number - номер файла растра в цепочке
  // ellipsoidparam - адрес структуры, в которой будут размещены
  // параметры эллипсоида
  // Структурa ELLIPSOIDPARAM описанa в mapcreat.h
  // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapGetRstEllipsoidParam(HMAP hMap, long int number,
ELLIPSOIDPARAM *ellipsoidparam);

  // Установить параметры эллипсоида растра
  // hMap    - идентификатор открытой основной векторной карты
  // number  - номер файла растра в цепочке.
  // ellipsoidparam - адрес структуры, содержащей параметры эллипсоида
  // Структурa ELLIPSOIDPARAM описанa в mapcreat.h
  // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapSetRstEllipsoidParam(HMAP hMap, long int number,
const ELLIPSOIDPARAM *ellipsoidparam);

  // Запросить коэффициенты трансформирования геодезических координат растра
  // hMap   - идентификатор открытой основной векторной карты
  // number - номер файла растра в цепочке
  // datumparam - адрес структуры, в которой будут размещены
  // коэффициенты трансформирования геодезических координат
  // Структурa DATUMPARAM описанa в mapcreat.h
  // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapGetRstDatumParam(HMAP hMap, long int number,
DATUMPARAM *datumparam);

  // Установить коэффициенты трансформирования геодезических координат растра
  // hMap    - идентификатор открытой основной векторной карты
  // number  - номер файла растра в цепочке.
  // datumparam - адрес структуры, содержащей коэффициенты трансформирования
  // геодезических координат
  // Структурa DATUMPARAM описанa в mapcreat.h
  // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapSetRstDatumParam(HMAP hMap, long int number,
const DATUMPARAM *datumparam);

Property.Rsw/Podolsk.rsw – растр с установленными параметрами проекции и СК (тип карты – «Топографическая 42 года», проекция – «Равноугольная Гаусса-Крюгера», номер зоны – 7). Отсутствует лишь эллипсоид.
Для корректной работы функции  RswProjectionReformingEx в растр Property.Rsw/Podolsk.rsw необходимо установить значение эллипсоида – «Красовский 1940».
 
Здравствуйте, Дмитрий!

Спасибо, разобрался. Действительно, если запросить параметры эллипсоида Красовского 1940г. функцией mapGetParametersForEPSG(7024, ...) и установить их функцией mapSetRstEllipsoidParam() в файл Property.Rsw/Podolsk.rsw, закрыть его, выполнить преобразование этого файла к новой проекции RswProjectionReformingEx() и после этого открыть файл снова, то карта отображается корректно.

Остался один вопрос. Часто ли в растрах нет эллипсоида, проекции или СК? Где можно взять примеры "полноценных" растров .rsw, у которых все параметры выставлены? Ведь все существующие в архиве с сайта три файла неполноценны.
 
Примеры растров поправим на сайте.
Страницы: 1
Читают тему (гостей: 1)



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

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