Как создать свои карты для андроид

Разработка картографических и геолокационных мобильных приложений

Этот пост участвует в конкурсе „Умные телефоны за умные посты»

В статье освещены основные моменты при разработке картографических и геолокационных мобильных приложений с использованием QtQuick/QML. Рассматриваемый в статье пример поможет вникнуть в суть и основы использования API модуля Location из QtMobility.

В конце статьи читателю станет понятно, как мало кода необходимо для реализации базового функционала картографического приложения, такого как отображение карты, перемещение и изменение масштаба карты, так называемым, “щипком”. Для этого жеста воспользуемся элементом PinchArea, который был представлен в Qt Quick 1.1. Так же для изменения масштаба могут использоваться клавиши увеличения/уменьшения громкости.

Плюс я поведаю что нужно сделать, для использования карт не только от Nokia, но и от Google и OpenStreetMap. Для доступа к дополнительным картам необходимо собрать проект с плагинами для Qt. Для отображения карт необходимо подключение к интернету, но тайлы загружаются один раз и затем запросы кешируются во временной папке. Расположение и размер кеша настраиваемые.

Описание сборки проекта и плагинов основывается на утверждении, что у читателя установлен QtSDK последней версии и прописаны все системные пути к библиотекам (и умение всем этим пользоваться, конечно же).

Дополнительные плагины

Для использования карт от Google и OpenStreetMap необходимо скачать проект с плагинами, либо в виде архива, либо клонировать репозиторий с gitorius.
Для сборки я использовал QtCreator, поэтому буду описывать сборку на основе имеющегося опыта.
При открытии проекта в QtCreator он предложит настроить конфигурацию сборки, выбираете «Эмулятор Qt» и нажимаете Ctrl+B.
Когда сборка завершиться, создайте отдельную папку и назовите ее /geoservices, и положите в нее получившиеся библиотеки. Для того чтобы Qt искала наши плагины в этой папке, нужно либо положить эту папку рядом с исполняемым файлом приложения, либо добавить путь для поиска вызвав QApplication::addLibraryPath() в функции main. Всё, расширения готовы к использованию, можно переходить к нашему приложению.

Картографическое приложение

Итак, приступим, наконец-то, к созиданию. Для создания приложения можно воспользоваться стандартным Qt Quick шаблоном предоставленным в QtCreator. Все изменения будут происходить в main.qml, открываем этот файл, удаляем всё что было добавлено и приступаем к написанию картографического приложения.
Сначала конечно же нужно подключить необходимые модули:

Для отображения карт в модуле Location есть такой прекрасный элемент как Map, ему нужно установить плагин с именем отображаемой карты и установить фокус:

В принципе, вы уже можете испытать приложение, оно правда не умеет реагировать на события, но для отображения карты больше ничего не нужно. Конечно же, мы не остановимся и продолжим расширять функционал. Итак, пусть карта показывает нам нашу всеми любимую столицу и для этого зададим карте центр и масштаб.

Теперь можно добавить функционал для реагирования на действия пользователя.
Начнем с реализации щипка.

Вся реализация такого функционала заняла 22 строчки кода, не плохо, не правда ли?
Итак, осталось реализовать перемещение карты и добавить изменение масштаба клавишами.

И для того чтобы карта не была совсем скучной, добавим булавку в стиле Google.

Результат получившегося приложения, можно наблюдать на скриншотах:

Заключение

Итак, с минимальными усилиями мы получили рабочее картографическое приложение, количество кода так же минимально. В итоге мы получили элемент который можно встраивать в любое приложение, где нужно показать например какую-то информацию об адресе офиса или магазина, можно отобразить путь от метро до офиса, да и просто отобразить карту. Примеров использования, конечно же, масса. Плюс, на примере исходников к дополнительным плагинам можно реализовать работу с любыми картографическими сервисами, которые поддерживают работу с тайлами (Bing как пример). Для размещения на карте различных элементов, присутствуют такие как:

  • MapRectangle
  • MapCircle
  • MapText
  • MapImage
  • MapPolygon
  • MapPolyline
  • MapGroup
Читайте также:  Frp bypass add rom android 7

Все элементы и события мыши работают в координатах карты, что избавляет программиста от конвертации и облегчает работу с элементами. Например, у MapCircle есть такое свойство как radius, оно хранит значение в метрах и при изменении масштаба карты круг либо увеличивается, либо уменьшается.

Источник

Приложения для создания Карт на Андроид

Подборка приложений, с помощью которых можно создавать и редактировать карты на смартфонах под управлением Android. Одной из лучших утилит с подобными возможностями является Map Draw. Программа позволяет не только пользоваться картами на мобильном устройстве, но и оставлять важные пометки. Благодаря этому проще запомнить расположение определенных мест или составить маршрут. В приложении можно открыть стандартную, спутниковую и гибридную карту, а затем найти на ней любой адрес по названию. Есть возможность нанести отметки, добавить надпись и сохранить изменения в виде JPG изображения.

