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

LoadTiffToRstConverter

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

Здравствуйте!

Прочел тему. Осталось непонятным, каким образом использовать функцию LoadTiffToRstConverter?

Есть ли какие-то требования к scale и precision? У меня программа падает внутри функции LoadTiffToRstConverter. В чем может быть причина?

Код такой:

   HINSTANCE libinst2;

   long int (WINAPI * LoadTiffToRstConverter)(HMAP, HMESSAGE,const char *,const char *,double, double);

   LoadTiffToRstConverter = (long int (WINAPI *)(HMAP, HMESSAGE,const char *,const char *,double, double)) mapLoadLibrary("gisu64picex.dll" , &libinst2, "LoadTiffToRstConverter");

   long int res = LoadTiffToRstConverter(NULL,NULL,filename.toLocal8Bit().data(),rswName.toLocal8Bit().data(),100000,0.2);

   mapFreeLibrary(libinst2);

 
Цитата

Здравствуйте!

Прочел тему. Осталось непонятным, каким образом использовать функцию LoadTiffToRstConverter?

Есть ли какие-то требования к scale и precision? У меня программа падает внутри функции LoadTiffToRstConverter. В чем может быть причина?

Код такой:

   HINSTANCE libinst2;

   long int (WINAPI * LoadTiffToRstConverter)(HMAP, HMESSAGE,const char *,const char *,double, double);

   LoadTiffToRstConverter = (long int (WINAPI *)(HMAP, HMESSAGE,const char *,const char *,double, double)) mapLoadLibrary("gisu64picex.dll" , &libinst2, "LoadTiffToRstConverter");

   long int res = LoadTiffToRstConverter(NULL,NULL,filename.toLocal8Bit().data(),rswName.toLocal8Bit().data(),100000,0.2);

   mapFreeLibrary(libinst2);


Здравствуйте, Дмитрий!

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

_PICIMP long int _PICAPI picexLoadTiffToRstAndCompressExUn(HMESSAGE handle,
                               const WCHAR * TiffName,
                               const WCHAR * RstName,
                               double* meterInPixelX, double* meterInPixelY,
                               DOUBLEPOINT *point,
                               int compression,
                               int flagIgnoreGeoTiff);


Если есть возможность, используйте диалог загрузки графического изображения в растровую карту
(библиотека gisu64rswg.dll, функция DialogLoadImageToRsw объявлена в файле \include\rswgtapi.h):
Код
 //========================================================================
 // Диалог загрузки графического изображения в растровую карту(RSW)
 // Обрабатываются файлы следующих форматов: BMP, JPEG, PCX, TIFF, GeoTIFF, PNG, GIF
 //    В качестве файлов привязки растрового изображения могут применяться следующие данные:
 //    - Файл настроек (*.ini),
 //    - Файл настроек Фотоплан (*.tpf),
 //    - Файл настроек Талка (*.pln),
 //    - Файл настроек MapInfo (*.tab),
 //    - Файл настроек (world file)(*.tfw;*.jgw;*.bpw;*.pcw;*.j2w;*.sdw;*.nfw;*.wld)
 //    - Файл OziExplorer (*.map)
 //
 //    hmap - карта,содержащая векторные(растровые, матричные) данные;
 //    lpszsource - указатель на имя исходного файла
 //    sizesource - размер памяти, выделенной по указателю lpszsource (не менее 260 байт)
 //    lpsztarget - указатель на имя выходного файла
 //    sizetarget - размер памяти, выделенной по указателю lpsztarget (не менее 260 байт)
 //    fileLocType- тип применяемого файла привязки растрового изображения
 //                 fileLocType может принимать следующие значения:
 //                 120 - (*.ini), 121 - Фотоплан (*.tpf), 122 - Талка (*.pln),
 //                 123 - world file(*.tfw;*.jgw;*.bpw;*.pcw;*.j2w;*.sdw;*.nfw;*.wld),
 //                 124 - MapInfo (*.tab), 125 - OziExplorer (*.map).
 //    parm       - параметры прикладной задачи. Структура TASKPARM описана в MAPTYPE.H
 //
 //    При ошибке возвращает ноль
 //========================================================================
