Map Viewer

Вопросы по нескольким пакетам сразу, или вопросы, которые непонятно к какой ГИС отнести
virtu
Интересующийся
Сообщения: 17
Зарегистрирован: 20 фев 2015, 07:48
Репутация: 0

Map Viewer

Сообщение virtu » 03 май 2015, 12:44

Здравствуйте.
Пытаюсь сделать простой Map Viewer (С++ Qt) - просмотрщик карт (например .mp - польский формат). Понимаю, что изобретаю велосипед, и можно было бы использовать QGIS, но хочется в целях, так сказать, самообразования.
Мне бы понять по какому принципу строятся подобные "вьюверы".
Допустим если взять те же самые Qtшные виджеты QGraphicsView и QGraphicsScene, или любой другой компонент, - как на сцене нарисовать линию, точку или полигон имея координаты в формате Долгота: 130.741231 | Широта: 42.794436 ? Как в этих компонентах установить нужную проекцию? Да и вообще порядок программирования подобных приложений, с чего начать?

Аватара пользователя
paleogis
Модератор
Сообщения: 1112
Зарегистрирован: 22 мар 2009, 08:54
Репутация: 200
Ваше звание: Модератоо

Re: Map Viewer

Сообщение paleogis » 03 май 2015, 20:33

virtu писал(а):Пытаюсь сделать простой Map Viewer (С++ Qt) - просмотрщик карт (например .mp - польский формат). Понимаю, что изобретаю велосипед, и можно было бы использовать QGIS, но хочется в целях, так сказать, самообразования.
Мне бы понять по какому принципу строятся подобные "вьюверы".
Изобретать велосипед-это не всегда правильно, лучше уж написать плагинчик для QGIS, профита будет больше. Или можно сделать новую морду для QGIS, оптимизированную под тачскрин, например для андроид версии. А то многие на форуме пишут, даешь на смартфон полноценную ГИС. Работая над QGIS, Вы хорошо поймете "по какому принципу строятся подобные "вьюверы"".
https://github.com/qgis

Sergey Astakhov
Активный участник
Сообщения: 218
Зарегистрирован: 21 дек 2012, 01:57
Репутация: 52
Откуда: Питер

Re: Map Viewer

Сообщение Sergey Astakhov » 04 май 2015, 00:16

virtu писал(а):Допустим если взять те же самые Qtшные виджеты QGraphicsView и QGraphicsScene, или любой другой компонент, - как на сцене нарисовать линию, точку или полигон имея координаты в формате Долгота: 130.741231 | Широта: 42.794436 ? Как в этих компонентах установить нужную проекцию?
Т.к. эти компоненты ничего про проекции не знают - вам надо будет это запрограммировать самому. Т.е. написать код, который из исходных координат сформирует координаты в пикселах. Ну а дальше по этим пиксельным координатам - обычное рисование средствами выбранной библиотеки.

ericsson
Гуру
Сообщения: 3321
Зарегистрирован: 27 июл 2009, 19:26
Репутация: 748
Ваше звание: Вредитель полей

Re: Map Viewer

Сообщение ericsson » 04 май 2015, 01:21

Если принципиально использование Qt, можно посмотреть вот на этот проект https://marble.kde.org/features.php

virtu
Интересующийся
Сообщения: 17
Зарегистрирован: 20 фев 2015, 07:48
Репутация: 0

Re: Map Viewer

Сообщение virtu » 04 май 2015, 02:12

