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

Александр Попов (Автор тем)

Поиск  Пользователи  Правила  Войти
Форум » Пользователи » Александр Попов
Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 След.
Обновление существующей карты из SXF происходит со смещением
 
Приветствую!
Используем ГИС Конструктор для Qt Designer x64 (версия 12.6.1), ОС Astra Linux

Появилась необходимость объединить несколько sxf-файлов в один sitx. Однако, если сначала импортировать карту с помощью [B][I]ImportFromAnySxfEx[/I][/B], а затем добавить ее с помощью [I][B]UpdateFromAnySxf, [/B][/I]то импортированные знаки не совпадают.

[IMG WIDTH=220 HEIGHT=112]https://drive.google.com/thumbnail?id=1Wl9jzQZ2F8pHswW51fklmzJjCFtuHRpX[/IMG] [IMG WIDTH=220 HEIGHT=112]https://drive.google.com/thumbnail?id=1lHARVC8N4gR51P39R0W-yyg-PRVRQB8a[/IMG]

Код для воспроизведения:[CODE]#include <QString>
#include <QDebug>
#include <QImage>
#include "mapapi.h"
#include "sitapi.h"
#include "rscapi.h"
#include "mapcreat.h"
#include "maptype.h"
#include "vecexapi.h"

long int msgHangler(long int hwnd, long int code, long int p1, long int p2,
                   long int typemsg){
   return 0;
}

void saveMap(HMAP hsite, QString filename) {
   XIMAGEDESC desc;
   DFRAME frame;
   mapGetTotalBorder(hsite, &frame, PP_PICTURE);
   RECT rect;
   rect.left = frame.X1 + 1300 ;
   rect.right = frame.X2/10;
   rect.top = frame.Y1 + 2000;
   rect.bottom = frame.Y2/10;

   memset((void*) &desc, 0, sizeof(desc));
   desc.Width = rect.right - rect.left;
   desc.Height = rect.bottom - rect.top;
   desc.Depth = mapGetMapScreenDepth();
   desc.CellSize = desc.Depth / 8;
   desc.RowSize = desc.Width * desc.CellSize;
   desc.Point = (char*) malloc(desc.Height * desc.RowSize);

   mapPaintToXImage(hsite, &desc, 0,0, &rect);
   QImage im2((const uchar*) desc.Point, desc.Width,
              desc.Height, desc.RowSize,
              QImage::Format_RGB32);
   if (!im2.save("/tmp/" + filename, "PNG")) {
       qDebug() << "file 2 save error";
   }
   free(desc.Point);
}

int main() {
   QString sxfName("/tmp/sxf/G-44-12.SXF");
   QString mapName("/tmp/sxf/G-44-12.sitx");
   QString rscName("/tmp/sxf/200t05g.rsc");
   long rc = ImportFromAnySxfEx(0, sxfName.toLatin1().constData(), rscName.toLatin1().constData(),
                      mapName.toLatin1().data(), mapName.length()-2,&msgHangler,0, 0);
   if(rc == 0) {
       qDebug() << " ==== Import Error";
       return 0;
   }
   HSITE hsite = mapOpenAnyData((const WCHAR*) mapName.constData());
   mapSetRealShowScale(hsite, 10000);
   saveMap(hsite, "1.png");
   rc = UpdateFromAnySxf(hsite, sxfName.toLatin1().constData(), mapName.toLatin1().data(), mapName.length(), &msgHangler, 0,2);
   if(rc == 0 ) {
       qDebug() << " ==== Update Sxf Error";
       return 0;
   }
   saveMap(hsite, "2.png");
   mapCloseData(hsite);
}

[/CODE]
С уважением,
Александр Попов
Некорректное поведение метода mapRegisterObjectByKey на некоторых знаках
 
Приветствую!

Используем:
[LIST]
[*]ГИС Конструктор для Qt Designer x64 (версия 12.5.0), ОС Astra Linux,
[*]Классификатор operator.rsc из состава ГИС Оператор 12, ОС Astra Linux
[/LIST]При создании знака "Противонанк. мин. поле дист (312625003141)" через вызов mapRegisterObjectByKey на карте создается знак "Смеш. мин. поле дист (3126250031412)".
Код для воспроизведения:
[CODE]#include <QString>
#include <QDebug>
#include "mapapi.h"
#include "sitapi.h"

