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

Проблема с mapSelectSemanticAppend

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 След.
RSS
Проблема с mapSelectSemanticAppend
 
Я хочу вкл/выкл объекты с определенной семантикой, например если значение семантики номер 999 равно 0 - объект не отображается, если 1 - отображается

   

   

                           
Код
HMAP hMap = ui.DMapView1->GetMapHandle();
mapSetSiteTransparent(hMap, hMap, 60);
HSITE hSite = mapCreateAndAppendTempSite(hMap, 0);
HSELECT hSelect = mapCreateSiteSelectContext(hMap, hSite);
mapSelectSemanticAppend(hSelect, CMEQUAL, 999, "1");
mapSetSiteViewSelect(hMap, hSite, hSelect);

HOBJ hObj2 = mapCreateSiteObject(hMap, hSite, IDDOUBLE2, 0);
mapRegisterDrawObject(hObj2, 0, LOCAL_LINE);

IMGLINE lineParm;
memset(&lineParm, 0, sizeof(IMGLINE));
lineParm.Color = RGB(255, 0, 0);
lineParm.Thick = PIX2MKM(10);
mapAppendDraw(hObj2, IMG_LINE, reinterpret_cast<const char *>(&lineParm));

mapAppendSemantic(hObj2, 999, "1", 1);
mapAppendPointPlane(hObj2, 6160324, 7417928);
mapAppendPointPlane(hObj2, 6160324 + 2000, 7417928 + 2000);

mapCommitObject(hObj2);
На убунту данный код приводит к тому, что на карте появляется красная линия. А если написать mapAppendSemantic(hObj2, 999, "0", 1); она исчезает.
На astra linux 1.5 линия не отображается при любых значениях семантики 999. Версия гис конструктора - от 17.08.2017 из раздела скачать.
Изменено: Дмитрий - 29.11.2017 10:54:43
 
Здравствуйте!

Возможно, Ваш объект не отображался, потому что не был установлен признак отбора графических объектов. После вызова функции mapCreateSiteSelectContext попробуйте добавить следующие строки:

Код
mapClearSelectContext(hSelect);
mapSetDrawObjectsFlag(hSelect, 1);
 
Да, это помогло, спасибо.
 
Приветствую!

А с чем связано, если не секрет, то что по умолчанию, после создания контекста поиска\отображения mapGetDrawObjectsFlag(hSelect) возвращает 2 (т.е. игнорируются графические объекты)?

Кроме указаной тут проблемы возникла связанная с ней:
При использовании метода mapSeekSelectObject для поиска объектов карты (использую его при поиске по прямоугольной области размерами более 512x512) графические объекты не находятся, даже в случае если для контекста поиска установлен признак отбора  графических объектов 0 или 1.
При установке mapSetDrawObjectsFlag(hSelect, 1), mapSeekSelectObject продолжает искать только НЕ графические объекты.

С уважением,
Матвеев П.В.
 
Приветствую!
Пример для воспроизведения проблемы поиска графических объектов:
Код
#include <QString>
#include <QDebug>
#include "mapapi.h"
#include "sitapi.h"
#include "seekapi.h"
#include "rscapi.h"
#include "mapcreat.h"
#include "maptype.h"

