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

Delphi XE 5. Импорт растра из BMP

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Delphi XE 5. Импорт растра из BMP
 
Выполняю импорт из BMP функцией - LoadBmpToRstByPlace

но файл растра должен содержать проекцию..  

как можно проекцию задать (самым простым способом) ?

---------------------
 // Установить данные о проекции растра  // 11/04/06
 // number - номер файла в цепочке
 // mapregister - адрес структуры
 // При ошибке возвращает ноль

function mapSetRstProjectionData(Map : HMap; number : integer;
 var MapReg : TMapRegisterEx) : integer;

-----------------
есть mapSetRstProjectionData - которая дает результат 0.




--------------------------

//top left
 frame.X1:=rec.x_max;
 frame.Y1:=rec.y_min;
   
 //bottom left
 frame.X2:=rec.x_min;
 frame.Y2:=rec.y_max;

   
 FillChar(arr_bmp, Sizeof(arr_bmp), 0);
 FillChar(arr_rsw, Sizeof(arr_rsw), 0);

       
 sFileName_dest:=ChangeFileExt(aFileName, '.Rsw');


 StrPLCopy(@arr_bmp, sBmpFileName,   Sizeof(arr_bmp));
 StrPLCopy(@arr_rsw, sFileName_dest, Sizeof(arr_rsw));
               

 k:=LoadBmpToRstByPlace (0,0,  @(arr_bmp), @(arr_rsw), 0, frame);
 
Для установки параметров проекции и системы координат растра используются функции, которые объявлены в файле rstapi.h:
Код
// Установить данные о проекции растра 
_MAPIMP  long int _MAPAPI mapSetRstProjectionData(HMAP hMap, int number, 
MAPREGISTEREX* mapregister); 

  // Установить параметры эллипсоида растра 
_MAPIMP long int _MAPAPI mapSetRstEllipsoidParam(HMAP hMap, long int number, 
const ELLIPSOIDPARAM *ellipsoidparam); 

  // Установить коэффициенты трансформирования геодезических координат растра 
_MAPIMP long int _MAPAPI mapSetRstDatumParam(HMAP hMap, long int number, 
const DATUMPARAM *datumparam);

Но перед вызовом данных функций необходимо верно заполнить структуры MAPREGISTEREX, ELLIPSOIDPARAM, DATUMPARAM параметрами проекции и системы координат.
Если указанные структуры заполнены неверно, то функции установки вернут 0.

Если известен для устанавливаемой проекции код EPSG, то логично для заполнения структур (MAPREGISTEREX, ELLIPSOIDPARAM, DATUMPARAM) воспользоваться функцией, объявленной в файле mapapi.h:
Код
  // Запросить параметры проекции и системы координат по коду 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);
 
Описание алгоритма получения полноценного растра из графического файла 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);


Код
  char * bmpName = "D:\\image.bmp";
  char * rswName = "D:\\raster.rsw";

  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)
          {
           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);
       }
    }
 
Функции всегда возвращают 0...

 iNumber:=LoadBmpToRstByPlace (0,0,  @(arr_bmp), @(arr_rsw), 0, frame);
//iNumber=1

 k:=mapGetParametersForEPSG (28402 + 2, @mapreg, @datum, @ellipsoid);
//k>0

 k:=mapSetRstProjectionData(0, iNumber, mapreg);    
//k=0

 k:=mapSetRstEllipsoidParam(0, iNumber, @ellipsoid);
//k=0

 k:=mapSetRstDatumParam(0, iNumber, @datum);
//k=0
 
Цитата
Алексей Азаренко пишет:
Функции всегда возвращают 0...
...
 k:=mapSetRstProjectionData(0, iNumber, mapreg);    
//k=0
 k:=mapSetRstEllipsoidParam(0, iNumber, @ellipsoid);
//k=0
 k:=mapSetRstDatumParam(0, iNumber, @datum);
//k=0

Все функции, требующие на вход идентификатор открытых данных (hMap) всегда вернут ноль, если этот идентификатор не задан.
iNumber - это номер в уже открытых данных, а их Вы не указываете.

HELP.GISINFO.RU

Код
  // Установить данные о проекции растра 
  // 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 mapSetRstEllipsoidParam(HMAP hMap, long int number,
const ELLIPSOIDPARAM *ellipsoidparam);
 
спасибо ! все получилось !
Страницы: 1
Читают тему (гостей: 1)



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

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