_RSWGIMP long int _RSWGAPI DialogLoadImageToRsw(HMAP hmap,
                                             char* lpszsource, long int sizesource,
                                             char* lpsztarget, long int sizetarget,
                                             long int fileLocType, TASKPARM *parm);

_RSWGIMP long int _RSWGAPI DialogLoadImageToRswUn(HMAP hmap,
                                             WCHAR* lpszsource, long int sizesource,
                                             WCHAR* lpsztarget, long int sizetarget,
                                             long int fileLocType, TASKPARM *parm);

 
 
Тогда вопрос по функции picexLoadTiffToRstAndCompressEx:

meterInElementX, meterInElementY, point - это входные или выходные данные?  
 

На тех данных, которые я сегодня отправлял на Вашу почту, программа падает внутри функции picexLoadTiffToRstAndCompressEx.

 
Цитата
На тех данных, которые я сегодня отправлял на Вашу почту, программа падает внутри функции picexLoadTiffToRstAndCompressEx.
Для импорта данного файла TIFF применяется библиотека GDAL.
Перед использованием функции picexLoadTiffToRstAndCompressEx необходимо вызвать функцию picexInitGdal. Соответственно, после окончания - picexCloseGdal.
Ниже привожу текст консольного приложения, которое работает на Ваших данных(t.tif) без ошибок.
Для тестирования применялись библиотеки GTK-12 x64 от 25.07.2019.
Код
#pragma hdrstop
#pragma argsused

#ifdef _WIN32
#include <tchar.h>
#else
  typedef char _TCHAR;
  #define _tmain main
#endif

#include <stdio.h>

#include "maptype.h"
#include "maplib.h"

 int _tmain(int argc, _TCHAR* argv[])
{
  typedef long int (WINAPI * F_picexLoadTiffToRstAndCompressEx)(HMESSAGE handle,
                               const char * TiffName,
                               const char * RstName,
                               double* meterInPixelX, double* meterInPixelY,
                               DOUBLEPOINT *point,
                               int compression,
                               int flagIgnoreGeoTiff);

  // Начать работу с Gdal
  typedef long int (WINAPI * F_picexInitGdal)();
  // Закончить работу с Gdal
  typedef long int (WINAPI * F_picexCloseGdal)();


 HINSTANCE libinst = LoadLibrary(L"GISU64PICEX.DLL");
 if (libinst == 0)
   {
    MessageBoxA(0, "Библиотека не найдена", "GISU64PICEX.DLL", MB_OK|MB_TASKMODAL);
    return 0;
   }

 F_picexLoadTiffToRstAndCompressEx lpfn_picexLoadTiffToRstAndCompressEx =
         (F_picexLoadTiffToRstAndCompressEx)GetProcAddress(libinst,"picexLoadTiffToRstAndCompressEx");

 F_picexInitGdal lpfn_picexInitGdal   = (F_picexInitGdal) GetProcAddress(libinst,"picexInitGdal");
 F_picexCloseGdal lpfn_picexCloseGdal = (F_picexCloseGdal)GetProcAddress(libinst,"picexCloseGdal");

  if (lpfn_picexInitGdal != 0)
     (*lpfn_picexInitGdal)();

 int ret = 0;
 if (lpfn_picexLoadTiffToRstAndCompressEx != 0)
    {
     HMESSAGE handle       = 0;
     char TiffName[MAX_PATH] = {0};
     char RstName [MAX_PATH] = {0};
     double* meterInPixelX = 0;
     double* meterInPixelY = 0;
     DOUBLEPOINT *point    = 0;
     int compression       = 0;
     int flagIgnoreGeoTiff = 0;

     StrCopy(TiffName, "d:\\Data_2\\t.tif", sizeof(TiffName));
     StrCopy(RstName,  "d:\\Data_2\\t.rsw", sizeof(RstName));

     ret = (*lpfn_picexLoadTiffToRstAndCompressEx)(handle,
                               TiffName,
                               RstName,
                               meterInPixelX, meterInPixelY,
                               point,
                               compression,
                               flagIgnoreGeoTiff);
    }

  if (lpfn_picexCloseGdal != 0)
     (*lpfn_picexCloseGdal)();

  // Выгрузка библиотеки
  if (libinst)  FreeLibrary(libinst);

  if (ret != 0)
    {
     MessageBoxA(0, "Корректное выполнение функции", "picexLoadTiffToRstAndCompressEx", MB_OK|MB_TASKMODAL);
    }
   else
    {
     MessageBoxA(0, "Ошибка выполнения функции", "picexLoadTiffToRstAndCompressEx", MB_OK|MB_TASKMODAL);
    }

  return 0;
}

