Map Viewer
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 20 фев 2015, 07:48
- Репутация: 0
Map Viewer
Здравствуйте.
Пытаюсь сделать простой Map Viewer (С++ Qt) - просмотрщик карт (например .mp - польский формат). Понимаю, что изобретаю велосипед, и можно было бы использовать QGIS, но хочется в целях, так сказать, самообразования.
Мне бы понять по какому принципу строятся подобные "вьюверы".
Допустим если взять те же самые Qtшные виджеты QGraphicsView и QGraphicsScene, или любой другой компонент, - как на сцене нарисовать линию, точку или полигон имея координаты в формате Долгота: 130.741231 | Широта: 42.794436 ? Как в этих компонентах установить нужную проекцию? Да и вообще порядок программирования подобных приложений, с чего начать?
Пытаюсь сделать простой Map Viewer (С++ Qt) - просмотрщик карт (например .mp - польский формат). Понимаю, что изобретаю велосипед, и можно было бы использовать QGIS, но хочется в целях, так сказать, самообразования.
Мне бы понять по какому принципу строятся подобные "вьюверы".
Допустим если взять те же самые Qtшные виджеты QGraphicsView и QGraphicsScene, или любой другой компонент, - как на сцене нарисовать линию, точку или полигон имея координаты в формате Долгота: 130.741231 | Широта: 42.794436 ? Как в этих компонентах установить нужную проекцию? Да и вообще порядок программирования подобных приложений, с чего начать?
- paleogis
- Модератор
- Сообщения: 1112
- Зарегистрирован: 22 мар 2009, 08:54
- Репутация: 200
- Ваше звание: Модератоо
Re: Map Viewer
Изобретать велосипед-это не всегда правильно, лучше уж написать плагинчик для QGIS, профита будет больше. Или можно сделать новую морду для QGIS, оптимизированную под тачскрин, например для андроид версии. А то многие на форуме пишут, даешь на смартфон полноценную ГИС. Работая над QGIS, Вы хорошо поймете "по какому принципу строятся подобные "вьюверы"".virtu писал(а):Пытаюсь сделать простой Map Viewer (С++ Qt) - просмотрщик карт (например .mp - польский формат). Понимаю, что изобретаю велосипед, и можно было бы использовать QGIS, но хочется в целях, так сказать, самообразования.
Мне бы понять по какому принципу строятся подобные "вьюверы".
https://github.com/qgis
-
- Активный участник
- Сообщения: 218
- Зарегистрирован: 21 дек 2012, 01:57
- Репутация: 52
- Откуда: Питер
Re: Map Viewer
Т.к. эти компоненты ничего про проекции не знают - вам надо будет это запрограммировать самому. Т.е. написать код, который из исходных координат сформирует координаты в пикселах. Ну а дальше по этим пиксельным координатам - обычное рисование средствами выбранной библиотеки.virtu писал(а):Допустим если взять те же самые Qtшные виджеты QGraphicsView и QGraphicsScene, или любой другой компонент, - как на сцене нарисовать линию, точку или полигон имея координаты в формате Долгота: 130.741231 | Широта: 42.794436 ? Как в этих компонентах установить нужную проекцию?
-
- Гуру
- Сообщения: 3321
- Зарегистрирован: 27 июл 2009, 19:26
- Репутация: 748
- Ваше звание: Вредитель полей
Re: Map Viewer
Если принципиально использование Qt, можно посмотреть вот на этот проект https://marble.kde.org/features.php
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 20 фев 2015, 07:48
- Репутация: 0
Re: Map Viewer
QGIS конечно же Великий монстр - в хорошем смысле этих слов. Но для понимания как работает, вернее, с чего начинается рисование будет сложно понять. Можно использовать QGIS-ные библиотеки и прикрутить его вьювер к своей программе, но опять же, сама идея и сам порядок программирования рисовальщика ускользнет от понимания. Я не использовал QGIS, но я немного использовал другую либу, вернее исходники проги Merkaator-а, там вроде бы просто, но все же тупой копи-паст без понимания принципа не очень подходит и порядок программирования ускользал.paleogis писал(а):Изобретать велосипед-это не всегда правильно, лучше уж написать плагинчик для QGIS, профита будет больше. Или можно сделать новую морду для QGIS, оптимизированную под тачскрин, например для андроид версии. А то многие на форуме пишут, даешь на смартфон полноценную ГИС. Работая над QGIS, Вы хорошо поймете "по какому принципу строятся подобные "вьюверы"". https://github.com/qgis
Вот это уже очень-очень близко к тому, что я хочу понять. Сергей, Вы случайно не знаете, где можно про это почитать?Sergey Astakhov писал(а):Т.к. эти компоненты ничего про проекции не знают - вам надо будет это запрограммировать самому. Т.е. написать код, который из исходных координат сформирует координаты в пикселах. Ну а дальше по этим пиксельным координатам - обычное рисование средствами выбранной библиотеки.
Может кто-нибудь подскажет, правильно ли я начинаю думать..? ..о следующем, что нужно сделать:
1. Определить прямоугольную область:
QRectF((QPointF(-180, 90), QPointF(180, -90))
2. Написать код:
coordToPixel(double x, double y)....
3. Нарисовать линию:
QPoint point1 = coordToPixel(QPointF(144.140625, 47.517201));
QPoint point2 = coordToPixel(QPointF(-45.703125, 78.490552));
this->addLine(point1, point2);
Пойду по-экспериментирую...
PS: Я немного тугодум, но прошу научить меня правильно думать
Желательно.ericsson писал(а):Если принципиально использование Qt, можно посмотреть вот на этот проект https://marble.kde.org/features.php
Я раньше программировал чисто под консоль, а когда столкнулся с GUI, то Qt оказался самой лучшей из всего, что есть на С++.
Спасибо за ссылку, посмотрю.
- avk
- Новоприбывший
- Сообщения: 10
- Зарегистрирован: 04 май 2015, 02:30
- Репутация: 3
- Откуда: Санкт-Петербург
Re: Map Viewer
Подводных камней вас ждёт немало.
Например:
1) увязка целочисленных двухмерных координат монитора и трёхмерных float- или double- координат реального Мира
2) принятие и обслуживание ряда абстракций (введение дискрет, введение проекции сферообразной Земли /в общем случае/, введение масштаба визуализации и т.д.). К сожалению, потребуется реализация в коде того пути, что пройден различными географическими ВУЗами, НИИ и сообществами: геодезическая основа -> математическая основа -> визуализация
3) принятие решения о природе визуализатора: векторный или растровый. Например, у QGIS он в отношении примитивов рисования - векторный. В других программах программисты предпочитают сразу рендерить картинку. Векторный визуализатор позволит более точно обеспечивать метричность преобразований и визуализации, но потребует хорошую продуманную архитектуру, сильно нагрузит графику компьютера и обяжет заниматься генерализацией. Растровый потребует поддерживать сложную модель соответствия (например, какие пиксели должны начать мигать при выделении площадного объекта).
4) и много ещё интересного и тернистого. Даже забористого
Как вариант, можете посмотреть заголовочные файлы комплекта разработчика GIS Toolkit (КБ "Панорама"). Они поставляются вместе с GIS Toolkit и могут быть скачаны с сайта производителя. Один из них прикладываю (смотрите раздел "ФУНКЦИИ ОТОБРАЖЕНИЯ И ПЕЧАТИ ЭЛЕКТРОННОЙ КАРТЫ"). Только по названиям и параметрам функций уже можно понять с какой стороны подходить к снаряду.
Например:
1) увязка целочисленных двухмерных координат монитора и трёхмерных float- или double- координат реального Мира
2) принятие и обслуживание ряда абстракций (введение дискрет, введение проекции сферообразной Земли /в общем случае/, введение масштаба визуализации и т.д.). К сожалению, потребуется реализация в коде того пути, что пройден различными географическими ВУЗами, НИИ и сообществами: геодезическая основа -> математическая основа -> визуализация
3) принятие решения о природе визуализатора: векторный или растровый. Например, у QGIS он в отношении примитивов рисования - векторный. В других программах программисты предпочитают сразу рендерить картинку. Векторный визуализатор позволит более точно обеспечивать метричность преобразований и визуализации, но потребует хорошую продуманную архитектуру, сильно нагрузит графику компьютера и обяжет заниматься генерализацией. Растровый потребует поддерживать сложную модель соответствия (например, какие пиксели должны начать мигать при выделении площадного объекта).
4) и много ещё интересного и тернистого. Даже забористого
Как вариант, можете посмотреть заголовочные файлы комплекта разработчика GIS Toolkit (КБ "Панорама"). Они поставляются вместе с GIS Toolkit и могут быть скачаны с сайта производителя. Один из них прикладываю (смотрите раздел "ФУНКЦИИ ОТОБРАЖЕНИЯ И ПЕЧАТИ ЭЛЕКТРОННОЙ КАРТЫ"). Только по названиям и параметрам функций уже можно понять с какой стороны подходить к снаряду.
- Вложения
-
- mapapi.h
- (522.42 КБ) 676 скачиваний
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 20 фев 2015, 07:48
- Репутация: 0
Re: Map Viewer
Ух-ты Как все подробно там написано...avk писал(а):Как вариант, можете посмотреть заголовочные файлы комплекта разработчика GIS Toolkit (КБ "Панорама"). Они поставляются вместе с GIS Toolkit и могут быть скачаны с сайта производителя. Один из них прикладываю (смотрите раздел "ФУНКЦИИ ОТОБРАЖЕНИЯ И ПЕЧАТИ ЭЛЕКТРОННОЙ КАРТЫ"). Только по названиям и параметрам функций уже можно понять с какой стороны подходить к снаряду.
Я когда попадал на их сайт и видел цены на их продукт, то сразу закрывал страницу, но я ни когда и подумать не мог, что там такие подробные комментарии.
Спасибо, что открыли мне глаза.
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 20 фев 2015, 07:48
- Репутация: 0
Re: Map Viewer
Не могли бы Вы по порядку изложить суть структуры и по-подробнее? Для начала, с чего бы мне начать ..потом, с чего продолжить, и наконец - чем кончить...avk писал(а):Подводных камней вас ждёт немало.
Например:
1) увязка целочисленных двухмерных координат монитора и трёхмерных float- или double- координат реального Мира
2) принятие и обслуживание ряда абстракций (введение дискрет, введение проекции сферообразной Земли /в общем случае/, введение масштаба визуализации и т.д.). К сожалению, потребуется реализация в коде того пути, что пройден различными географическими ВУЗами, НИИ и сообществами: геодезическая основа -> математическая основа -> визуализация
3) принятие решения о природе визуализатора: векторный или растровый. Например, у QGIS он в отношении примитивов рисования - векторный. В других программах программисты предпочитают сразу рендерить картинку. Векторный визуализатор позволит более точно обеспечивать метричность преобразований и визуализации, но потребует хорошую продуманную архитектуру, сильно нагрузит графику компьютера и обяжет заниматься генерализацией. Растровый потребует поддерживать сложную модель соответствия (например, какие пиксели должны начать мигать при выделении площадного объекта).
4) и много ещё интересного и тернистого. Даже забористого
-
- Завсегдатай
- Сообщения: 310
- Зарегистрирован: 25 май 2009, 13:50
- Репутация: 43
Re: Map Viewer
Посмотрите редактор OSM https://github.com/openstreetmap/merkaartor он тоже на Qt
[ Сообщение с мобильного устройства ]
[ Сообщение с мобильного устройства ]
-
- Завсегдатай
- Сообщения: 310
- Зарегистрирован: 25 май 2009, 13:50
- Репутация: 43
Re: Map Viewer
А есть ещё редактор mapedit++ http://sourceforge.net/projects/gmeaddons/ для которого .mp как родной
[ Сообщение с мобильного устройства ]
[ Сообщение с мобильного устройства ]
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 20 фев 2015, 07:48
- Репутация: 0
Re: Map Viewer
sadless74 писал(а):А есть ещё редактор mapedit++ http://sourceforge.net/projects/gmeaddons/ для которого .mp как родной
mapedit++ - скачал только сегодня...sadless74 писал(а):Посмотрите редактор OSM https://github.com/openstreetmap/merkaartor он тоже на Qt
merkaartor - курил уже несколько дней... Ускользает от меня "идея порядка", то есть с чего начать, чем продолжить и как кончить - не совсем понятно...
- avk
- Новоприбывший
- Сообщения: 10
- Зарегистрирован: 04 май 2015, 02:30
- Репутация: 3
- Откуда: Санкт-Петербург
Re: Map Viewer
Предлагаю начать с результата (то есть, с конца):virtu писал(а): Не могли бы Вы по порядку изложить суть структуры и по-подробнее? Для начала, с чего бы мне начать ..потом, с чего продолжить, и наконец - чем кончить...
1) сначала визуализатор с абстракцией дискрет (заодно подумайте какой у вас будет пиксель: квадратный или нет )
2) затем к визуализатору нужно будет "прикрутить" проекции и соотвествующие преобразования
3) решая задачу выбора и управления проекциями вы дойдёте и до геодезической основы (если, конечно, лукавый вас не сделает активным пользователем proj4 )
Итак, визуализатор.
Решайте:
- 2D или 3D. А то, может и их симбиоз (например, Introduction to ArcGIS Pro Где-то на просторах Интернета я видел и русскоязычную версию этого видео)
- достаньте "Бритву Оккама" и спроектируйте поддерживаемые примитивы рисования (например, точка, линия, полигон,... Стоит ли к ним добавить мульти-точку, мульти-линию,... в качестве самостоятельных примитивов, как рисовать кривые в случае искажений при перепроецировании и т.д.)
- теперь у вас есть хоть какой-то, но фундамент. Далее потребуется спроектировать векторную и растровую модели. То есть, как векторные и растровые данные будут представлены в ОЗУ, как они будут сопоставлены с примитивами визуализатора, будет ли кеширование и т.д.
- теперь же можно принять решение: векторная природа будет у визализатора или нет
Итог 1-го шага: визуализатор со своим API, позволяющим рисовать все основные примитивы в дискретах и полностью инкапсулирующий понятие "пиксель" от следующих уровней API. Заметьте, пока никакой речи о географической составляющей не ведётся.
-
- Активный участник
- Сообщения: 218
- Зарегистрирован: 21 дек 2012, 01:57
- Репутация: 52
- Откуда: Питер
Re: Map Viewer
Можно и так. Но это будет работать только на небольшом кол-ве объектов. При увеличении всё начнёт тормозить.virtu писал(а):Может кто-нибудь подскажет, правильно ли я начинаю думать..? ..о следующем, что нужно сделать:
1. Определить прямоугольную область:
QRectF((QPointF(-180, 90), QPointF(180, -90))
2. Написать код:
coordToPixel(double x, double y)....
3. Нарисовать линию:
QPoint point1 = coordToPixel(QPointF(144.140625, 47.517201));
QPoint point2 = coordToPixel(QPointF(-45.703125, 78.490552));
this->addLine(point1, point2);
Пойду по-экспериментирую...
Для скорости надо конвертировать объекты геометрии целиком + сразу задумываться о возможном применении графических ускорителей. Для начала лучше освоить существующие библиотеки работы с геометрией. Для C++ можно попробовать http://trac.osgeo.org/geos/
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 20 фев 2015, 07:48
- Репутация: 0
Re: Map Viewer
Про "квадратный" пиксель конечно же я знал, но про другой... У меня есть книжка, старенькая, но вроде еще моет быть актуальна - "Фень Юань. Программирование графики для WINDOWS". Я ее не читал, но как-то на просторах интернета слышал, что это "золото". Как раз берегу для подобного случая.avk писал(а):Предлагаю начать с результата (то есть, с конца):
1) сначала визуализатор с абстракцией дискрет (заодно подумайте какой у вас будет пиксель: квадратный или нет )
2) затем к визуализатору нужно будет "прикрутить" проекции и соотвествующие преобразования
3) решая задачу выбора и управления проекциями вы дойдёте и до геодезической основы (если, конечно, лукавый вас не сделает активным пользователем proj4 )
Похоже, что proj.4 - это некий стандарт вроде того же GDAL.
Пока 2D, по-моему, с этого проще начать?avk писал(а):Итак, визуализатор.
Решайте:
- 2D или 3D. А то, может и их симбиоз (например, Introduction to ArcGIS Pro Где-то на просторах Интернета я видел и русскоязычную версию этого видео)
Векторно-растровая природа - бывает такое?avk писал(а): - достаньте "Бритву Оккама" и спроектируйте поддерживаемые примитивы рисования (например, точка, линия, полигон,... Стоит ли к ним добавить мульти-точку, мульти-линию,... в качестве самостоятельных примитивов, как рисовать кривые в случае искажений при перепроецировании и т.д.)
- теперь у вас есть хоть какой-то, но фундамент. Далее потребуется спроектировать векторную и растровую модели. То есть, как векторные и растровые данные будут представлены в ОЗУ, как они будут сопоставлены с примитивами визуализатора, будет ли кеширование и т.д.
- теперь же можно принять решение: векторная природа будет у визализатора или нет
То есть, например, загружаю тайлы OpenStreetMap (картинки, те же растры, если не ошибаюсь), а по-верх них рисую точки, линии, полигоны...
Я Вас понял, пойду читать книгу - "Фень Юань. Программирование графики для WINDOWS".avk писал(а): Итог 1-го шага: визуализатор со своим API, позволяющим рисовать все основные примитивы в дискретах и полностью инкапсулирующий понятие "пиксель" от следующих уровней API. Заметьте, пока никакой речи о географической составляющей не ведётся.
-
- Интересующийся
- Сообщения: 17
- Зарегистрирован: 20 фев 2015, 07:48
- Репутация: 0
Re: Map Viewer
А что Вы имеете ввиду под "конвертацией объектов геометрии целиком"?Sergey Astakhov писал(а): ...
Для скорости надо конвертировать объекты геометрии целиком + сразу задумываться о возможном применении графических ускорителей.
....
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя