- PVSM.RU - https://www.pvsm.ru -
Решил попрактиковаться в программирование под Android на Qt. В качестве темы выбрал GPS трекер.
Набор функций этого трекера:
Под катом будет приведен пример работы с картой в QtQuick.
Базовые типы находятся в модуле 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], который с недавних пор ввели ключ разработчика. Тут встал вопрос о переходе на что-то другое.
В документации перечислены поддержка:
Для того, что бы воспользоваться последним пунктом нужно выполнить два условия:
Задать параметр 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
}
При старте очищаю карту, создаю трек и помещаю на карту. При добавлении новой координаты центр карты перемещается в указанную позицию и удлиняется трек.
Результат:
Код доступен на 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
Нажмите здесь для печати.