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

delphi xe5. Не работает преобразование растра.

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active
Страницы: 1
RSS
delphi xe5. Не работает преобразование растра.
 
Задача - отобразить растр на карте Yandex.
Создал растр в CK-42
2.jpg (62.83 КБ)
1.jpg (94.84 КБ)
 
далее выполняю алгоритм -

Описание алгоритма получения полноценного растра из графического файла BMP:

1. Конвертируем изображение растра из файла BMP в файл RSW.
Используем одну из функций, объявленных в файле mappicex.h: picexLoadBmpToRstAndCompress, picexLoadBmpToRstAndCompressJPEG, LoadBmpToRstByPlace...
В результате выполнения функции импорта получаем на диске файл RSW.

2. Открываем полученный растр RSW в отдельном документе вызовом функции mapOpenData() из mapapi.h.
В результате выполнения функции получаем идентификатор (дескриптор) HMAP открытого документа. В документе у нас открыт только один растр.

3. Заполняем структуры MAPREGISTEREX, ELLIPSOIDPARAM, DATUMPARAM параметрами проекции и системы координат.

4. Устанавливаем параметры проекции и СК (системы координат) в растр RSW вызовом функций: mapSetRstProjectionData, mapSetRstEllipsoidParam, mapSetRstDatumParam.
Функции, позволяющие установить параметры проекции и СК растра (и многое другое), объявлены в файле rstapi.h.
Как правило, функции принимают на вход дескриптор открытого документа HMAP, который мы получили вызовом функции mapOpenData() (см. п.2), и номер растра в цепочке (документе), т.к. в документ можно добавить несколько растров.
Номер растра в цепочке (документе) определяется вызовом функции mapGetRstNumberByName.

5. Закрываем документ с растром для освобождения ресурсов и памяти:
Код
// Закрыть все данные электронной карты
 // hmap -  идентификатор открытых данных
 // Идентификатор HMAP становится недействительным !

 _MAPIMP void _MAPAPI mapCloseData(HMAP hMap);
Изменено: Алексей Азаренко - 17.05.2016 13:02:04
 
// Открыть данные с автоматическим определением их типа
    HMAP hMap = mapOpenData(rswName, 0);
    if (hMap)
      {
       // Запросить номер растра в цепочке по имени файла
       int numberRsw = mapGetRstNumberByName(hMap, rswName);
       if (numberRsw != 0)
         {
          MAPREGISTEREX mapreg;
          memset(&mapreg, 0, sizeof(MAPREGISTEREX));
          mapreg.Length = sizeof(MAPREGISTEREX);

          ELLIPSOIDPARAM ellipsoid;
          memset(&ellipsoid, 0, sizeof(ELLIPSOIDPARAM));

          DATUMPARAM datum;
          memset(&datum, 0, sizeof(DATUMPARAM));

          // Код EPSG указал первый попавшийся
          long int epsgcode = 4326; // WGS 84 (Lat/Lon)

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

          if (mapGetParametersForEPSG(epsgcode, &mapreg, &datum, &ellipsoid) != 0)
            {
             // Установить данные о проекции растра
             if (mapSetRstProjectionData(hMap, numberRsw, &mapreg) != 0 &&
                 // Установить параметры эллипсоида растра
                 mapSetRstEllipsoidParam(hMap, numberRsw, &ellipsoid) != 0 &&
                 // Установить коэффициенты трансформирования геодезических координат растра
                 mapSetRstDatumParam(hMap, numberRsw, &datum) != 0)
               {
                // установка параметров проекции и СК выполнена

                // Записать изменения растра в файл
                // hMap       - идентификатор открытой векторной карты
                // number     - номер файла в цепочке
                // При ошибке возвращает ноль

                mapSaveRst(hMap, numberRsw);

               }
              else
               {
                // Ошибка установки параметров проекции и СК
                // MessageBox(...);
               }
            }
         }

       // Закрыть все данные электронной карты
       // hmap -  идентификатор открытых данных
       // Идентификатор HMAP становится недействительным !

       mapCloseData(hMap);
      }
 
указываю только нужные параметры,

// Цилиндрическая Меркатора на шаре "World Mercator" EPSG:3395

mapGetParametersForEPSG(3395, @mapreg, @datum, @ellipsoid);

mapreg.MapType            := MT_MERCATOR;
mapreg.MaterialProjection := MP_WORLDMERCATOR;


--------------
Почему растр неправильный ? координаты смещены на огромное расстояние ?
Я никак не могу этот растр наложить на Yandex карту
2.jpg (94.27 КБ)
1.jpg (109.63 КБ)
Изменено: Алексей Азаренко - 17.05.2016 13:11:16
 
Вы не выполняете трансформирование изображения, а вносите ошибочные параметры в паспорт растра.

Функции трансформирования растра приведены в mappicex.h.
Например:

Код
//================================================================================
// Преобразование растра к заданной проекции
//
//   handle  - диалог визуального сопровождения процесса обработки.
//   namein  - имя исходного растра;
//   nameout - имя выходного растра;
//   mapreg  - адрес структуры с данными о заданной проекции
//             (описание структуры MAPREGISTEREX см в mapcreate.h);
//   datum   - параметры пересчета геодезических координат с заданного эллипсоида
//             на эллипсоид WGS-84 (может быть ноль),
//   ellparam - параметры пользовательского эллипсоида (может быть ноль).
//   Диалогу визуального сопровождения процесса обработки посылаются сообщения:
//   -  (WM_PROGRESSBAR) Извещение об изменении состояния процесса
//      WPARAM - текущее состояние процесса в процентах (0% - 100%)
//      Если функция-отклик возвращает WM_PROGRESSBAR, то процесс завершается.
// При ошибке возвращает ноль,
// код ошибки возвращается функцией picexGetLastError() (коды ошибок см. maperr.rh)
//================================================================================
_PICIMP long int _PICAPI RswProjectionReformingEx(HMESSAGE handle, const char * namein,
                                                 const char * nameout, MAPREGISTEREX * mapreg,
                                                 DATUMPARAM * datum,
                                                 ELLIPSOIDPARAM* ellparam);

_PICIMP long int _PICAPI RswProjectionReformingExUn(HMESSAGE handle, const WCHAR * namein,   // 19/06/14
                                                 const WCHAR * nameout, MAPREGISTEREX * mapreg,
                                                 DATUMPARAM * datum,
                                                 ELLIPSOIDPARAM* ellparam);


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

_MAPIMP long int _MAPAPI mapGetParametersForEPSG(long int epsgcode,
                                                 MAPREGISTEREX  *mapreg,
                                                 DATUMPARAM     *datum,
                                                 ELLIPSOIDPARAM *ellipsoid);
 
Еще вопрос.

-----------------------------------------
есть такой код из пред переписки
-----------------------------------------

double x_min = 100;   // значения привязки условные !
 double y_min = 100;
 double x_max = 200;
 double y_max = 200;

 DFRAME frame;
 frame.X1 = x_min;
 frame.Y1 = y_min;

 frame.X2 = x_max;
 frame.Y2 = y_max;

 //    Конвертор Bmp -> Rsw
 if (LoadBmpToRstByPlace(0, 0, bmpName, rswName, 500, &frame) != 0)
   {
    // Открыть данные с автоматическим определением их типа
    HMAP hMap = mapOpenData(rswName, 0);
    if (hMap)
      {
       // Запросить номер растра в цепочке по имени файла
       int numberRsw = mapGetRstNumberByName(hMap, rswName);
       if (numberRsw != 0)
         {
------------------------------------

получаю рамку
 k:=mapGetRstFrameMeters(hMap_, frame, numberRsw);

x1:=100
y1:=100;
x2:=102.5
y2:=102.5;


почему рамка изменилась ?
 
В функции LoadBmpToRstByPlace в качестве разрешения растра устанавливается значение по умолчанию - 20000 т./м, что соответствует 508 т./д.
Очевидно, что это значение не соответствует загружаемому изображению.
Размер элемента (пикселя) растра рассчитывается по формуле:  MeterInElement = Scale / Precision ;
MeterInElement - размер элемента (пикселя) растра в метрах,
Scale          - масштаб,
Precision      -  разрешения растра ( т./м).

Для импорта растра предлагаю использовать функцию picexLoadBmpToRstAndCompress:
Код
//========================================================================
// Загрузка растровых данных из файла BMP в файл RSW
//    BmpName - имя BMP-файла;
//    RstName - имя RSW-файла;
//    meterInElementX - размер в метрах элемента по X
//    meterInElementY - размер в метрах элемента по Y
//    point     - точка привязки растра (в метрах)
//                (положение юго-западного угла растра в районе)
//    Handle - HWND диалога визуального сопровождения процесса обработки.
//    compression - флаг сжатия изображения
//              0 - сжатие к блокам изображения применяться не будет
//              1 - блоки д.б. сжаты по методу LZW
//              2 - блоки д.б. сжаты по методу JPEG (справедливо для 24 битных растров)
//    При ошибке возвращает ноль
//
//    Диалогу визуального сопровождения процесса обработки посылаются
//    сообщения:
//    -  (WM_PROGRESSBAR) Извещение об изменении состояния процесса
//       WPARAM - текущее состояние процесса в процентах (0% - 100%)
//       Если функция-отклик возвращает WM_PROGRESSBAR, то процесс завершается.
//
//    -  (WM_ERROR) Извещение об ошибке
//       LPARAM - указатель на структуру ERRORINFORMATION
//       Структура ERRORINFORMATION описана в picexprm.h,
//       WM_PROGRESSBAR и WM_ERROR - в maptype.h
//========================================================================
_PICIMP long int _PICAPI picexLoadBmpToRstAndCompress(HMESSAGE Handle,
const char * BmpName,
const char * RstName,
double* meterInElementX,
double* meterInElementY,
DOUBLEPOINT *point,
int compression);

_PICIMP long int _PICAPI picexLoadBmpToRstAndCompressUn(HMESSAGE Handle,
const WCHAR *BmpName,
const WCHAR *RstName,
double* meterInElementX,
double* meterInElementY,
DOUBLEPOINT *point,
int compression);


Точка привязки растра point:
DOUBLEPOINT point;
point.x =  x_min;
point.y =  y_min;

// height - высота изображения в элементах (пикселях)
// width  - ширина изображения в элементах (пикселях)

// размер элемента (пикселя) растра в метрах  по X и Y
double meterInElementX = (x_max - x_min)/height;
double meterInElementY, = (y_max - y_min)/width;

// вызов функции
picexLoadBmpToRstAndCompress(0, BmpName, RstName, &meterInElementX, &meterInElementY, &point, 0);
 
Спасибо ! Работает...
Страницы: 1
Читают тему (гостей: 1)



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

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