paleogis писал(а):Изобретать велосипед-это не всегда правильно, лучше уж написать плагинчик для QGIS, профита будет больше. Или можно сделать новую морду для QGIS, оптимизированную под тачскрин, например для андроид версии. А то многие на форуме пишут, даешь на смартфон полноценную ГИС. Работая над QGIS, Вы хорошо поймете "по какому принципу строятся подобные "вьюверы"". https://github.com/qgis
QGIS конечно же Великий монстр - в хорошем смысле этих слов. Но для понимания как работает, вернее, с чего начинается рисование будет сложно понять. Можно использовать QGIS-ные библиотеки и прикрутить его вьювер к своей программе, но опять же, сама идея и сам порядок программирования рисовальщика ускользнет от понимания. Я не использовал QGIS, но я немного использовал другую либу, вернее исходники проги Merkaator-а, там вроде бы просто, но все же тупой копи-паст без понимания принципа не очень подходит и порядок программирования ускользал.
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: Я немного тугодум, но прошу научить меня правильно думать :roll:
ericsson писал(а):Если принципиально использование Qt, можно посмотреть вот на этот проект https://marble.kde.org/features.php
Желательно.
Я раньше программировал чисто под консоль, а когда столкнулся с GUI, то Qt оказался самой лучшей из всего, что есть на С++.
Спасибо за ссылку, посмотрю.

Аватара пользователя
avk
Новоприбывший
Сообщения: 10
Зарегистрирован: 04 май 2015, 02:30
Репутация: 3
Откуда: Санкт-Петербург

Re: Map Viewer

Сообщение avk » 04 май 2015, 03:00

Подводных камней вас ждёт немало.
Например:
1) увязка целочисленных двухмерных координат монитора и трёхмерных float- или double- координат реального Мира
2) принятие и обслуживание ряда абстракций (введение дискрет, введение проекции сферообразной Земли /в общем случае/, введение масштаба визуализации и т.д.). К сожалению, потребуется реализация в коде того пути, что пройден различными географическими ВУЗами, НИИ и сообществами: геодезическая основа -> математическая основа -> визуализация
3) принятие решения о природе визуализатора: векторный или растровый. Например, у QGIS он в отношении примитивов рисования - векторный. В других программах программисты предпочитают сразу рендерить картинку. Векторный визуализатор позволит более точно обеспечивать метричность преобразований и визуализации, но потребует хорошую продуманную архитектуру, сильно нагрузит графику компьютера и обяжет заниматься генерализацией. Растровый потребует поддерживать сложную модель соответствия (например, какие пиксели должны начать мигать при выделении площадного объекта).
4) и много ещё интересного и тернистого. Даже забористого :shock:

Как вариант, можете посмотреть заголовочные файлы комплекта разработчика GIS Toolkit (КБ "Панорама"). Они поставляются вместе с GIS Toolkit и могут быть скачаны с сайта производителя. Один из них прикладываю (смотрите раздел "ФУНКЦИИ ОТОБРАЖЕНИЯ И ПЕЧАТИ ЭЛЕКТРОННОЙ КАРТЫ"). Только по названиям и параметрам функций уже можно понять с какой стороны подходить к снаряду.
Вложения
mapapi.h
(522.42 КБ) 674 скачивания

virtu
Интересующийся
Сообщения: 17
Зарегистрирован: 20 фев 2015, 07:48
Репутация: 0

Re: Map Viewer

Сообщение virtu » 04 май 2015, 03:54

avk писал(а):Как вариант, можете посмотреть заголовочные файлы комплекта разработчика GIS Toolkit (КБ "Панорама"). Они поставляются вместе с GIS Toolkit и могут быть скачаны с сайта производителя. Один из них прикладываю (смотрите раздел "ФУНКЦИИ ОТОБРАЖЕНИЯ И ПЕЧАТИ ЭЛЕКТРОННОЙ КАРТЫ"). Только по названиям и параметрам функций уже можно понять с какой стороны подходить к снаряду.
Ух-ты :shock: Как все подробно там написано...
Я когда попадал на их сайт и видел цены на их продукт, то сразу закрывал страницу, но я ни когда и подумать не мог, что там такие подробные комментарии.
Спасибо, что открыли мне глаза.

virtu
Интересующийся
Сообщения: 17
Зарегистрирован: 20 фев 2015, 07:48
Репутация: 0

Re: Map Viewer

Сообщение virtu » 04 май 2015, 12:21

