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

Владимир Егоров (Все сообщения пользователя)

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

Страницы: Пред. 1 ... 4 5 6 7 8 9 10 11 12 13 14 ... 21 След.
[MAPAPI] Получение данных о проекции растра, [MAPAPI] Получение данных о проекции растра
 
В предыдущей версии нашей гис оболочки я считал все rsw файлы по-умолчанию привязанными, если только рядом не лежал специальный json файл, созданный в процессе конвертирования изображения (jpeg/bmp) в rsw и дальнейшей привязки (вручную или по файлу привязки),и в этом json файле я записывал углы рамки rsw  в СК-42 и зону привязки (ну там 5-ую или 6-ую в СК-42).

Я в то время так и не разобрался как проверить привязан ли растр, и ещё я не мог (или не умел) получить рамку растра в географических координатах, только в плоских прямоугольных СК-42, и соответственно я не мог проверить ляжет ли растр на карту корректно или его нужно перепривязать к другой зоне. Велосипедил в общем.

Как правильно это всё делать?
Проверить привязан ли растр, получить его рамку в географических координатах.
[MAPAPI] Получение данных о проекции растра, [MAPAPI] Получение данных о проекции растра
 
Хорошо.


Каким образом узнать что растр не привязан ? Есть какой-то специальный вызов из rstapi.h или нужно анализировать структуру MAPREGISTEREX ?

Если добавить данный растр к карте Подольска - он добавится.
Изменено: Владимир Егоров - 01.11.2018 12:45:34
[MAPAPI] Получение данных о проекции растра, [MAPAPI] Получение данных о проекции растра
 
Здравствуйте.

Использую функцию:
[CODE] // Запросить данные о проекции растра по имени файла
 // name        - имя файла растра
 // mapregister - адрес структуры, в которой будут размещены
 // данные о проекции
 // При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGetRstProjectionDataByName(const char *name,
                                                      MAPREGISTEREX* mapregister);
