- PVSM.RU - https://www.pvsm.ru -

GPS трекер на Qt, карта и трек

Решил попрактиковаться в программирование под Android на Qt. В качестве темы выбрал GPS трекер.
Набор функций этого трекера:

  • снимать измерения с GPS приемника;
  • экспортировать трек в GPX (GPS eXchange Format [1]);
  • выводить трек на карту;
  • выводить время в пути, длину пути, среднюю скорость.

Под катом будет приведен пример работы с картой в QtQuick.

Plugin, PluginParameter и Map

Базовые типы находятся в модуле Qt Location. Qt Location в качестве бакенда может использовать:

Работа с конкретным поставщиком карт помещена в плагины(Plugin [5]), которые настраиваются через параметры(PluginParameter [6]).

Минимальный пример:

Plugin {
  id: plugin
  preferred: ["here", "osm"]
  required: Plugin.AnyMappingFeatures | Plugin.AnyGeocodingFeatures
}

Map {
    plugin: plugin

    width: ...
    height:...

}

Поначалу использовал просто Open Street Map:

Plugin {
     id: plugin
     name: "osm"
}

По умолчанию поставщиком OSM карт является MapQuest [7], который с недавних пор ввели ключ разработчика. Тут встал вопрос о переходе на что-то другое.

Open Street Map Plugin

В документации перечислены поддержка:

  • MapQuest;
  • ThunderForest [8];
  • OpenStreetMap и сообщество.

Для того, что бы воспользоваться последним пунктом нужно выполнить два условия:

Задать параметр osm.mapping.host:

Plugin {
     id: mapPlugin
     name: "osm"
     PluginParameter {
         name: "osm.mapping.host";
         value: "http://a.tile.openstreetmap.org/"
     }
}

Карте указать использовать тип карт MapType.CustomMap.
Для любителей магии:

Map {
    id: map
    plugin: mapPlugin
    activeMapType: map.supportedMapTypes[7]
}

Что бы не надеяться на позицию элемента в списке supportedMapTypes, можно сделать так:

Map {
    id: map

    plugin: mapPlugin
    zoomLevel: 16

    width: item.width
    height:item.height

    property MapPolyline track
}

Timer {
    interval: 100; running: true; repeat: false
    onTriggered: {
        for(var i = 0;
            i < map.supportedMapTypes.length;
            ++i){
            if(map.supportedMapTypes[i].style
                    === MapType.CustomMap){
                map.activeMapType = map.supportedMapTypes[i];
            }
        }
    }
}

Трек

Для рисования трека взял элемент MapPolyline [9], при этом создаю его динамически, для очищения карты:

function start() {
    mapItem.clearMapItems();
    mapItem.track = Qt.createQmlObject('import QtLocation 5.6; MapPolyline {}', item);
    mapItem.track.line.width = 6;
    mapItem.track.line.color = 'red';
    mapItem.addMapItem(mapItem.track);

}

function appendCoordinate(position){
    mapItem.center = position;
    mapItem.track.addCoordinate(position)
}

Map {
    id: mapItem

    plugin: mapPlugin
    zoomLevel: 16

    width: item.width
    height:item.height

    property MapPolyline track
}

При старте очищаю карту, создаю трек и помещаю на карту. При добавлении новой координаты центр карты перемещается в указанную позицию и удлиняется трек.

Результат:

GPS трекер на Qt, карта и трек - 1 GPS трекер на Qt, карта и трек - 2 GPS трекер на Qt, карта и трек - 3
Код доступен на GitHub [10]

Автор: RPG18

Источник [11]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/programmirovanie/159750

Ссылки в тексте:

[1] GPS eXchange Format: https://ru.wikipedia.org/wiki/GPX

[2] HERE: https://here.com

[3] Mapbox: https://www.mapbox.com/

[4] Open Street Map: https://www.openstreetmap.org

[5] Plugin: http://doc.qt.io/qt-5/qml-qtlocation-plugin.html

[6] PluginParameter: http://doc.qt.io/qt-5/qml-qtlocation-pluginparameter.html

[7] MapQuest: https://www.mapquest.com/

[8] ThunderForest: http://www.thunderforest.com/

[9] MapPolyline: http://doc.qt.io/qt-5/qml-qtlocation-mappolyline.html

[10] GitHub: https://github.com/RPG-18/SimpleGPSTracker

[11] Источник: https://habrahabr.ru/post/306076/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best