avk писал(а):Подводных камней вас ждёт немало.
Например:
1) увязка целочисленных двухмерных координат монитора и трёхмерных float- или double- координат реального Мира
2) принятие и обслуживание ряда абстракций (введение дискрет, введение проекции сферообразной Земли /в общем случае/, введение масштаба визуализации и т.д.). К сожалению, потребуется реализация в коде того пути, что пройден различными географическими ВУЗами, НИИ и сообществами: геодезическая основа -> математическая основа -> визуализация
3) принятие решения о природе визуализатора: векторный или растровый. Например, у QGIS он в отношении примитивов рисования - векторный. В других программах программисты предпочитают сразу рендерить картинку. Векторный визуализатор позволит более точно обеспечивать метричность преобразований и визуализации, но потребует хорошую продуманную архитектуру, сильно нагрузит графику компьютера и обяжет заниматься генерализацией. Растровый потребует поддерживать сложную модель соответствия (например, какие пиксели должны начать мигать при выделении площадного объекта).
4) и много ещё интересного и тернистого. Даже забористого
Не могли бы Вы по порядку изложить суть структуры и по-подробнее? Для начала, с чего бы мне начать ..потом, с чего продолжить, и наконец - чем кончить...

sadless74
Завсегдатай
Сообщения: 310
Зарегистрирован: 25 май 2009, 13:50
Репутация: 43

Re: Map Viewer

Сообщение sadless74 » 04 май 2015, 12:55

Посмотрите редактор OSM https://github.com/openstreetmap/merkaartor он тоже на Qt

[ Сообщение с мобильного устройства ]

sadless74
Завсегдатай
Сообщения: 310
Зарегистрирован: 25 май 2009, 13:50
Репутация: 43

Re: Map Viewer

Сообщение sadless74 » 04 май 2015, 13:00

А есть ещё редактор mapedit++ http://sourceforge.net/projects/gmeaddons/ для которого .mp как родной

[ Сообщение с мобильного устройства ]

virtu
Интересующийся
Сообщения: 17
Зарегистрирован: 20 фев 2015, 07:48
Репутация: 0

Re: Map Viewer

Сообщение virtu » 04 май 2015, 13:27

sadless74 писал(а):А есть ещё редактор mapedit++ http://sourceforge.net/projects/gmeaddons/ для которого .mp как родной
sadless74 писал(а):Посмотрите редактор OSM https://github.com/openstreetmap/merkaartor он тоже на Qt
mapedit++ - скачал только сегодня...
merkaartor - курил уже несколько дней... Ускользает от меня "идея порядка", то есть с чего начать, чем продолжить и как кончить - не совсем понятно...

Аватара пользователя
avk
Новоприбывший
Сообщения: 10
Зарегистрирован: 04 май 2015, 02:30
Репутация: 3
Откуда: Санкт-Петербург

Re: Map Viewer

Сообщение avk » 04 май 2015, 19:29

virtu писал(а): Не могли бы Вы по порядку изложить суть структуры и по-подробнее? Для начала, с чего бы мне начать ..потом, с чего продолжить, и наконец - чем кончить...
Предлагаю начать с результата (то есть, с конца):
1) сначала визуализатор с абстракцией дискрет (заодно подумайте какой у вас будет пиксель: квадратный или нет :shock: )
2) затем к визуализатору нужно будет "прикрутить" проекции и соотвествующие преобразования
3) решая задачу выбора и управления проекциями вы дойдёте и до геодезической основы (если, конечно, лукавый вас не сделает активным пользователем proj4 :D )

Итак, визуализатор.
Решайте:
- 2D или 3D. А то, может и их симбиоз (например, Introduction to ArcGIS Pro Где-то на просторах Интернета я видел и русскоязычную версию этого видео)
- достаньте "Бритву Оккама" и спроектируйте поддерживаемые примитивы рисования (например, точка, линия, полигон,... Стоит ли к ним добавить мульти-точку, мульти-линию,... в качестве самостоятельных примитивов, как рисовать кривые в случае искажений при перепроецировании и т.д.)
- теперь у вас есть хоть какой-то, но фундамент. Далее потребуется спроектировать векторную и растровую модели. То есть, как векторные и растровые данные будут представлены в ОЗУ, как они будут сопоставлены с примитивами визуализатора, будет ли кеширование и т.д.
- теперь же можно принять решение: векторная природа будет у визализатора или нет