HOBJ createPolygonObject(HMAP hmap, RECT* rect, int bgColor, int fgColor) {
   HOBJ hobj = mapCreateObject(hmap, IDDOUBLE2, 0);
   if (hobj != 0) {
      if (mapRegisterDrawObject(hobj, 0, LOCAL_SQUARE) != 0) {
         IMGPOLYGONGLASS fill;
         memset((void*) &fill, 0, sizeof(fill));
         fill.Color = bgColor;
         fill.Transparency = 100;
         mapAppendDraw(hobj, IMG_POLYGONGLASS, (const char*) &fill);
         IMGLINE border;
         memset((void*) &border, 0, sizeof(border));
         border.Color = fgColor;
         border.Thick = PIX2MKM(2);
         mapAppendDraw(hobj, IMG_LINE, (const char*) &border);
         double x1 = rect->left;
         double y1 = rect->top;
         double x2 = rect->right;
         double y2 = rect->bottom;
         mapPictureToPlane(hmap, &x1, &y1);
         mapPictureToPlane(hmap, &x2, &y2);
         mapAppendPointPlane(hobj, x1, y1, 0);
         mapAppendPointPlane(hobj, x2, y1, 0);
         mapAppendPointPlane(hobj, x2, y2, 0);
         mapAppendPointPlane(hobj, x1, y2, 0);
         mapAppendPointPlane(hobj, x1, y1, 0);
         mapCommitObject(hobj);
      } else {
         qDebug() << "mapRegisterDrawObject error";
      }
   } else {
      qDebug() << "mapCreateObject error";
   }
   return hobj;
}

HOBJ createLineObject(HMAP hmap, RECT* rect, int fgColor) {
   HOBJ hobj = mapCreateObject(hmap, IDDOUBLE2, 0);
   if (hobj != 0) {
      if (mapRegisterDrawObject(hobj, 0, LOCAL_LINE) != 0) {
         IMGLINE border;
         memset((void*) &border, 0, sizeof(border));
         border.Color = fgColor;
         border.Thick = PIX2MKM(2);
         mapAppendDraw(hobj, IMG_LINE, (const char*) &border);
         double x1 = rect->left;
         double y1 = rect->top;
         double x2 = rect->right;
         double y2 = rect->bottom;
         mapPictureToPlane(hmap, &x1, &y1);
         mapPictureToPlane(hmap, &x2, &y2);
         mapAppendPointPlane(hobj, x1, y1, 0);
         mapAppendPointPlane(hobj, x2, y1, 0);
         mapAppendPointPlane(hobj, x2, y2, 0);
         mapAppendPointPlane(hobj, x1, y2, 0);
         mapAppendPointPlane(hobj, x1, y1, 0);
         mapCommitObject(hobj);
      } else {
         qDebug() << "mapRegisterDrawObject error";
      }
   } else {
      qDebug() << "mapCreateObject error";
   }
   return hobj;
}
HOBJ createObjectByKey(HMAP hmap, const char * key, int x, int y) {
   HOBJ hobj = mapCreateObject(hmap, IDDOUBLE2, 0);
   double x1 = x;
   double y1 = y;
   mapPictureToPlane(hmap, &x1, &y1);
   if (hobj != 0) {
      if (mapRegisterObjectByKey(hobj, key) != 0) {
         mapAppendPointPlane(hobj, x1, y1, 0);
         mapCommitObject(hobj);
      } else {
         qDebug() << "mapRegisterObjectByKey error";
      }
   } else {
      qDebug() << "mapCreateObject error";
   }
   return hobj;
}
//создает карту с объектами для проведения теста
HMAP createMapForTest(QString* aName, QString* aClassifierName) {
   CREATESITEUN cs;
   memset((void*) &cs, 0, sizeof(cs));
   cs.Length = sizeof(CREATESITEUN);
   cs.EllipsoideKind = 9;
   cs.MapType = 16;
   cs.Reserve = 0;
   HMAP hmap = mapCreateSiteUn((const WCHAR*) aName->constData(),
         (const WCHAR*) aClassifierName->constData(), &cs);
   if (hmap != 0) {
      mapSetRealShowScale(hmap, 200000.);

      //создадим рамку
      RECT borderRect;
      borderRect.left = 0;
      borderRect.top = 0;
      borderRect.right = 2000;
      borderRect.bottom = 2000;
      createLineObject(hmap, &borderRect, 0x00FF00);

      //прямоугольники - примитивы
      int w = 30;
      int h = 30;
      for (int i = 0; i < 3; i++) {
         RECT rect1;
         rect1.left = 900 + (i * 100);
         rect1.top = 1000;
         rect1.right = rect1.left + w;
         rect1.bottom = rect1.top + h;
         HOBJ hobj = createPolygonObject(hmap, &rect1, 0x00FFFF,
               0xFF << (8 * i));
         mapFreeObject(hobj);
      }

      //и какой-нибудь знак из классификатора
      createObjectByKey(hmap, "009991001040", 1000, 1000);
   } else {
      qDebug() << "mapCreateSiteUn error";
   }
   return hmap;
}

