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

Конвертация карты в формате s57 3.1 в формат map

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

Добрый день. Есть ли возможность с помощью Гис оператора или средствами программирования конвертировать карту в формате s57 редакция 3.1. в формат map? Каталог содержит как основную карту, так и несколько каталогов с корректурами, вместо CATALOG.030 в нем CATALOG.031. Если отдельно конвертировать основную карту, то есть файл с расширением .000, то получается. Это и Гис оператор может, и пример в Гис designer работает. Как быть с корректурой? Можно даже извернуться, переименовать корректуры в файлы с расширением .000, и тоже конвертировать, получится много кусочков. На форуме еще в 2013 году кто-то задавал подобный вопрос, можно ли конвертировать карту с корректировками. Появилась ли такая возможность? У вас прилагается пример морской карты одностраничной, формата s57 версии 3.0

 
Цитата
Елена написал:
Добрый день. Есть ли возможность с помощью Гис оператора или средствами программирования конвертировать карту в формате s57 редакция 3.1. в формат map? Каталог содержит как основную карту, так и несколько каталогов с корректурами, вместо CATALOG.030 в нем CATALOG.031. Если отдельно конвертировать основную карту, то есть файл с расширением .000, то получается. Это и Гис оператор может, и пример в Гис designer работает. Как быть с корректурой? Можно даже извернуться, переименовать корректуры в файлы с расширением .000, и тоже конвертировать, получится много кусочков. На форуме еще в 2013 году кто-то задавал подобный вопрос, можно ли конвертировать карту с корректировками. Появилась ли такая возможность? У вас прилагается пример морской карты одностраничной, формата s57 версии 3.0
Добрый день! В настоящее время файлы корректуры не обрабатываются.
 
Подскажите, пожалуйста, есть ли возможность слить кусочки карт в одну, в один файл. Не открывать последовательно слои, а именно слить в один файл
 
Цитата
Елена написал:
Подскажите, пожалуйста, есть ли возможность слить кусочки карт в одну, в один файл. Не открывать последовательно слои, а именно слить в один файл
В программе ГИС Панорама есть задача - "Обработка листов карт и генерализация - Объединение данных".

В программе ГИС Оператор  можно выполнить копирование с одной карты на другую.
 
Добрый день. С помощью ГИС Оператора получилось копирование с одной карты на другую. Елена, возвращаюсь к теме автоматической конвертации из S57 в MAP. Промучились с процедурой конвертации без вызова диалога vecLoadS57ToMapUn, помогите. Если call-back функцию установить 0, то функция vecLoadS57ToMapUn выдала код 1, но конвертация не прошла. Попытались написать call-back функцию, программа проработала, функция vecLoadS57ToMapUn выдала код 1, конвертация не прошла. Листинг вывода ниже.   В качестве примера взяли вашу карту.   Помогите, пожалуйста, заранее спасибо.

mainform1.cpp:

#include <qmessagebox.h>

#include <qtextcodec.h>

#include <QResizeEvent>

#include "mainform1.h"

#include "qdmcmp.h"

#include "s57api.h"

#include "mapapi.h"

#include "vecexapi.h"

#include <QDebug>

MainForm1::MainForm1(QWidget *parent, const char *name, Qt::WindowFlags fl)

{

   QTextCodec *codec = QTextCodec::codecForName("KOI8-R");

   ui.setupUi(this);

   FileOpenAction_activated();

}

MainForm1::~MainForm1()

{

}

void MainForm1::FileOpenAction_activated()

{

   QString s57name="/home/user/Seamap/CA39995I.000";

   QString rscname="/home/user/Seamap/S57NAVY.RSC";

   QString regionname="Какой-то регион";

   long int safelystate=1000;

   QString mapname="/home/user/Seamap/CA39995I.sit";

   long int size=1000;

//    QString dstPath(mapname);

//    WCHAR dst[ 1000 ];

//    memcpy( dst, dstPath.utf16(), dstPath.size() * sizeof( WCHAR ) );

//    dst[ dstPath.size() ] = 0;

   wchar_t dst[ mapname.length() + 1 ];

   int i=mapname.toWCharArray( dst );

   dst[ mapname.length() ] = 0;

   qDebug()<< Q_FUNC_INFO << "ress= "<<vecLoadS57ToMapUn((HMESSAGE)MessageHandler_LoadSxf,

                        s57name.utf16(),

                        //dst,

                        (WCHAR*)dst,

                        size,

                        rscname.utf16(),

                        regionname.utf16(),

                        safelystate);

}