Итог 1-го шага: визуализатор со своим API, позволяющим рисовать все основные примитивы в дискретах и полностью инкапсулирующий понятие "пиксель" от следующих уровней API. Заметьте, пока никакой речи о географической составляющей не ведётся.

Sergey Astakhov
Активный участник
Сообщения: 218
Зарегистрирован: 21 дек 2012, 01:57
Репутация: 52
Откуда: Питер

Re: Map Viewer

Сообщение Sergey Astakhov » 04 май 2015, 23:25

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/

virtu
Интересующийся
Сообщения: 17
Зарегистрирован: 20 фев 2015, 07:48
Репутация: 0

Re: Map Viewer

Сообщение virtu » 05 май 2015, 01:28

avk писал(а):Предлагаю начать с результата (то есть, с конца):
1) сначала визуализатор с абстракцией дискрет (заодно подумайте какой у вас будет пиксель: квадратный или нет :shock: )
2) затем к визуализатору нужно будет "прикрутить" проекции и соотвествующие преобразования
3) решая задачу выбора и управления проекциями вы дойдёте и до геодезической основы (если, конечно, лукавый вас не сделает активным пользователем proj4 :D )
Про "квадратный" пиксель конечно же я знал, но про другой... У меня есть книжка, старенькая, но вроде еще моет быть актуальна - "Фень Юань. Программирование графики для WINDOWS". Я ее не читал, но как-то на просторах интернета слышал, что это "золото". Как раз берегу для подобного случая.
Похоже, что proj.4 - это некий стандарт вроде того же GDAL.
avk писал(а):Итак, визуализатор.
Решайте:
- 2D или 3D. А то, может и их симбиоз (например, Introduction to ArcGIS Pro Где-то на просторах Интернета я видел и русскоязычную версию этого видео)
Пока 2D, по-моему, с этого проще начать?
avk писал(а): - достаньте "Бритву Оккама" и спроектируйте поддерживаемые примитивы рисования (например, точка, линия, полигон,... Стоит ли к ним добавить мульти-точку, мульти-линию,... в качестве самостоятельных примитивов, как рисовать кривые в случае искажений при перепроецировании и т.д.)
- теперь у вас есть хоть какой-то, но фундамент. Далее потребуется спроектировать векторную и растровую модели. То есть, как векторные и растровые данные будут представлены в ОЗУ, как они будут сопоставлены с примитивами визуализатора, будет ли кеширование и т.д.
- теперь же можно принять решение: векторная природа будет у визализатора или нет
Векторно-растровая природа - бывает такое?
То есть, например, загружаю тайлы OpenStreetMap (картинки, те же растры, если не ошибаюсь), а по-верх них рисую точки, линии, полигоны...
avk писал(а): Итог 1-го шага: визуализатор со своим API, позволяющим рисовать все основные примитивы в дискретах и полностью инкапсулирующий понятие "пиксель" от следующих уровней API. Заметьте, пока никакой речи о географической составляющей не ведётся.
Я Вас понял, пойду читать книгу - "Фень Юань. Программирование графики для WINDOWS".

virtu
Интересующийся
Сообщения: 17
Зарегистрирован: 20 фев 2015, 07:48
Репутация: 0

Re: Map Viewer

Сообщение virtu » 05 май 2015, 01:35

Sergey Astakhov писал(а): ...
Для скорости надо конвертировать объекты геометрии целиком + сразу задумываться о возможном применении графических ускорителей.
....
А что Вы имеете ввиду под "конвертацией объектов геометрии целиком"?

Ответить

Вернуться в «Общий - ПО»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 31 гость