// тест поиска объектов
int main(int argc, char ** argv) {
   QString* siteName = new QString("/home/user/temp/testSearchByFrame.sitx");
   QString* rscName = new QString("/home/user/temp/operator.rsc");
   HMAP hmap = createMapForTest(siteName, rscName);
   if (hmap != 0) {
      mapCloseMap(hmap);
   } else {
      qDebug() << "createMapForTest error";
   }

   //переоткрываем карту
   hmap = mapOpenAnyData((const WCHAR*) siteName->constData());
   if (hmap != 0) {
      mapSetRealShowScale(hmap, 200000.);
      qDebug() << "map real object count: " << mapGetRealObjectCount(hmap, 1);

      //ищем объекты без установки области поиска
      HSELECT hselect = mapCreateSiteSelectContext(hmap, hmap);
      mapSetDrawObjectsFlag(hselect, 1);
      HOBJ result = mapCreateSiteObject(hmap, hmap, IDDOUBLE2, 0L);
      long rc = mapSeekSelectObject(hmap, result, hselect, WO_FIRST);
      int count = 0;
      while (rc) {
         count++;
         rc = mapSeekSelectObject(hmap, result, hselect, WO_NEXT);
      }
      qDebug() << "search result count: " << count;
      mapFreeObject(result);
      mapDeleteSelectContext(hselect);

      //ищем объекты по области равной габаритам карты
      DFRAME frame;
      mapGetTotalBorder(hmap, &frame, PP_PLANE);

      hselect = mapCreateSiteSelectContext(hmap, hmap);
      mapSetDrawObjectsFlag(hselect, 1);
      mapSelectSeekAreaFrame(hselect, &frame, 0, 0,
                              SO_SEEKINSIDEANDCROSS, 1, 0);
      result = mapCreateSiteObject(hmap, hmap, IDDOUBLE2, 0L);
      rc = mapSeekSelectObject(hmap, result, hselect, WO_FIRST);
      count = 0;
      while (rc) {
         count++;
         rc = mapSeekSelectObject(hmap, result, hselect, WO_NEXT);
      }
      qDebug() << "search result by frame count: " << count;
      mapFreeObject(result);
      mapDeleteSelectContext(hselect);

      mapCloseMap(hmap);
   } else {
      qDebug() << "mapOpenAnyData error";
   }

}


Результат выполнения:
Код
map real object count: 5
search result count: 4
search result by frame count: 1

С уважением,
Матвеев П.В.
 
Здравствуйте, Павел!
Проблему повторили, она будет исправлена в следующей версии ГИС Конструктор. Спасибо!
 
Приветствую!

ГИС Конструктор для Qt Designer x64 (версия 12.2.0), ОС Astra Linux

Указанный ранее тест отрабатывает успешно, но...
Результат поиска объектов теперь как-то зависит от высоты области поиска заданной при помощи mapSelectSeekAreaFrame. Т.е. пока высота области не достигает какого-то значения, объекты не находятся, хотя и попадают в указанную область.
Постараюсь придумать тест, для демонстрации, но надеюсь, что Вам удастся понять причину проблемы и без моего теста.

С уважением,
Матвеев П.В.
 
Приветствую!

ГИС Конструктор для Qt Designer x64 (версия 12.2.0), ОС Astra Linux

Находятся не все объекты в зависимости от размеров области поиска.

Доработал тест для поиска:
Код
#include <QApplication>
#include <QString>
#include <QDebug>
#include "mapapi.h"
#include "sitapi.h"
#include "seekapi.h"
#include "rscapi.h"
#include "mapcreat.h"
#include "maptype.h"
#include "wmsapi.h"
#include "qdmcmp.h"