long int MessageHandler_LoadSxf(HWND hwnd, long int type, WPARAM value, LPARAM lp)

{

   int CancelProcess = 0;

    switch(type)

   {

      case WM_ERRORCOORD       : qDebug()<<"ERRORCOORD"; break;

      case WM_INFOLIST         :

       {

       qDebug()<<"INFOLIST";

       qDebug() << Q_FUNC_INFO << "type = " << type << "sheets count = " <<value << "sheet number = "<<lp;

       INFOLIST InfoList = *(INFOLIST *)lp;

       QString Nomenclature;

       qDebug()<<"infolist: "<< "Nomenclature" << QString(InfoList.Nomenclature) <<InfoList.Nomenclature<< "InfoList.Scale" <<InfoList.Scale

              <<"InfoList.CountObject" <<InfoList.CountObject<<Nomenclature;

       return (LRESULT)CancelProcess;

       break;

       }

       case WM_OBJECT           : qDebug()<<"OBJ"; break;

       case WM_LIST             : {

       qDebug()<<"LIST";

       qDebug() << Q_FUNC_INFO << "type = " << type << "sheets count = " <<value << "sheet number = "<<lp;

       return (LRESULT)CancelProcess;

       break;

       }

      case WM_ERROR                                      : qDebug()<<"ERROR"; break;

      case WM_MAP                                         : qDebug()<<"MAP"; break;

      case WM_ERRORSXF                              : qDebug()<<"WM_ERRORSXF"; break;

      case WM_PROGRESSBAR                     : qDebug()<<"WM_PROGRESSBAR"; break;

      case WM_MAPEVENT                            : qDebug()<<"WM_MAPEVENT"; break;

      case WM_PROGRESSBARUN              : qDebug()<<"WM_PROGRESSBARUN"; break;

      case WM_PROGRESSICON                    : qDebug()<<"WM_PROGRESSICON"; break;

      default:

              qDebug()<<"AAAA";

              break;

   }

   return type;

}

mainform1.h:

#include "./.ui/ui_form1.h"

#include <QResizeEvent>

#include "mapsyst.h"

long int MessageHandler_LoadSxf(HWND hwnd, long int type, WPARAM value,LPARAM lp);

class MainForm1 : public QMainWindow

{

   Q_OBJECT

public :

  MainForm1(QWidget *parent = 0, const char *name = 0,

            Qt::WindowFlags fl = 0);//Qt::WType_TopLevel);

  ~MainForm1();

public slots:

   void FileOpenAction_activated();

public :

   Ui::MainWindow ui;

};

====== ВЫВОД ПРОГРАММЫ ===============================================

LIST

long int MessageHandler_LoadSxf(long unsigned int, long int, WPARAM, LPARAM) type =  1414 sheats count =  0 sheat number =  1

INFOLIST

long int MessageHandler_LoadSxf(long unsigned int, long int, WPARAM, LPARAM) type =  1412 sheats count =  0 sheat number =  140730776985728

infolist :  Nomenclature "/" / InfoList.Scale 0 InfoList.CountObject 0 ""

LIST

long int MessageHandler_LoadSxf(long unsigned int, long int, WPARAM, LPARAM) type =  1414 sheats count =  1 sheat number =  1

void MainForm1::FileOpenAction_activated() ress=  1

======================================

s57example.pro:

SOURCES += main.cpp mainform1.cpp

HEADERS += mainform1.h

unix {

 UI_DIR = .ui

 MOC_DIR = .moc

 OBJECTS_DIR = .obj

}

VERSION=1.0

DESTDIR=.

TARGET  = s57example

FORMS = form1.ui

TEMPLATE =app

CONFIG += qt warn_on release

QT += gui

unix:INCLUDEPATH += /usr/include/gisdesigner