По схожему принципу работает утилита MapTiler. С ее помощью можно рисовать на карте линии, ставить пометки, планировать маршрут и многое другое. Программа способна определить текущее местоположение по GPS. В ней можно создавать заметки с текстом и фотографиями, которые связаны с определенным адресом на карте. Приложение предоставляет доступ к облачному хранилищу MapTiler Cloud, куда сохраняются внесенные изменения. Программа позволяет загружать карты в PDF формате, аэрофотоснимки беспилотников, планы города и так далее.

Аналогичный функционал имеет популярный мобильный сервис 2ГИС. В нем предусмотрен встроенный конструктор карт, с помощью которого можно добавлять собственную разметку. Есть возможность составлять маршруты, выделять области и отмечать важные места. Утилита позволяет рисовать на карте различные фигуры и объекты.

Существуют и другие утилиты, в которых можно создавать собственные маршруты и отмечать позиции. Например, приложение Яндекс Карты дает возможность наносить схемы проезды и сохранять в высоком качестве для печати. Некоторые программы позволяют поделиться заметками с друзьями и показать правильный маршрут.

Источник

Как создать свою собственную карту на Андроид?

Можно ли создать свою собственную рамку?
Люди подскажите можно ли создать свою собственную рамку. не из стандартных, а свою. если можно то.

VTK не могу создать свою карту vtk.vtkDataSetMapper
Собсно есть вот такой код. import vtk # The source file file_name = «1.vtk» # Create a.

Какова примерно трудоёмкость задачи — написать свою собственную ORM?
Какова примерно трудоёмкость задачи — написать свою собственную ORM ? Т.е. сколько по времени.

Какой тип файла в Windows может содержать свою собственную иконку?
Привет всем! Подскажите, пожалуйста, кто сталкивался, какой тип файла в Windows может содержать.

От сочетания разрешения карты с размерами местности. Квадратный километр равняется миллиону квадратных метров, но триллиону квадратных миллиметров, если отрисовывать каждую тонную глыбу, то в метре будет менее десятка векторов и не во всяком, но если каждую пылинку, то в каждом квадратном миллиметре могут быть тысячи векторов. А если тысяча на тысячу километров? А если вся Евразия? Другое дело, что в большинстве случаев это не нужно, но всё зависит от того, чего хотим получить. Если это игровая карта и персонажи — амёбы, то пылинки нужны. На какой местности? А это зависит от того, на какое расстояние амёба может в ходе игры путешествовать и может ли что то важное происходить за сиюсекундным кадром. К лапам перелётных птиц можем цепляться? Переноситься ураганом? Может игра по миру, где сверхзвуковой ветер — норма? Состряпать не реализуемое ТЗ на электронную карту не так сложно, как кажется.

Читайте также:  Отследить где айфон с андроида

Источник

Весь мир в кармане или как сделать мобильную карту за пару дней

В прошлой статье я рассказывал о том, как можно быстро сделать Web-звонилку. А что если поставить более амбициозную задачу — собрать своё собственное приложение с картой, без рекламы и с блэк-джеком? А если всего за пару дней?

Давайте сделаем это! Прошу под кат.

Для начала разберёмся, что нам предстоит сделать. На выходе мы хотим получить приложение со справочными данными и картой. И чтоб работало офлайн. Как разработчика меня в первую очередь интересует как раз карта, ведь показывать справочные данные мы и так умеем. А офлайн — довольно сильное ограничение в этом случае, ведь хороших библиотек с поддержкой офлайна не так много. Поэтому в статье сконцентрируемся на карте, а про справочник поговорим вскользь.

Выбираем движок карты

Первое, что нужно сделать — добыть данные для приложения. На рынке много источников, бесплатных и не очень. Для старта нам вполне подойдёт OpenStreetMap как открытый источник картографических данных. Там же можно взять и какое-то количество POI для нашего справочника.

Следующий шаг — выбираем картодвижок. На просторах интернета их довольно мало, бесплатных ещё меньше, а с поддержкой офлайна вообще единицы. Предлагаю воспользоваться довольно крутым вариантом — mapsforge/vtm. Это векторный OpenGL движок, очень шустрый, поддерживает офлайн, Android, iOS, различные источники данных, кастомную стилизацию, оверлеи, маркеры, 3D и даже 3D-модели объектов! Очень, очень круто.

В репозитории достаточно много примеров для быстрого старта, есть готовые карты, есть плагин, позволяющий собрать собственную карту из данных в OSM формате. Итак, приступаем!

Создаём источник данных MapFileTileSource, указываем местонахождение файла карты. Дополнительно позиционируемся в центр интересующего нас баундинг-бокса, чтоб не оказаться где-то за пределами выбранной локации при старте приложения. Устанавливаем дефолтную тему. Добавляем слой домов и слой подписей. На этом всё. Запускаем — чудеса!

Кажется, быстрее и проще и быть не может.

Делаем геокодинг

Следующий важный шаг — реализация геокодинга. Сама по себе карта — это уже неплохо, но нужна интерактивность. Мы хотим тапать в карту и видеть информацию по объекту, в который попали. И здесь есть некоторая сложность. По большому счёту, полноценный геокодинг в нашей библиотеке отсутствует. Это, пожалуй, самый большой её минус. Если ничего не изобретать, то мы можем воспользоваться имеющейся функциональностью.