//осуществляет поиск объектов пользовательской карты в прямоугольной области соответствующей габаритам объекта с указанным номером
int countInObjectFrame(HMAP hmap, HSITE hsite, long int objNumber) {
   //получение объекта - рамки и его габаритов
   HOBJ result = mapCreateSiteObject(hmap, hsite, IDDOUBLE2, 0L);
   mapReadObjectByNumber(hmap, hsite, result, 1, objNumber);
   DFRAME objFrame;
   mapObjectViewFrameEx(result, &objFrame, 1L);
   qDebug() << "obj frame: " << objFrame.X1 << "," << objFrame.Y1 << ","
         << objFrame.X2 << "," << objFrame.Y2 << ",";
   HSELECT hselect = mapCreateSiteSelectContext(hmap, hsite);
   mapSetDrawObjectsFlag(hselect, 0);
   mapSelectSeekAreaFrame(hselect, &objFrame, 0, 0, SO_SEEKINSIDEANDCROSS, 1,
         0);
   long rc = mapSeekSelectObject(hmap, result, hselect,
         WO_VISUAL | WO_INMAP | WO_FIRST);
   int count = 0;
   while (rc) {
      count++;
      rc = mapSeekSelectObject(hmap, result, hselect,
            WO_VISUAL | WO_INMAP | WO_NEXT);
   }
   mapFreeObject(result);
   mapDeleteSelectContext(hselect);
   return count;
}

// тест поиска объектов
int main(int argc, char ** argv) {
   if (!QApplication::instance()) {
      static int argc = 1;
      static char arg[] = "testSearchByFrame";
      static char *argv[1] = { arg };
      QApplication::setGraphicsSystem("native");
      new QApplication(argc, argv);
   }
   QDMapView* mv = new QDMapView();
   QString mapName(
         "WMTS#IP=http://my-server/GISWebServiceSE/service.php&ID1=0003&Name1=World map&Format=image/png&Autent=Basic YWRtaW46YWRtaW4=&Matrix=urn:ogc:def:wkss:OGC:1.0:GoogleMapsCompatible");
   //Укажем путь к рабочей директории, в которой wmslist.xml и прочие необходимые для работы файлы
   mapSetPathShell("/home/user/maps/conf");
   HMAP hmap = mapOpenAnyData((const WCHAR*) mapName.constData());
   if (hmap != 0) {
      mapAppendDataEx(hmap, "/tmp/test.sitx", 0, 0);
      mapSetRealShowScale(hmap, 10000000.);
      long int siteIndex = mapGetSiteCount(hmap);
      HSITE hsite = mapGetSiteIdent(hmap, siteIndex);
      qDebug() << "site real object count: "
            << mapGetSiteRealObjectCount(hmap, hsite);
      qDebug() << "count in frame obj 5: "
            << countInObjectFrame(hmap, hsite, 5);
      qDebug() << "count in frame obj 6: "
            << countInObjectFrame(hmap, hsite, 6);

      mapCloseMap(hmap);
   } else {
      qDebug() << "mapOpenAnyData error";
   }

}

Карту test.sitx отправил на почту с указанием данной темы

Как-то сязано с тем, что основная карта с WMTS.

С уважением,
Матвеев П.В.
Изменено: Павел Матвеев - 05.02.2018 17:59:19
 
Приветствую!

в ГИС Конструктор для Qt Designer x64 (версия 12.3.0), ОС Astra Linux проблема с поиском все еще актуальна.

С уважением,
Матвеев П.В.
 
Приветствую!

В ГИС Конструктор FREE для Qt Designer x64 (версия 12.3.0) от 18.04.2018, ОС Astra Linux проблема с поиском устранена

С уважением,
Матвеев П.В.
Страницы: 1 2 След.
Читают тему (гостей: 1)



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

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