int main() {

   QString siteName("/tmp/test.sitx");
   QString rscName("/usr/Operator12/operator.rsc");

   CREATESITEUN cs;
   memset((void*) &cs, 0, sizeof(cs));
   cs.Length = sizeof(CREATESITEUN);
   cs.EllipsoideKind = 9;
   cs.MapType = 16;

   HMAP hsite = mapCreateSiteUn((const WCHAR*) siteName.constData(),
       (const WCHAR*) rscName.constData(), &cs);
   mapSetRealShowScale(hsite, mapScaleToRoundScaleEx(hsite,200000.));
   if (hsite !=0) {
       double x = 6170046;
       double y = 7409328;
       HOBJ hobj = mapCreateSiteObject(hsite, hsite, IDDOUBLE2, 0);
       const char* original = "312625003141";
        if (mapRegisterObjectByKey(hobj, original) != 0) {
            int size = 3000;
            mapAppendPointPlane(hobj,x,y,0);
            mapAppendPointPlane(hobj,x - size,y,0);
            mapCommitObject(hobj);
        } else {
            qDebug() << "No sign ";
        }
        const char * key = mapObjectRscKey(hobj);
        if(strcmp(key, original)) {
            qDebug() << "The original key " << original << " is not equals " << key;
        }
       mapFreeObject(hobj);
       mapCloseData(hsite);
   } else {
       qDebug() << "Wrong site";
   }
}
[/CODE]P.S. Изменение ключа нанесенного знака также наблюдается еще на 64 знаках.

С уважением,
Александр.
Работа с WMTS, который находится на web-сервере c аутентификацией через ALD (Astra Linux Directory)
 
Приветствую!

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

Подскажите пожалуйста как открыть карту WMTS, которая находится на web-сервере c аутентификацией через ALD (Astra Linux Directory). На сколько я понял, сейчас доступна только basic-аутентификация.

С уважением,
Александр.
Не работает метод определения номенклатур mathSheetFromFrame
 
Приветствую!
Использую ГИС Конструктор для Qt Designer x64 (версия 11.10.3), ОС Astra Linux.

При вызове метода mathSheetFromFrame возвращаются неверный результат. Порядок воспроизведения:
1. Создаю замкнутый объект
2. Запрашиваю номенклатуры по этому объекту
4. Получаю результат из трех значений, два из которых повторяются.

Код и результат, привожу ниже:
[CODE]#include <QString>
#include <QDebug>
#include "sitapi.h"
#include "mapapi.h"
#include "mapcreat.h"
#include "maptype.h"
#include "mathapi.h"

//создает карту
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) {
      qDebug() << "mapCreateSiteUn error";
   }
   return hmap;
}

// тест метода получения номенклатуры по рамке
int main() {
   int SCALE = 200000;
   
   QString* siteName = new QString("/tmp/testMathFunctions.sitx");
   QString* rscName = new QString("/usr/Operator11/operator.rsc");

   HMAP hmap = createMapForTest(siteName, rscName);
   if (hmap != 0) {
       HOBJ hobj = mapCreateObject(hmap);
       mapDescribeObject(hobj, 2L);
       mapAppendPointGeoWGS84(hobj,0.8299040593233037, 0.6894050545377601,0);
       mapAppendPointGeoWGS84(hobj,0.8435176274888595, 0.6937683776677459,0);
       mapAppendPointGeoWGS84(hobj,0.8237954069413236, 0.6953391739945409,0);
       mapAppendPointGeoWGS84(hobj,0.8237954069413236, 0.6894050545377601,0);
       mapAppendPointGeoWGS84(hobj,0.8299040593233037, 0.6894050545377601,0);
       mapCommitObject(hobj);
       
       int size = 32;
       LISTREGISTER listreg[size];
       memset((void*)&listreg, 0, sizeof(LISTREGISTER)*size);
       qDebug()<< "Result = " << mathSheetFromFrame(hmap, hobj, SCALE, listreg, size  );
       for(int i=0; i < size; i++) {
           QString nom(listreg[i].Nomenclature);
           if(listreg[i].Length == 0) {
               break;
           }
           qDebug() << i << nom;
           
           
       }
       mapCloseData(hmap);
   } else {
       qDebug() << "createSitx error";
   }
}
[/CODE]Результат:
[CODE]Result = 3
1 "0.L-37-10"
2 "0.M-37-34"
3 "0.M-37-34"[/CODE]Если открыть, созданную в примере карту и выполнить задачу разграфки, то получим:
[IMG WIDTH=294 HEIGHT=570]https://s31.postimg.org/7qw5eiw2j/bug.png[/IMG]
Т.е. отсутствует номенклатура "0.L-37-04"
Вопросы по методу mathGetRuleSheetName, Прошу объяснить что закодировано в выводе
 
