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

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

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

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 21 След.
[MAPAPI] Получение данных о проекции растра, [MAPAPI] Получение данных о проекции растра
 
Здравствуйте.

Так как всё таки добиться того чтобы в файле Rsw появились данные о системе координат ?

Функция [B]picexLoadRasterToRswUn[/B] не заполняет в заголовке Rsw данные о системе координат (несмотря на их наличие в файле привязке Tab).
При этом вручную внести эти данные в Rsw файл я не могу, так как функция [B]picexLoadRasterToRswUn[/B] создаёт файл в формате 1.04, который закрыт, я нашёл только описание формата версии 2.00 и 2.01

Функции [B]picexLoadBmpToRstAndCompress[/B] и [B]picexLoadBmpToRstAndCompressUn[/B] создают растры из Bmp, но так как информации о системах координат в Bmp нет (а лежащие рядом Tab игнорируются), то и в rsw файлах нет данных о системе координат. Функция [B]mapSetRstProjectionDataPro[/B] не отрабатывает на этих растрах - я не знаю как правильно вызывать эту функцию, ведь она принимает первым параметром HMAP. Мои попытки не увенчались успехом.


Пока мне удалось получить привязанный rsw только из Tiff + Tab файлов ([B]picexLoadRasterToRswUn[/B]), остальные пары (BMP/Jpeg/PNG + Tab) не привязались (то есть в паспорте нет данных о СК).
[MAPAPI] Получение данных о проекции растра, [MAPAPI] Получение данных о проекции растра
 
Здравствуйте.

Воспользовался функцией:

[CODE]//========================================================================
// Импорт растровых данных в файл RSW
// handle - диалог визуального сопровождения процесса обработки
// srcname        - имя входного файла (TIF, IMG, PNG, GIF, JPG, BMP, PCX)
// rstname        - имя выходного файла (*.rsw)
// retcode        - код возврата
// Приоритет изъятия параметров привязки:
//   1. Содержимое соответствующих тегов файлов TIF, IMG
//   2. Файл привязки world.file
//   3. Файл привязки TAB (MapInfo)
// Функция ищет файл привязки рядом с исходным файлом srcname,
// перебирая по приоритету типы файлов.
// При ошибке возвращает ноль
//==========================================================­==============
_PICIMP long int _PICAPI picexLoadRasterToRswUn(HMESSAGE handle,
                                               const WCHAR* srcname,
                                               const WCHAR* rstname,
                                               long int * retcode);
[/CODE]
Пример:

[CODE]#include <QString>
#include <QDebug>
#define SRC_PATH "/home/vegorov/testsMaps/io/Bmp/Bmp.bmp"

