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

Функции отображения трёхмерных карт

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: 1 2 3 След.
RSS
Функции отображения трёхмерных карт
 
Здравствуйте. Существуют ли какие-либо доступные функции для отображения локальных карт или геопорталов в трёхмерном виде (желательно в режиме глобуса, то есть учётом кривизны Земли)?
Единственная функция приведённая в Руководстве программиста и используемая в доступных примерах (myfirst) - t3dOpen. Но она создаёт окно навигатора 3D с элементами управления для просмотра оператором не в режиме реального времени - свободный полёт над картой очень часто прерывается процессом пересоздания тайлов поверхности. К тому же, приложение примера аварийно завершается при закрытии дочернего окна навигатора (проверялось в Ubuntu 20.04).


Сейчас в программе на C++ для создания окна имитации пролёта летательного аппарата над землёй в режиме реального времени используется библиотека Cesium с подключённым геопорталом ArcGIS, но это очень не эффективное решение - создаётся и отрисовывается в памяти скрытая веб-страница с Javascript-кодом Cesium, с неё захватывается изображение и отображается на окне приложения.
Единственный похожий инструмент, который был найден в API ГИС Панорама - функции заголовочного файла "m3dapi.h". Но по ним нет никакого описания.
К примеру, в пробном Qt-приложении (использовался диструбутив ГИС Конструктор для Qt Designer x64 (версия 14.1.1.4, платформа "x64", ОС Ubuntu 20.04, Qt 5)) сначала открывается двумерная .sitz-карта Беларуси скачанная из раздела демонстрационных карт. Потом, по правому щелчку пользователя вызывается дочернее окно (QWidget) в конструкторе которого создаётся указатель трёхмерной карты:
Цитата
HMAP3D m_map3D = m3dCreateDefault((HWND)this); // this - указатель QWidget*

В функции-обработчике отрисовки дочернего окна paintEvent производятся следующие действия:
Цитата
QPainter painter(this);
HM3D context = m3dCreateContextNoParam((HDC)this /*painter.device()*/); // Неизвестно указатель на что передавать - сам виджет или контекст его рисования, в обоих случаях возвращается ненулевое значение
m3dOpenData(m_map3D, context, m_map2D); // m_map2D - указатель HMAP на двумерную карту главного окна
m3dBeginPaint(context);
....
Происходит аварийное завершение на вызове функции m3dOpenData.

Возможно ли с помощью инструментария ГИС Конструктор создать трёхмерную карту по которой можно перемещаться (лететь) в режиме реального времени с динамической фоновой подзагрузкой и перерисовкой тайлов поверхности из геопорталов или локальной карты? И существуют ли подобные примеры применения?

Заранее спасибо.
 

Здравствуйте!

Провели тестирование указанной версии. На текущий момент повторить вылет в диалоге при закрытии не удалось. Не могли бы Вы, пожалуйста, описать необходимую последовательность действия для ее воспроизведения? При необходимости данные, необходимые для воспроизведения, можно прислать на почту panorama@gisinfo.ru с ссылкой на сообщение с форума.

Пример, демонстрирующий добавление рисования 3D в собственном приложении, планируем подготовить и включить в состав инсталляции.
Дополнительно сообщаем, что на базе GIS WebToolKit возможна реализация аналогичного функционала по отрисовке 3D в веб страницу.

 
Здравствуйте, большое спасибо за ответ.
К сожалению, доступ к USB-ключу у меня появится только в пятницу, чтобы точно воспроизвести данную ситуацию (и попробовать получить файл дампа памяти .core).
Опишу последовательность действий:
1) С помощью команд "qmake-qt5; make" был собран пример myfirst из диструбутива https://gisinfo.ru/download_linux/?id=143 (md5sum основного файла примера mainform1.cpp - f5c457acb75d7bcf6c6c372d4649329d);
2) Из раздела ознакомительных карт была скачана карта Беларуси by.si (md5sum e77721811a593af786a21c7f91f267be);
3) Запускался пример, открывалась данная карта ("Файл->Открыть карту"), масштабировалась ("Вид карты->Вся карта в окне"), затем выполнялась  команда "Файл->Создать 3D-модель" и выбиралась область построения с помощью рамки выделения;
4) В итоге, поверх основного окна появлялось дочернее окно навигатора 3D, в нём выбирался режим свободного полёта (иконка вертолёта), затем данное подокно закрывалось и всё приложение завершалось с сообщением "Segmentation fault" в консоли.
 
Видео работы с примером myfirst: https://disk.yandex.ru/i/qTVYm-Op7r5maA.
Если останавливать полёт в дочернем окне навигатора 3D перед его закрытием, то закрывается только оно и программа  не завершается аварийно, но рамка выбора построения 3D-модели не сбрасывается на карте. Приходится ещё два раза выбирать пункт меню "Создать 3D-модель", чтобы сбросить рамку предыдущего выделения и снова открыть окно полёта, но после появления его окантовки с заголовком  (до отрисовки области 3D-карты) приложение также завершается аварийно. То есть, так или иначе, уже при первом построении 3D-модели происходит некорректное освобождение памяти.

Насчёт Вашего предыдущего ответа: пример 3D-модели Земли с помощью GIS WebToolKit (http://3d.gisserver.ru/?b=40.368727&l=56.911210&z=3&layers=B554C85A-4915-4A3...) это именно то, что нужно. Можно ли добавить пример реализации такого же глобуса с помощью MAPAPI в приложении Qt на языке C++ в состав ГИС Конструктора?
Изменено: Олег Темеров - 12.08.2022 08:28:35
 
Добрый день!

Доработка текущего функционала для поддержки отображения 3D-модели Земли возможна. Планируем первым шагом подготовить пример, демонстрирующий отображение 3D-модели без учета кривизны - если Вас устроит данный вариант, то мы выполним реализацию отображения модели Земли.
 
Большое спасибо, Александр. Этот вариант подойдёт для начальной реализации программы имитации полёта.
Изменено: Олег Темеров - 15.08.2022 15:51:44
 
Здравствуйте

Очень интересует режим глобуса для 3d карты, подскажите когда ждать пример?
Планируется ли оптимизация производительности 3d? А то существующее решение медленно работает даже на дискретной карте nvidia 1650.
 
Добрый день!

Первоначальный пример, демонстрирующий отображение 3D-модели без учета кривизны, планируем подготовить ориентировочно к концу месяца.
 
Добрый день!

Подготовлен пример текстов функций инициализации и отрисовки 3D-модели карты с указанием порядка вызова  api-функций заголовочного файла m3dapi.h и пояснениями:
https://disk.yandex.ru/d/_YZ-6MwLUZQE2Q
Изменено: Елена Кружкова - 24.08.2022 17:00:51
 
Здравствуйте, большое спасибо за пример.

Однако, к нему есть вопросы:
Судя по используемым типам и кодировке CP1251, это всё-таки пример для API Windows?
Как его изменить для работы с чистым API Qt5? К примеру, что использовать в качестве параметра "HDC hdc" в функции Init: указатель на виджет отрисовки (QWidget*) или контекст рисования (QPainter*)? Если последнее, придётся вызывать Init при каждой перерисовке виджета, так как QPainter является валидным только в методе-обработчике paintEvent виджета.
Как правильно установить начальную точку обзора и угол направления "камеры"? К примеру, в центре карты на высоте 1000 метров?
Страницы: 1 2 3 След.
Читают тему (гостей: 1)



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

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