MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
Некоторые приемы работы с типом Map, PositionSource и прочими геолокационными элементами
08.08.2018
13:12
Текстовые метки: qt, qml, map, PositionSource, карты, картография, геолокация
Раздел: Компьютер - Программирование - Язык C++ - Библиотека Qt - Картография в Qt и QML

В: Какие основные типы QML используются при работе с картографией в QML?


О: Для отображения карты используется тип Map. Для работы с позиционированием на карте используется Positioning API. Его основные типы:


  • PositionSource - подписка на уведомления источника информации о местоположении
  • Position - время, координаты, скорость, информация о точности полученных данных.
  • Location - человеко-читаемое описание местоположения (например, адрес) в связке с географическими координатами
  • Coordinate - координаты: широта, долгота и высота


При работе с этими элементами есть много тонкостей, Например, чтобы начал работать элемент типа PositionSource, его нужно активировать PositionSource.active=true и задать ему свойство updateInterval.



В: Как получить географические координаты точки на карте типа Map, в месте, где пользователь коснулся экрана?


О: Функция toCoordinate() типа Map переводит экранные координаты объекта в глобальные. Коснулись объекта на экране – получили координаты:



onPressed: {

  console.log('latitude = '+ (map.toCoordinate(Qt.point(mouse.x,mouse.y))).latitude);

  console.log('longitude = '+ (map.toCoordinate(Qt.point(mouse.x,mouse.y))).longitude);

}




В: Какие данные можно вытянуть из типа PositionSource?


О: Следующий код демонстрирует отладочный вывод о свойствах объекта типа PositionSource:



Rectangle {

    id: page

    width: 350

    height: 350

    PositionSource {

        id: positionSource

        updateInterval: 1000

        active: true

        // nmeaSource: "nmealog.txt"

    }

    Column {

        Text {text: "<==== PositionSource ====>"}

        Text {text: "positioningMethod: " + printableMethod(positionSource.positioningMethod)}

        Text {text: "nmeaSource: "         + positionSource.nmeaSource}

        Text {text: "updateInterval: "     + positionSource.updateInterval}

        Text {text: "active: "     + positionSource.active}

        Text {text: "<==== Position ====>"}

        Text {text: "latitude: "  + positionSource.position.coordinate.latitude}

        Text {text: "longitude: "  + positionSource.position.coordinate.longitude}

        Text {text: "altitude: "  + positionSource.position.coordinate.altitude}

        Text {text: "speed: " + positionSource.position.speed}

        Text {text: "timestamp: " + positionSource.position.timestamp}

        Text {text: "altitudeValid: " + positionSource.position.altitudeValid}

        Text {text: "longitudeValid: " + positionSource.position.longitudeValid}

        Text {text: "latitudeValid: " + positionSource.position.latitudeValid}

        Text {text: "speedValid: "     + positionSource.position.speedValid}

    }

    function printableMethod(method) {

        if (method == PositionSource.SatellitePositioningMethod)

            return "Satellite";

        else if (method == PositionSource.NoPositioningMethod)

            return "Not available"

        else if (method == PositionSource.NonSatellitePositioningMethod)

            return "Non-satellite"

        else if (method == PositionSource.AllPositioningMethods)

            return "All/multiple"

        return "source error";

    }

}



В: Как можно добавить на карту дополнительные элементы: кружки, линии, надписи?


О: В качестве дочерних сущностей элемента Map на карту могут быть добавлены различные элементы, такие как MapRectangle, MapCircle, MapText, MapImage, MapPolygon, MapPolyline и т.п. Эти элементы будут отображаться автоматически в указанной позиции. Их очень удобно использовать для установки различных меток на карте, отображения маршрутов, областей и всего, чего только может понадобиться.

К примеру, вот так можно отобразить текст на карте в нужной нам позиции:



MapText {

id: texts

    coordinate: Coordinate {latitude: 54.914; longitude: 73.313}

    color: "yellow"

    text: "Samarka"

    font.pixelSize: 10

}



Или, вот так — желтым кружочком можно пометить на карте текущие координаты пользователя:



MapCircle {

    id: userPosition

    color: "yellow"

    radius: 10

    center: userPositionSource.position.coordinate

}



В: Какие типы карт указываются в свойстве mapType?


О: Доступны следующие типы:

  • Map.StreetMap
  • Map.SatelliteMapDay
  • Map.SatelliteMapNight
  • Map.TerrainMap
  • Map.HybridMap
  • Map.TransitMap
  • Map.GrayStreetMap
  • Map.MobileStreetMap
  • Map.MobileTerrainMap
  • Map.MobileHybridMap
  • Map.MobileTransitMap
  • Map.MobileGrayStreetMap

Для корректного отображения тип карты должен, конечно же, поддерживаться провайдером.


В более новых версиях QML, имеется отдельный тип MapType, и в его свойстве style заявлена поддержка следующих вариантов:


  • MapType.NoMap - No map.
  • MapType.StreetMap - A street map.
  • MapType.SatelliteMapDay - A map with day-time satellite imagery.
  • MapType.SatelliteMapNight - A map with night-time satellite imagery.
  • MapType.TerrainMap - A terrain map.
  • MapType.HybridMap - A map with satellite imagery and street information.
  • MapType.GrayStreetMap - A gray-shaded street map.
  • MapType.PedestrianMap - A street map suitable for pedestriants.
  • MapType.CarNavigationMap - A street map suitable for car navigation.
  • MapType.CycleMap - A street map suitable for cyclists.
  • MapType.CustomMap - A custom map type.



В: Как заставить передвигаться центр карты вслед за координатами?


О: Например, так:


Item {

id: root


// Координаты транспортного средства (в градусах)

property double geoTransportLatitude: 0

property double geoTransportLongitude: 0



// Координаты, пригодные для использования совместно с объектом карты

Location {

id: location


coordinate {

latitude: root.geoTransportLatitude

longitude: root.geoTransportLongitude

}

}


Binding {

target: map

property: "center"

value: location.coordinate

when: location.coordinate.isValid

}


Map {

id: map


plugin: mapPlugin


zoomLevel: 15


width: root.width

height: root.height


}



В: Как можно передвигаться по карте не скачкообразно, а плавно?


О: Передвигаться по карте можно не только скачкообразно, но и плавно, используя функцию map.pan(dx, dy). Где dx, dy – смещение влево/вправо и верх/вниз относительно предыдущей позиции.



 
MyTetra Share v.0.52
Яндекс индекс цитирования