int main(){
   const QString srcPath(SRC_PATH);
   const QString dstPath("test.rsw");
   const WCHAR* unSrcPath = srcPath.utf16();
   const WCHAR* unDstPath = dstPath.utf16();
   long rc = picexLoadRasterToRswUn(nullptr, unSrcPath, unDstPath, nullptr);
   qDebug() << __FUNCTION__ << rc;
return 0;
}
[/CODE]
Файлы (взяты из пакета gisdesigner, bmp + файл привязки TAB): [URL=https://drive.google.com/open?id=1W8SUHLnF-9biyD8OLruOevfWFjtL6PLY]testsMaps[/URL]


Затем при открытии данного растра  (test.rsw) в нашем основном приложении при загрузке информации о проекции в отладчике вижу следующее в [B]MAPREGISTEREX[/B]:
(Данные о проекции пытаюсь получить с помощью [B]mapGetRstProjectionDataByName[/B], [B]mapGetRstProjectionDataByName[/B][B]Un [/B]тоже пробовал):

[CODE]__FUNCTION__ "loadInfoAboutMap\000" char[17]
koi8rFilePath "/home/vegorov/testsMaps/rsw/test/test.rsw" QByteArray
rc 1 long
this @0x7fffc4000f10 gis::core::RSingleMap
[gis::core::IMapAccess] @0x7fffc4000f10 gis::core::IMapAccess
m_info @0x7fffc4000f48 gis::core::MapInfo
[vptr] _vptr.MapInfo
m_mapReg @0x7fffc4000f50 MAPREGISTEREX
AxisMeridian 0 double
CoordinateSystem 0 int
DataProjection 0 int
DeviceCapability 0 int
EPSGCode 0 int
EllipsoideKind 0 int
FalseEasting 0 double
FalseNorthing 0 double
FirstMainParallel 0 double
FlagRealPlace 1 int
FrameKind 0 int
HeightSystem 0 int
HeightUnit 0 int
Length 208 int
MainPointParallel 0 double
MapType -1 int
MaterialProjection 0 int
Name "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00­0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00­0\000\000" char[32]
PlaneUnit 0 int
PoleLatitude 0 double
PoleLongitude 0 double
Reserv2 @0x7fffc4001000 double[4]
Scale 100000 int
ScaleFactor 0 double
SecondMainParallel 0 double
TurnAngle 0 double
ZoneIdent 0 int
ZoneNumber 0 int
m_supportedFormats <1 элемент> QList<gis::common::FileType>

[/CODE]
Ну то есть опять данные о масштабе, размер структуры и всё. Координаты мне с него не снять.


Версия пакета gisdesigner 12.3.1
[MAPAPI] Рамка отображаемого знака объекта, [MAPAPI] Рамка отображаемого знака объекта не пересчитывается при изменении масштаба
 
Прошло уже 8 рабочих дней с первого сообщения в данной теме.

Я модернизировал пример: вручную вычисляю рамку объекта, сравниваю с той рамкой которую отдаёт [B]mapObjectViewFrame[/B] - делю площадь рамки от [B]mapObjectViewFrame [/B]на площадь рамки, вычисленную вручную (ну то есть получаю некоторое число overheadFactor - во сколько раз больше пикселей приходится перерисовывать).

Пример (зелёная рамка - вычисленный вручную bounding rectangle, размер самого изображения берётся как рамка от [B]mapObjectViewFrame [/B]переведённая в PP_PICTURE):

[URL=https://drive.google.com/open?id=1_7PCNkzWI02R6h90nLKpZVxM7olioCpD]три изображения[/URL]

Прогнал для большинства объектов (точечных и векторных) из operator.rsc: [URL=https://drive.google.com/open?id=1It9gU5tiNJH7O5qshoIVQW_ZBtOpvCx6]небольшая серия[/URL]

Вычисляю рамку я не всегда корректно, поэтому отсекал все результаты с overheadFactor < 1.0


На нескольких масштабах результаты такие:

[CODE][10:50:25.919 default/D]: testOverhead "1:33333" objectsCount: 2209 average: 38.2776 min: 1 max: 3399.76 overhead < 19.1388: 674 overhead > 76.5552: 182 between: 1353
[10:50:25.919 default/D]: testOverhead "1:50000" objectsCount: 2209 average: 20.4747  min: 1 max: 3175.54  overhead < 10.2373: 746  overhead > 40.9493: 163 between: 1300
[10:50:25.919 default/D]: testOverhead "1:200000" objectsCount: 2196 average: 7.42162 min: 1 max: 2376.2   overhead < 3.71081: 1065 overhead > 14.8432: 102 between: 1029
[10:50:25.919 default/D]: testOverhead "1:300000" objectsCount: 2196 average: 7.19587 min: 1 max: 2336.11  overhead < 3.59794: 984  overhead > 14.3917: 100 between: 1112
[10:50:25.919 default/D]: testOverhead "1:400000" objectsCount: 2196 average: 6.12776 min: 1 max: 1320.11  overhead < 3.06388: 764  overhead > 12.2555: 114 between: 1318
[10:50:25.919 default/D]: testOverhead "1:500000" objectsCount: 2196 average: 5.36802 min: 1 max: 841      overhead < 2.68401: 610  overhead > 10.736:  132 between: 1454
[10:50:25.919 default/D]: testOverhead "1:600000" objectsCount: 2196 average: 5.93735 min: 1 max: 1296     overhead < 2.96868: 828  overhead > 11.8747: 106 between: 1262
[10:50:25.919 default/D]: testOverhead "1:800000" objectsCount: 2193 average: 6.59734 min: 1 max: 1458     overhead < 3.29867: 850  overhead > 13.1947: 134 between: 1209
[/CODE]
Расшифровка для масштаба 1:3333
objectsCount: 2209 - количество объектов, для которых удалось провести тест (некоторые объекты не получалось отрисовать с помощью [B]mapPainToXImage, [/B]так как рамка получалась слишком большой (в пикселях))

average: - среднее значение overheadFactor

overhead < 19.1388: 674 - количество объектов (674) для которых overheadFactor меньше 19.1388

overhead > 76.5552: 182 - количество объектов  (182) для которых overheadFactor больше 76.5552

between: 1353 - количество объектов, для которых overheadFactor между 19.1388 и больше 76.5552
При приближении карты (масштабы 1:33333 и 1:50000) результаты хуже всего.

Карта Подольск, классификатор operator.rsc, версия пакета gisdesigner 12.3.1.
Базовый масштаб 1:100000.
Изменено: Владимир Егоров - 03.12.2018 11:54:11
Как отобразить растры между картой и объектами на временной карте?
 
Спасибо, забыл про то что у пользовательских слоёв много общих свойств отображения с растровыми и матричными данными =)
Библиотеки для разработки прикладных задач к ГИС Оператор 11
 
[QUOTE] long commited = mapCommitObject(Info);
       assert(commited);

       mapViewUserObject(HMap, GetMapWindowHandle(), &point, &Image, &Data, PP_PLANE);

       commited = mapCommitObjectAsNew(Info); //???[/QUOTE]



[CODE] // Сохранить данные об объекте в карту
// info  - идентификатор объекта карты в памяти
// error - код ошибки (см. maperr.rh)
// Номер листа в районе должен быть установлен
// Предыдущее состояние объекта сохраняется в резервных
// файлах и может быть восстановлено
// При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapCommitObjectEx(HOBJ info, long int * error);           // 05/03/18
_MAPIMP long int _MAPAPI mapCommit(HOBJ info);
_MAPIMP long int _MAPAPI mapCommitObject(HOBJ info);
[/CODE][CODE] // Сохранить данные об объекте в файле
// info  - идентификатор объекта карты в памяти
// error - код ошибки (см. maperr.rh)
// Если объект новый - выполняется функция mapCommitObject(),
// если такой объект уже был, то сохраняется копия
// объекта с новым уникальным номером (предполагается,
// что предварительно изменены координаты и т.п.)
// Номер листа в районе должен быть установлен
// Позволяет ускорить создание серии однотипных объектов
// (другой способ - mapCopyObjectAsNew()).
// При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapCommitObjectAsNewEx(HOBJ info, long int * error);     // 05/03/18
_MAPIMP long int _MAPAPI mapCommitObjectAsNew(HOBJ info);
[/CODE]
Сохранили объект.
Не меняли объект.
Сохранили объект как новый (то есть его копию с новым уникальным объектом,  так объект не редактировался между вызовами [B]mapCommitObject [/B]и [B]mapCommitObjectAsNew[/B]).
В итоге у вас два одинаковых объекта в одном и том же месте на карте.

В примере Александра Савелова показано как правильно пользоваться [B]mapCommitObjectAsNew[/B]

Вы создаёте объект ([B]mapCreateObject[/B]) при каждом входе в функцию LeftDown, а удаляете только если PointX и PointY равны 0 (кстати, X и Y - double, сравнивать между собой double вроде не совсем корректно, обычно Epsilon используют. Если вы используете Qt, там есть макрос [B]qFuzzyIsNull[/B]).

Не совсем понятно сбрасывается ли PointX и PointY в 0, то есть происходит ли вход по условию  [B](PointX == 0) && (PointY == 0) [/B]при каждом выполнении функции LeftDown.
Библиотеки для разработки прикладных задач к ГИС Оператор 11
 
Так вы же и создаёте один объект в приведённом примере.
Некоторые методы вместо сообщения об ошибке выдают сигнал: SIGSEGV Назначение: Segmentation fault
 
Это всё равно что написать [CODE]int * ptr = reinterpret_cast<int*>(44768512);
*ptr = 25;
[/CODE]Как отлавливать то что указатель (не nullptr или не нулевой) является некорректным ? Вручную обрабатывать SIGSEGV ??
Создание и сохранение объекта, Объект не сохраняется
 
Может быть карту открыли только на чтение, может быть объект создаёте на временном пользовательском слое (который не сохраняется при переоткрытии карты).
[MAPAPI] Рамка отображаемого знака объекта, [MAPAPI] Рамка отображаемого знака объекта не пересчитывается при изменении масштаба
 
[QUOTE]В общем, при помощи этого метода действительно можно получить рамку вокруг объекта. Она учитывает поворот знаков и практически является описанным прямоугольником.[/QUOTE]
У меня в версии 12.3.1 выдало что-то совсем не вразумительное[QUOTE]Владимир Егоров написал:
В том же примере вызвал эту функцию для объекта squad, потом распечатал метрику из объекта contour  (куда должны были записаться габариты объектов):
rc = panorama::mapGetObjectContour(squadObj, contourObj,0);
   if (rc == 0){
       std::cerr << "can not get contour of squad" << std::endl;
   }else{
       long pc = mapPointCount(contourObj, 0);
       std::cout << "point count of contour:" << pc << std::endl;
       for (long i = 0; i< pc; i++){
           DOUBLEPOINT p;
           mapGetPlanePoint(contourObj, &p, i+1, 0);
           std::cout << "point[" << i+1 << "]= X:" << p.X << " Y:" << p.Y << std::endl;
       }
       mapCommitObject(contourObj);

   }

Вывод:
point count of contour:5
point[1]= X:3.68714e+07 Y:4.44749e+07
point[2]= X:3.68709e+07 Y:4.44758e+07
point[3]= X:3.68743e+07 Y:4.44778e+07
point[4]= X:3.68748e+07 Y:4.44769e+07
point[5]= X:3.68714e+07 Y:4.44749e+07
[/QUOTE]
[MAPAPI] Рамка отображаемого знака объекта, [MAPAPI] Рамка отображаемого знака объекта не пересчитывается при изменении масштаба
 
Интересен официальный ответ от разработчиков.

Может я слишком многого ожидаю от [B]mapObjectViewFrameEx[/B].
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 21 След.



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

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