#unix:LIBS += -lqdmapacces -lmapcomponents -lqds57tomap -lqds57setup -ldl

unix:LIBS += -lqdmapacces -lmapcomponents -lqdobjnet -lqdlocalizations -lqds57tomap -lqds57setup -lqdmapqtfrm -lqdmapmtrex -lqdmapvecex -lqdmapmath -ldl

LANGUAGE = C++

greaterThan(QT_MAJOR_VERSION, 4) {

QT +=  widgets

}

Изменено: Елена - 22.12.2021 10:46:41
 
Код
 // Импорт из формата S57 в формат MAP или SIT (без вызова диалога)
 // handle  - идентификатор окна диалога, которому посылаются уведомительные
 //           сообщения WM_OBJECT и WM_ERROR (HWND для Windows, CALLBACK-Функция для Linux) или 0
 // s57name - полный путь к файлу формата S57 (*.000 или *.030)
 // mapname - полный путь к файлу создаваемой карты
 // size    - размер буфера имени создаваемой карты, если имя может быть изменено в функции
 // rscname - полное имя файла классификатора (s57navy.rsc)
 // regionname - условное название создаваемой карты ("Море Лаптевых" и т.п.)
 // safelystate - флаг создания границ зон безопасности (длительный процесс оверлейного анализа данных)
 // При ошибке в параметрах возвращает ноль

_VECIMP long int _VECAPI vecLoadS57ToMapUn(HMESSAGE handle, const WCHAR * s57name, WCHAR * mapname, long int size, const WCHAR * rscname,
                                           const WCHAR * regionname, long int safelystate);
Функция vecLoadS57ToMapUn выполняет импорт из формата S57 в формат MAP/SITX/SIT ГИС Панорама/Оператор.

Если нужен экспорт в формат S57, то применяется другая функция:
Код
 // Экспорт карты в формата S57 из формата MAP или SIT для карт, которые были ранее импортированы из S57
 // Экспорт в S57 выполняется только из главной карты (hsite = hmap), каждый лист карты сохраняется
 // в отдельный набор
 // handle  - идентификатор окна диалога, которому посылаются уведомительные
 //           сообщения (HWND для Windows, CALLBACK-Функция для Linux)
 // hmap    - идентификатор открытого документа, содержащего векторную карту
 // hselect - условия отбора листов карты, которые будут сохранены в S57 
 // hdepth  - условия отбора отметок глубин (обычно все точечные объекты с кодом 129)
 // s57name - полное имя файла формата S57 (*.030 или *.000)
 // При ошибке в параметрах возвращает ноль

_VECIMP long int _VECAPI vecSaveMapToS57Un(HMESSAGE handle, HMAP hmap, HSELECT hselect, HSELECT hdepth, const WCHAR * s57name);
 
Мы и используем первую из указанных вами функций и просим помочь разобраться, почему не работает.  
 

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

В приведенном Вами коде вызова функции vecLoadS57ToMapUn неверно указан 3-й параметр. Попробуйте изменить Ваш код на такой вариант:

Код
//wchar_t dst[ mapname.length() + 1 ];
//int i=mapname.toWCharArray( dst );
//dst[ mapname.length() ] = 0;


WCHAR dst[MAX_PATH_LONG]; dst[0] = 0;
WcsCopy(dst, mapname.utf16(), sizeof(dst));


int ret = vecLoadS57ToMapUn(0,
                            s57name.utf16(),
                            dst,
                            sizeof(dst),
                            rscname.utf16(),
                            regionname.utf16(),
                            safelystate);
 
Добрый день, Эдуард. Спасибо, изменила как вы советуете, стало зависать.
dst  в отладчике при входе в процедуру vecLoadS57ToMapUn выглядел   -   "/home/user/Seamap/CA39995I.sit\000\000\005\000\000\000\000\000\000\000\000\000\000\000&­#4952;\173775翿\000\157660\177777"... (2048) WCHAR[1024]
 
Она не зависает. Просто на отработку функции требуется время. Путь в переменной dst корректный. Попробуйте установить последний параметр safelystate равным 0. При значении, отличном от нуля, время обработки может увеличиться (у Вас был установлен равным 1000).
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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