Приветствую!
Использую ГИС Конструктор для Qt Designer x64 (версия 11.10.3), ОС Astra Linux.

Вызываю метод mathGetRuleSheetName с координатами г. Мурманска (68.95, 33.09) и масштабом 1 000 000.  Ожидаемый результат был R-35,36. Получаю результат:
0.R-36 если последний параметр 1
0.R-36.0 если последний параметр 0.

Возникли следующие вопросы:
1. Что обозначает первое число 0.
2. Что обозначает последний ноль?


P.S. Если вызвать метод со значением больше 88, то приложение завершается аварийно.
Не работает поиск по области
 
Добрый день.
Используем ГИС Конструктор для Qt Designer x64 (версия 11.10.0), ОС Astra Linux.

На карте нанесено 2 объекта. Берем габариты карты и ищем все объекты. Результат поиска один объект.
Код для воспроизведения:
[CODE]
#include <QString>
#include <QDebug>
#include <QImage>
#include "mapapi.h"
#include "sitapi.h"
#include "rscapi.h"
#include "mapcreat.h"
#include "maptype.h"

int main() {

   qDebug() << "MapApi " << mapGetMapAccessVer sion();

   QString siteName("/tmp/searchTest.sitx");
   QString rscName("/usr/Operator11/operator.rsc");

   CREATESITEUN cs;
   memset((void*) &cs, 0, sizeof(cs));
   cs.Length = sizeof(CREATESITEUN);
   cs.EllipsoideKind = 9;
   cs.MapType = 16;

   HMAP hsite = mapCreateSiteUn((const WCHAR*) siteName.constData(),
       (const WCHAR*) rscName.constData(), &cs);

   mapSetRealShowScale(hsite, mapScaleToRoundScaleEx(hsite,200000.));

   if (hsite !=0) {
       double x = 6170046;
       double y = 7409328;

       HOBJ hobj = mapCreateSiteObject(hsite, hsite,     IDDOUBLE2, 0);

        if (mapRegisterObject(hobj, 2, 1) != 0) {
            int size = 3000;
            mapAppendPointPlane(hobj,x,y,0);
            mapAppendPointPlane(hobj,x - size,y,0);
            mapAppendPointPlane(hobj,x - size,y + size,0);
            mapAppendPointPlane(hobj,x, y + size,0);
            mapAppendPointPlane(hobj,x,y,0);
            mapCommitObject(hobj);
        } else {
            qDebug() << "No sign 1";
        }

        mapFreeObject(hobj);

        hobj = mapCreateSiteObject(hsite, hsite, IDDOUBLE2, 0);
        if (mapRegisterObject(hobj, 713230011 ,3) != 0) {
            QString text = "text";
            mapPutTextUn(hobj,(const WCHAR*)text.constData() , 0);
            mapAppendPointPlane(hobj,x + 3500,y + 3500,0);
            mapAppendPointPlane(hobj,x + 4000,y + 4000,0);
            mapCommitObject(hobj);
        } else {
            qDebug() << "No sign 2";
        }

       mapFreeObject(hobj);
       mapCloseData(hsite);

       hsite = mapOpenAnyData((const WCHAR*) siteName.constData());
       mapSetRealShowScale(hsite, mapScaleToRoundScaleEx(hsite,200000.));

       DFRAME frame; // габариты карты
       mapGetTotalBorder(hsite, &frame, PP_PLANE);

       HSELECT select = mapCreateSiteSelectContext(hsite, hsite);
       HOBJ result = mapCreateSiteObject(hsite, hsite,IDDOUBLE2, 0L);

       MAPDFRAME mframe;
       mframe = frame;
        long rc = mapWhatObjectBySelect(hsite,result, &mframe,select, WO_FIRST, PP_PLANE);
        qDebug() << mapObjectKey(result); // нашли первый знак

        if(rc) {
           rc =  mapWhatObjectBySelect(hsite,result, &mframe,select, WO_NEXT, PP_PLANE);

           // если раскомментировать то второй знак будет найден
           // rc =  mapWhatObjectBySelect(hsite,result, &mframe,select, WO_BACK, PP_PLANE);
           if(rc) {
               qDebug() << mapObjectKey(result); // нашли подпись
           } else {
               qDebug() << "no second sign";
           }
        }
       mapFreeObject(result);
       mapCloseData(hsite);
   } else {
       qDebug() << "Wrong site";
   }
}
[/CODE]
После сохранения карты в проект c помощью mapSaveProject не открываются пользовательские карты, находящиеся во вложенных папках
 