[/CODE]для следующего растра:
[URL=https://drive.google.com/open?id=1nZDCZx2MB_z2bODKdPK9v4CQ947G14Pg]ссылка[/URL]


Код возврата функции не ноль (rc 1 long в спойлере ниже).

Структура выглядит вот так (скопировал данные из отладчика, m_mapReg):

Скрытый текст
   

FlagRealPlace = 1 (SIT c рамкой) ??????
Кроме масштаба никаких данных  вроде нет (MapType ещё -1 , но это вроде флаг ошибки, Undefined или типа того) .

Это растр такой плохой?
Изменено: Владимир Егоров - 31.10.2018 17:53:56
[MAPAPI] Работа с форматом bir, [MAPAPI] Работа с форматом bir соответствие обычным форматам MAP/RSW/SIT/MTW.
 
B-версией в смысле бета версией?
В любом случае спасибо. А можете на почту прислать описание последнего формата ?
[MAPAPI] Работа с форматом bir, [MAPAPI] Работа с форматом bir соответствие обычным форматам MAP/RSW/SIT/MTW.
 
Файлы в пятницу вечером отправил на почту.
[MAPAPI] Работа с форматом bir, [MAPAPI] Работа с форматом bir соответствие обычным форматам MAP/RSW/SIT/MTW.
 
С форматом моих тестовых данных явно что-то не так.
(Файлы пришлю как только смогу)

Для того растра на 6 гигов который у меня открывается, рамка (габариты) возвращается на всю планету, а в таблице metadata корневого bir файла bounds прописаны вот такие:
[CODE][34.98046875,54.31640625,40.25390625,56.953125]
[/CODE]
У меня в примере вот такой код:
[CODE] HMAP hmap = panorama::mapOpenWMS(MAP_PATH);
   ...
   DFRAME mapFrame;
   rc = panorama::mapGetTotalBorder(hmap, &mapFrame, panorama::PP_GEO);
   if (rc == 0){
    std::cerr << "can not get frame of map" << std::endl;
    return 1;
   }else{
       std::cerr << "total border in geo: X1:" << ::gis::coord::common::radian2degree(mapFrame.X1)
                 << " X2:" << ::gis::coord::common::radian2degree(mapFrame.X2)
                 << " Y1:" << ::gis::coord::common::radian2degree(mapFrame.Y1)
                 << " Y2:" << ::gis::coord::common::radian2degree(mapFrame.Y2)
                 << std::endl;
   }
   rc = mapGetWMSGeoFrame(hmap, 1, &mapFrame);
   if (rc == 0){
    std::cerr << "can not get frame of map" << std::endl;
    return 1;
   }else{
       std::cerr << "total border in geo: X1:" << ::gis::coord::common::radian2degree(mapFrame.X1)
                 << " X2:" << ::gis::coord::common::radian2degree(mapFrame.X2)
                 << " Y1:" << ::gis::coord::common::radian2degree(mapFrame.Y1)
                 << " Y2:" << ::gis::coord::common::radian2degree(mapFrame.Y2)
                 << std::endl;
   }[/CODE]А вывод вот такой:
[CODE]total border in geo: X1:-90.0002 X2:90.0002 Y1:-180 Y2:180
total border in geo: X1:-90 X2:90 Y1:-180 Y2:180[/CODE]
В PP_PICTURE вообще вот такое получается:[CODE]total border in pixels: X1:0 X2:187334523 Y1:0 Y2:93667355
[/CODE]
То есть в моих тестовых картах есть какие-то данные но они не соответствуют формату =(
И поэтому не открывается или открываются но ничего не отрисовывается.
[MAPAPI] Работа с форматом bir, [MAPAPI] Работа с форматом bir соответствие обычным форматам MAP/RSW/SIT/MTW.
 
Ещё момент.
В документе, который есть у меня, в описании таблицы metadata сказано, что там должно быть два столбца с именами name и value.
В примере bir файла (матрице высот), шедшей в поставке пакета gisdesinger под наши ARM в качестве примера, в таблице metadata два столбца с именами key, value.


Во всех примерах bir которые у меня есть там же в таблице metadata есть запись о поставщике данных - НИИ ТП ... .  И версия у всех указана 1.0 или 1.0.0
Путаница какая-то получается.

Мне вот такое пришлось писать в функции проверки формата файла bir:


[CODE] QSqlRecord sqlRecord = db.record("metadata");
   if (sqlRecord.isEmpty()){
       db.close();
       return ret;
   }
   QString sqlQueryText;
   if (sqlRecord.contains("name") && sqlRecord.contains("value")){
       sqlQueryText = SqlQueryBirMetadataByName;
   }else if(sqlRecord.contains("key") && sqlRecord.contains("value")){
       sqlQueryText = SqlQueryBirMetadataByKey;
   }else{
       db.close();
       return ret;
   }
[/CODE]
Изменено: Владимир Егоров - 19.10.2018 11:46:00
[MAPAPI] Работа с форматом bir, [MAPAPI] Работа с форматом bir соответствие обычным форматам MAP/RSW/SIT/MTW.
 
Для открытия как основной карты файлов разницы между wmsapi и mapOpenData нет, судя по всему, а вот для того чтобы работать с данными как с rsw при добавлении на уже открытую карту нужно использовать wmsapi вместо mapapi.

Дальше.
Я набросал пример:

[CODE]#include <iostream>
#include <QRect>
#include <QImage>
#include <gistoolkit/core/common/common.h>
#include <gistoolkit/coord/GisCoord.h>
//То же самое что #include <mapapi.h>, но завёрнуто в отдельный заголовочный
//файл для добавления namespace и выключения предупреждений при сборке
//с помощью директив pragma
#include <gistoolkit/core/legacy/panorama.h>

#define MAP_PATH "/home/vegorov/testsMaps/bir/panorama/Bir.bir"


//классификатор из пакета gisdesigner с сайта
#define RSC_PATH "/usr/share/gisdesigner/examples/Data/RSC/service.rsc"

//знаки нужно подбирать вручную, просматривая классификатор и выбирая подходящий знак
#define POINT_OBJ_KEY "NETNODE" //слой объекты пользователя тип точечный - узел сети
#define TEXT_SIGN_KEY "T0000005561" //слой объекты пользователя тип подписи - Номер опорной точки

void drawToFile(HMAP hmap, const char* filePath, int w, int h){
   XIMAGEDESC ximage;
   ximage.Depth = 16;
   ximage.CellSize = 2;
   //подбираем размеры как степени двойки
   ximage.Width = w;
   ximage.Height = h;
   ximage.RowSize = ximage.Width * ximage.CellSize;
   size_t bytesCount = ximage.Width * ximage.Height *
                    ximage.CellSize;
   ximage.Point = new char[bytesCount];
   ximage.Point = static_cast<char*>(
              memset(static_cast<void*>(ximage.Point), 0, bytesCount));
   DFRAME mapFrame;
   long rc = mapGetTotalBorder(hmap, &mapFrame, panorama::PP_PICTURE);
   int centerX = static_cast<int>((mapFrame.X1 + mapFrame.X2)/2.0);
   int centerY = static_cast<int>((mapFrame.Y1 + mapFrame.Y2)/2.0);
   QRect drawRect(QPoint(), QSize(w, h));
   drawRect.moveCenter(QPoint(centerX, centerY));
   RECT rect;
   rect.top = drawRect.top();
   rect.bottom = drawRect.top() + h;
   rect.left = drawRect.left();
   rect.right = drawRect.right() + w;
   rc = mapPaintToXImage(hmap, &ximage, 0, 0, &rect);
   if (rc == 0){
       std::cerr << "can not paint map to ximage" << std::endl;
       std::exit(1);
   }
   const uchar* buf = reinterpret_cast<const uchar*>(ximage.Point);

   QImage img(buf, static_cast<int>(w),
                   static_cast<int>(h),
                   static_cast<int>(ximage.RowSize),
              QImage::Format_RGB16);
   if (!img.save(QString(filePath), "PNG")){
       std::cerr << "can not save image to file" << std::endl;
       std::exit(1);
   };
   delete []ximage.Point;
   return;
}

int main(){
   //для возможности работы с координатами и высотами - установка путей к epsg файлам, открытие egm модели.
   if (!gis::coord::GisCoord::init()){
       std::cout << "can not init giscoord" << std::endl;
       return 1;
   }

   HMAP hmap = panorama::mapOpenWMS(MAP_PATH);
   if (hmap == 0){
       std::cerr << "can not open map" << MAP_PATH;
       return 1;
   }
   HSITE site = panorama::mapCreateAndAppendTempSite(hmap, RSC_PATH);
    if (site == 0){
        std::cerr << "can not create temp sit" << std::endl;
        return 1;
    }

   HOBJ pointObj = mapCreateSiteObject(hmap, site);
   if (pointObj == 0){
    std::cerr << "can not create object on temp site" << std::endl;
    return 1;
   }
   long rc = mapRegisterObjectByKey(pointObj, POINT_OBJ_KEY);
   if (rc == 0){
    std::cerr << "can not register object by key" << std::endl;
    return 1;
   }
   DFRAME mapFrame;
   rc = panorama::mapGetTotalBorder(hmap, &mapFrame, panorama::PP_GEO);
   if (rc == 0){
    std::cerr << "can not get frame of map" << std::endl;
    return 1;
   }
   double centerB = (mapFrame.X1 + mapFrame.X2)/2.0;
   double centerL = (mapFrame.Y1 + mapFrame.Y2)/2.0;
   rc = mapAppendPointGeo(pointObj, centerB, centerL);
   if (rc == 0){
    std::cerr << "can not append point to object Point" << std::endl;
    return 1;
   }
   mapCommitObject(pointObj);
   mapFreeObject(pointObj);
   HOBJ textObj = mapCreateSiteObject(hmap, site);
   if (textObj == 0){
    std::cerr << "can not create object text on temp site" << std::endl;
    return 1;
   }
   rc = panorama::mapRegisterObjectByKey(textObj, TEXT_SIGN_KEY);
   if (rc == 0){
    std::cerr << "can not register text object by key" << std::endl;
    return 1;
   }
   rc =mapAppendPointGeo(textObj, centerB, centerL);
   if (rc == 0){
    std::cerr << "can not append point to object Text" << std::endl;
    return 1;
   }
   QString text = " Hello world мир";
   QByteArray koi8r = ::gis::common::convertStringToKOI8_R(text);
   rc = panorama::mapPutText(textObj, koi8r.constData(), 0);
   if (rc == 0){
    std::cerr << "can not put text to text object" << std::endl;
    return 1;
   }
   mapCommitObject(textObj);
   mapFreeObject(textObj);
   drawToFile(hmap, "map.png", 600, 200);
   mapCloseData(hmap);
   gis::coord::GisCoord::deinit();
   return 0;
}

[/CODE]
Для файла который был в поставке (матрица высот) всё отработало:  [URL=https://drive.google.com/file/d/1g5jUAcdDg933n6yjB8Gd0_S_b8UZ-1K2/view?usp=sharing]Картинка[/URL]
Для того файла который на 6 гигов (overlay, png) и открывался без ошибок отрисовался серый фон: [URL=https://drive.google.com/file/d/1dMhFvJ8CXX_0b5E5-IzbYZFbnqLL8yd3/view?usp=sharing]Картинка[/URL]
Но серый фон ещё не показатель, может там и данных то нет в этом месте, я как добавлю в основное приложение поддержку (с зумом и скроллингом) нормально уже посмотрю что там лежит.
И завтра притащу флешку на работу и из дома файлы смогу Вам на почту выслать, которые не открылись.
[MAPAPI] Работа с форматом bir, [MAPAPI] Работа с форматом bir соответствие обычным форматам MAP/RSW/SIT/MTW.
 
wmsapi.h посмотрел.

Я правильно понял, что чтобы добавить к текущей открытой карте (району работ) данные (к примеру, класса overlay), я должен вызвать метод
[CODE]mapOpenWMSForMap(HMAP hMap, const char* wmsstring);[/CODE]и в качестве параметра wmsstring отдать полный путь в KOI8-R к файлу ?

А дальше как работа с растрами в в обычно mapapi, только вместо номера растра в цепочке будет номер соединения в цепочке (а функции из wmsapi) ?

И в общем я могу разделить все файлы на два типа - растровые (как rsw, для добавления к карте использовать wmsapi) и матрицы высот (как mtw, для добавления к карте можно использовать mapapi вместо wmsapi).

Это при добавлении к уже открытой карте, а если открывать как основную карту, то можно всегда использовать mapapi ? Или лучше wmsapi для растровых и mapapi для матричных?
Изменено: Владимир Егоров - 19.10.2018 11:34:21
[MAPAPI] Работа с форматом bir, [MAPAPI] Работа с форматом bir соответствие обычным форматам MAP/RSW/SIT/MTW.
 
С архивом не получится, у нас квота 2Гб на пользователя, мне просто не залить эти большие файлы в своё облако =(.

wmsapi.h посмотрю, спасибо.
Страницы: Пред. 1 ... 4 5 6 7 8 9 10 11 12 13 14 ... 21 След.



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

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