Получилось относительно многословно. Нужно найти тайл, получить ways (в терминологии OSM way — это линейный объект), и можно из них извлечь какую-то атрибутику. Помимо ways есть возможность получить ещё и POI, но на этом всё. Остальную логику придется накручивать самостоятельно: выбирать «правильный» из всего множества объектов, в которые попал клик, фильтровать по зум-левелам. И ещё один момент. Фактически, мы теряем информацию об исходной геометрии и получаем в ответ на поиск просто набор линий. Если захочется сделать ещё и гео-редактор, то этого явно будет недостаточно.

Но для демонстрации подхода нас всё устраивает.

«Продвинутый» геокодинг

Вообще говоря, есть более продвинутый вариант. Для этого нам понадобится своя база. В частности, можно воспользоваться SQLite. Правда, нам недостаточно будет стандартного SQLite, и придётся собирать свой, подключив к нему плагин RTree для геопоиска. Как это сделать, я уже рассказывал в статье, раздел «Делаем хороший поиск».
В этом случае мы получаем полный контроль над данными, можем сохранять всё, что требуется, и в нужном формате. Еще и Full Text Search сможем прикрутить и искать наши геообъекты и фирмы по названию, адресу и другим атрибутам.

  1. Делаем таблицы:
    • геообъектов (id, type, geometry, attributes)
    • фирм (id, attributes, geo_id) со ссылкой на геометрию здания, в котором она находится
    • геоиндекса на rtree вот так:
  2. Наполняем всё данными.
  3. При тапе в карту получаем GeoPoint и выполняем запрос:
  4. Последний шаг: фильтруем и выбираем подходящий объект.
Читайте также:  Тема для андроида кошка

Один из вариантов реализации можно посмотреть в репозитории.

В итоге мы уже умеем показывать карту и обрабатывать нажатия. Неплохо.

Добавляем важные мелочи

Давайте добавим пару важных функций.

Начнём с текущей геопозиции. В mapsforge/vtm для этого как раз имеется спец. слой LocationLayer. Использование крайне простое.

Есть только один недостаток — это постоянная пульсация «синей точки» на границе экрана, когда текущая локация находится за пределами карты. Скорее всего, в процессе использования вы редко будете оказываться в такой ситуации, но это вызывает постоянный перерендеринг, соответственно, немного нагружает процессор. Избавиться от этого немного сложнее, нужно залезть в шейдер и поправить его. Но это уже совсем для перфекционистов. Как сделать — можно посмотреть тут.

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

Ещё нам понадобятся кнопки зума.

И вишенка на торте — компас.

Захватываем мир

Друзья, мы на финишной прямой. Осталось добавить последний штрих. Мы ведь планируем захват мира, а это значит, что его нужно как-то запихать в наше приложение.

И дела обстоят так, что с нашим движком это намного проще, чем кажется.
Нам нужно немного модифицировать метод загрузки карты, добавив в него MultyMapTileSource. Это по сути враппер для любых других источников тайлов, который позволяет отображать на карте сразу всё, что в него добавлено. Просто киллер-фича. В итоге нам остаётся подготовить карту мира с минимальной детализацией, добавить её самой первой в наш враппер, а поверх рисовать всё остальное. Более того, мы можем сразу добавить все карты, какие у нас есть в каталоге с картами приложения! Шикарно, просто шикарно. И не забываем, что это офлайн 🙂

Пожалуй, мы готовы к релизу. Собираем билд, выкладываем в маркет и получаем заслуженные звёзды 🙂

Пара ложек дёгтя в огромной бочке мёда

Движок open source, развивается активно, но команда у него, прямо скажем, довольно скромная. По большому счёту это один человек под ником devemux86. И ещё пара ребят контрибьютят время от времени.

Порой встречаются артефакты в отрисовке, какие-то моргания и подёргивания. Но я ни разу не столкнулся с какими-то критическими проблемами и тем более падениями, что не может не радовать.

Есть еще один нюанс, который может не понравиться. Это отрисовка скруглений и окружностей. Пример того, как это выглядит, на скриншоте:

Если в исходной геометрии достаточно много точек (скругление гладенькая), то на карте вы можете увидеть довольно-таки «угловатую» окружность с множеством небольших выпуклостей и вогнутостей. Очевидно, это делается в угоду производительности и размеру map-файла, но выглядит не очень.

Пожалуй, это все минусы на сегодня. Вам решать, сможете вы с ними жить или нет. А мы тем временем используем эту библиотеку уже более 1,5 лет, полёт отличный, по крайней мере, на Андроиде.

Итоги

В этой статье я показал, что даже такую довольно нетривиальную задачу можно решить относительно быстро. Вы получили готовый скелет, с которым можно запрототипировать любой проект, подразумевающий использование офлайн-карты, за минимальное время.

Если возникнет интерес, в следующей статье покажу, как сделать этажи а-ля 2ГИС. И это на самом деле гораздо проще, чем кажется 🙂

Источник

Оцените статью