Цитата
meterInElementX, meterInElementY, point - это входные или выходные данные?  
meterInElementX, meterInElementY, point - входные параметры функции. Если нет необходимости передавать в функцию указанные параметры, передайте в качестве указателей NULL.
 

Здравствуйте, Дмитрий!

Работа функции LoadTiffToRstAndCompressEx нестабильна. На tif-файлах большего размера падения случаются чаще. Попробуйте вот такой код с t.tif:

Код
#pragma hdrstop
#pragma argsused


#ifdef _WIN32
#include <tchar.h>
#else
  typedef char _TCHAR;
  #define _tmain main
#endif


#include <stdio.h>
#include <iostream>


#include "maptype.h"
#include "maplib.h"


using namespace std;


int test(int i)
{
  typedef long int (WINAPI * F_picexLoadTiffToRstAndCompressEx)(HMESSAGE handle,
                               const char * TiffName,
                               const char * RstName,
                               double* meterInPixelX, double* meterInPixelY,
                               DOUBLEPOINT *point,
                               int compression,
                               int flagIgnoreGeoTiff);


  // Начать работу с Gdal
  typedef long int (WINAPI * F_picexInitGdal)();
  // Закончить работу с Gdal
  typedef long int (WINAPI * F_picexCloseGdal)();




 HINSTANCE libinst = LoadLibrary(L"GISU64PICEX.DLL");
 if (libinst == 0)
   {
    cout <<"Библиотека не найдена GISU64PICEX.DLL";
    return 0;
   }


 F_picexLoadTiffToRstAndCompressEx lpfn_picexLoadTiffToRstAndCompressEx =
         (F_picexLoadTiffToRstAndCompressEx)GetProcAddress(libinst,"picexLoadTiffToRstAndCompressEx");


 F_picexInitGdal lpfn_picexInitGdal   = (F_picexInitGdal) GetProcAddress(libinst,"picexInitGdal");
 F_picexCloseGdal lpfn_picexCloseGdal = (F_picexCloseGdal)GetProcAddress(libinst,"picexCloseGdal");


  if (lpfn_picexInitGdal != 0)
     (*lpfn_picexInitGdal)();


 int ret = 0;
 if (lpfn_picexLoadTiffToRstAndCompressEx != 0)
    {
     HMESSAGE handle       = 0;
     char TiffName[MAX_PATH] = {0};
     char RstName [MAX_PATH] = {0};
     double* meterInPixelX = 0;
     double* meterInPixelY = 0;
     DOUBLEPOINT *point    = 0;
     int compression       = 0;
     int flagIgnoreGeoTiff = 0;


     StrCopy(TiffName, "d:\\test\\t.tif", sizeof(TiffName));
     sprintf (RstName, "d:\\test\\t%d.rsw", i);


     ret = (*lpfn_picexLoadTiffToRstAndCompressEx)(handle,
                               TiffName,
                               RstName,
                               meterInPixelX, meterInPixelY,
                               point,
                               compression,
                               flagIgnoreGeoTiff);
    }


  if (lpfn_picexCloseGdal != 0)
     (*lpfn_picexCloseGdal)();


  // Выгрузка библиотеки
  if (libinst)  FreeLibrary(libinst);


  cout <<i <<"ret=" << ret << endl;


  return 0;
}


int main(int argc, char** val){
    for(int i=0;i<100;i++)
        test(i);
    cout <<"end" ;
    return 0;
}
 
Выше Ваш код, работающий в цикле. Запустите его и увидите ошибку.
Страницы: Пред. 1 2
Читают тему (гостей: 1)



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

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