Добрый день.
Используем ГИС Конструктор для Qt Designer x64 (версия 11.10.0), ОС Astra Linux
Имеется следующая структура:
[CODE]
ProjectFolder
|--folder1
     |--1.rsc
     |--1.sitx
     |--folder1_1
       |--1_1.rsc
       |--1_1.sitx
|--folder2
  |--2.rsc
  |--2.sitx
|--project.mpt
[/CODE]
Если данную структуру сохранить как проект в ГИС Оператор, то после открытия обе пользовательские карты подключены к основной карте.
Если использовать ГИС Конструктор, а именно mapSaveProject, то при открытии в ГИС Оператор получаем ошибку [B]"Ошибка открытия или доступа к файлу -/folder1_1/1_1.sitx файл или каталог не существует"[/B] и теряется пользовательская карта 2.sitx
Если сравнивать эти два проекта, то разница в том, что ГИС Оператор сохраняет абсолютные пути до пользовательских карт, а ГИС Конструктор относительные.
Подскажите пожалуйста:
1. Как в ГИС Конструктор формировать mpt файл с [B]абсолютными путями[/B]? Однако после этого перемещать данный проект будет проблематично.
2. Или, может быть, данное поведение является ошибкой в ГИС Оператор?
Изменено: Александр Попов - 17.02.2016 11:14:25
Список исходных масштабов отображения
 
Добрый день,
Используется ГИС Конструктор для Qt Designer x64 (версия 11.9.2), ОС Astra Linux.
Подскажите пожалуйста как получить список допустимых значений масштабов отображения, которые отображаются при создании пользовательской карты в ГИС Оператор.
Как определить весь набор файлов для пользовательской карты (sit)
 
Добрый день.

 Есть задача передать по сети пользовательскую карту, для этого необходимо определить названия сопутствующих файлов (*.shd, *.sse, ...). Столкнулись с проблемой, что расширения имеют разный регистр (например, SSE или sse), причем это можно наблюдать в примерах для ГИС Оператор (/usr/Operator11/Data), что для Linux совершенно разные файлы. Подскажите пожалуйста, как [B]программно[/B] определить все необходимые файлы для выбранной пользовательской карты.
Используется ГИС Конструктор для Qt Designer x64 (версия 11.9.1), ОС Astra Linux.

С уважением, Попов Александр.
Порядок отображения знаков на карте
 
Приветствую!
Использую ГИС Конструктор для Qt Designer x64 (версия 11.8.3), ОС Astra Linux

Есть задача: Пользователь рисует площадные [I][B]пересекающиеся[/B][/I] знаки на [I][B]пользовательской[/B][/I] карте (для простоты - все знаки с одинаковым кодом). В какой-то момент он решает изменить порядок знаков. Т.е. что-то сделать выше, что-то сделать ниже. Попробовал решить данную задачу с помощью методов [CODE]mapUpdateObjectUp, mapUpdateObjectDown[/CODE], однако, после вызовов этих методов знаки перестают отображаться. Порядок моих действий:
1. Рисую три квадрата маленький, средний, большой у которых первая точка совпадает. Как результат, большой квадрат перекрывает предыдущие 2.
[IMG]http://s7.hostingkartinok.com/uploads/images/2015/09/ca6710b1bf4e8364f730edff03ddd615.png[/IMG]
2. Для среднего квадрата вызываю mapUpdateObjectUp после чего на карте остается виден один маленький квадрат, с количеством знаков равным 4.
[IMG]http://s7.hostingkartinok.com/uploads/images/2015/09/b5912c6e972d212659180476cf65445d.png[/IMG]
3. После [I][B]сортировки [/B][/I]этой пользовательской карты получаю ожидаемую картинку. Маленький квадрат снизу, затем большой, затем средний. Данное решение, мне не нравится тем, первое, что сортируется [I][B]вся[/B][/I] карта, т.е. порядок изменится у остальных знаков тоже, второе, что сортировка всей карты занимает заметное для пользователя время.
[IMG]http://s7.hostingkartinok.com/uploads/images/2015/09/3074dd4f5b5c5a052ee83f112210f2fc.png[/IMG]
Все картинки были получены через метод [CODE]mapPaintByFrameToXImage[/CODE] также все картинки совпадают с картинкой ГИС Оператор 11.11.21, если открывать пользовательскую карту на промежуточных этапах.
Поэтому остается открытым вопрос как обновить картинку без полной сортировки.
Изменено: Александр Попов - 09.09.2015 12:14:45
Страницы: 1 2 След.



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

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