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

mapEditWms

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1
RSS
mapEditWms
 
При использовании диалога для подключения сервисов WMS возникает ошибка.

ПО: ГИС Конструктор для Qt Designer x64 (версия 12.5.0, Qt 4, Qt 5, платформа x64, ОС "Astra Linux Special Edition 1.4", релиз "Смоленск")
Код:
mapSetPathShell("/usr/share/gisapplication");

TASKPARMEX parm;
memset((void *)&parm, 0, sizeof(TASKPARMEX));
parm.Language  = ML_RUSSIAN;
parm.Handle = (MSGHANDLER)(&ui->MapView1);
parm.DocHandle = (HWND)ui->MapView1->GetMapHandle();

char wmsstring[4096] = {0};
HMAP hmap =0;
if(mapEditWms(&parm, wmsstring, 4096, 0))
{
   hmap = mapOpenData(wmsstring);
}

Диалог подключения открывается, но после заполнения обязательных параметров и нажатия кнопки "Подключиться" в диалоге программа завершается с ошибкой.
Подскажите пожалуйста в чем может быть проблема.
 
Код
typedef long int (* MSGHANDLER)
   (long int hwnd, long int code, long int p1, long int p2, long int typemsg);

MapView1 - это метод с такой сигнатурой ?

У Вас же там куча предупреждений от компилятора должна была быть.
Изменено: Владимир Егоров - 13.06.2019 23:56:45
 
MapView1 - это экземпляр компонента QDMapView, который содержит метод MessageHandler с указанной сигнатурой.
Предупреждений от компилятора не было, диалог для подключения сервисов WMS даже пару раз отработал без ошибок.
Но проблема, наверное, действительно в этой строке, при изменении её на:

parm.Handle = (MSGHANDLER)(&ui->MapView1->MessageHandler);

возникает ошибка в компиляторе:
ISO C++ forbids taking the address of a bound member function to form a pointer to member function. Say '&QDMapView::MessageHandler'

При изменении строки на:

parm.Handle = (MSGHANDLER)(&QDMapView::MessageHandler);

ошибки от компилятора не возникает, диалог подключения открывается и после заполнения обязательных  параметров и нажатия кнопки "Подключиться" в диалоге программа опять  завершается с ошибкой. Если указанную строку вообще убрать ситуация аналогичная.
 
Метод MessageHandler статический?

Я бы вообще TASKPARMEX нулями забил, и всё.

И ещё, судя по описанию, docHandle больше похоже на ui->MapView1 (QWidget???), чем на HMAP.
Код
#ifdef WIN32API

  HWND        Handle;          // Идентификатор главного окна приложения

#else

  MSGHANDLER  Handle;          // Идентификатор обработчика команд главного окна приложения

#endif

  HWND        DocHandle;       // Идентификатор окна карты (документа)

  long int    StayOnTop;       // Признак выставления форме свойтсва StayOnTop  // 14/05/05

Эти поля и сама структура видимо изначально вообще для WINDOWS делались.
Тот  же MSGHANDLER используется под Linux вместо окна, которому события посылаются (как CallBack функция) .
Она у нас как правило static long onMsg(...){..}

Но я вероятно не прав, так как с TASKPARMEX не работал.

Но если натравить поиск на TASKPARMEX по компонентам для gisdesigner (QDMapVIew и прочие QD*) или примерам из пакета, то может быть там найдутся примеры как этой структурой пользоваться.

А может дело вообще не в этом (не в TASKPARMEX).
 
Здравствуйте!

Проблему воспроизвели и исправили - изменения войдут в следующую версию ГИС Конструктор (планируется к выпуску к концу этого месяца).
На данный момент формирование строки можно выполнить вручную.

Например, строка подключения к геопорталу "Google Спутник" имеет следующий вид:
Код
WMTS#Type=UTMS&IP=http://khms0.google.com/kh/v=821&src=app&s=&ID1=GoogleSat&Name1=Google Спутник&Projection=GoogleMapsCompatible
Здесь параметры строки имеют следующие значения:

IP – URL адрес строки подключения к геопорталу.
ID1 – идентификатор слоя на геопортале (должен быть уникален), может задаваться
вручную.
Name1 – имя слоя на геопортале, может задаваться вручную.
Projection или Matrix – код проекции геопортала или тип матрицы.
ApiKey – ключ доступа к геопорталу.
Autent – параметры авторизации пользователя на геопортале (Basic имя пользователя:пароль
в кодировке BASE64).

Тип данных геопорталов:
WMS# – картинка.
WMTS# – тайлы.

Дополнительный параметр Type:
UTMS -формат данных при получении использует свой нестандартный алгоритм.
NOCAP – при подключении к геопорталу запрос GetCapabilities игнорируется.
TMS – при запросе GetCapabilities данные выдаются по стандарту подключения TMS.
TMSGEO – размер картинок у гепопортала не может превышать 256 на 256 пикселей и
данные запрашиваются по стандарту WMS.

Описание процесса ручного формирования строки подключения к геопорталу также внесем в Руководство программиста ГИС Конструктор.
 
Владимир, Александр, спасибо.
В исходных кодах компонента QDMapGisServer (qdmgsrv.h, qdmgsrv.cpp) действительно есть пример как можно указать обработчик MessageHandler, но такой способ в текущей версии ГИС Конструктор всё равно приводит к ошибке при нажатии кнопки "Подключиться" в диалоге.
 
Здравствуйте!

Мы исправили внутреннюю ошибку, не связанную с обработкой параметра Handle. Поэтому, думаю, что некорректное поведение не зависит от его заполнения.
Если Вы пришлете пример заполнения значения этого параметра, мы можем посмотреть его на корректность.
 
Александр, я использовал следующий код:
Код
mapwms.h
--------

#include "qdmcmp.h"

class MapWMS : public QDMapComponent
{

public  :
    MapWMS(QWidget * parent = 0, const char * name = 0);
    ~MapWMS();

    void SetMapView(QDMapView *value);
    QDMapView    *GetMapView() const;
    void         openWMSDialog();
}

mapwms.cpp
--------

#include "mapwms.h"
#include "wmsapi.h"

QDMapView *MapWMS::GetMapView() const
{
  return (QDMapView *)VarMapView;
}

void MapWMS::SetMapView(QDMapView *value)
{
  SetMapViewAcces(value);
}

// Главный обработчик сообщений
long int MessageHandler(long int mapViewWindow, long int code,
                        long int wp, long int lp, long int typemsg = 0);  // qdmwina.cpp

void MapWMS::openWMSDialog()
{
  QDMapView *mapView;
  mapView = GetMapView();
  mapSetPathShell("/usr/appwms/");

  TASKPARMEX parm;
  memset((void *)&parm, 0, sizeof(TASKPARMEX));
  parm.Language  = ML_RUSSIAN;
  parm.Handle = &MessageHandler;
  parm.DocHandle = (HWND)mapView;

  char wmsstring[4096] = {0};
  if(mapEditWms(&parm, wmsstring, 4096, 0))
  {
    mapView->SetMapFileName(wmsstring);
    mapView->SetMapActive(TRUE);
    mapView->SetMapVisible(TRUE);
  }
}
 
Здравствуйте!

В целом все заполнено корректно за исключением поля parm.Handle: туда необходимо просто передать тип MessageHandler (без получения адреса):
Код
parm.Handle = MessageHandler;
Исправление, внесенное нами, не связано с обработкой параметра parm.Handle - войдет в следующую версию ГИС Конструктор. Сейчас предлагаем использовать ручное формирование строки подключения (описано в сообщении выше). Спасибо!
 
Здравствуйте!

На сайте доступна новая версия ГИС Конструктор для Astra Linux SE  c внесенными исправлениями.

Спасибо!

Страницы: 1
Читают тему (гостей: 1)



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

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