Требуется ключ QtLocation OSM API - PullRequest
0 голосов
/ 09 мая 2020

Я использую OSM и плагины для карты для приложения QML. Я использую map.activeMapType = map.supportedMapTypes[currentIndex] в ComboBox для отображения поддерживаемых типов карт от поставщиков карт в области карты. Здесь плагин карты работает с параметрами "here.app_id" и "here.token". Но для плагина OSM, ландшафта, общественного транспорта и других плиток, кроме отображения плитки карты улиц, "Требуется ключ API". Я получил ключ API от thunderforest.com . При использовании параметра по-прежнему отображается «Требуется ключ API»:

   ComboBox {
            id: selectmap
            width: parent.width
            model:map.supportedMapTypes
            textRole:"description"
            onCurrentIndexChanged:{
                map.activeMapType = map.supportedMapTypes[currentIndex]
            }
        }
    Plugin {
            id: pluginOSM
            name: "osm"
            PluginParameter { 
                name: "osm.mapping.providersrepository.address"; 
                // name: "osm.geocoding.host"; (also didn't work)
                value: "https://tile.thunderforest.com/transport/{z}/{x}/{y}.png?apikey=<my_api_key>" }
        }

Screenshot

Я также загрузил параметр файла ландшафта из http://maps-redirect.qt.io/osm/5.8/ сайт для использования с qr c, например:

import QtQuick 2.6
import QtQuick.Controls 2.0
import QtLocation 5.12
import QtPositioning 5.12
ApplicationWindow{
    id: root
    width: 500
    height: 700
    visible: true
    Flickable {
        height: parent.height
        width: parent.width
        clip: true
        boundsBehavior: Flickable.StopAtBounds
        contentHeight: Math.max(mapColumn.implicitHeight, height)+50
        ScrollBar.vertical: ScrollBar {}
        z: 2
        Column{
            anchors.horizontalCenter: parent.horizontalCenter
            id:mapColumn
            spacing: 5
            anchors.fill : parent
            Row{
                anchors.horizontalCenter: parent.horizontalCenter
                spacing:25
                id:maprow
                Rectangle{
                width:mapColumn.width
                height:mapColumn.height/2

                Map {
                    id:map
                    anchors.fill: parent
                    plugin: Plugin {
                        name: "osm"
                        PluginParameter {
                            name: "osm.mapping.host";
                            value: "qrc:/terrain"
                        }
                    }
                }

          }
          }

          Column{
              id: combos
              spacing: 10
              width: parent.width
              anchors.verticalCenter: root.verticalCenter
                  Row{
                      anchors.horizontalCenter: parent.horizontalCenter
                      spacing:1
                      Label{ text:"Map Type: " }
                      // Map Types
                      ComboBox {
                          id: selectmap
                          width: 200
                          model:map.supportedMapTypes
                          textRole:"description"
                          onCurrentIndexChanged: map.activeMapType = map.supportedMapTypes[currentIndex]

                      }
                  }
          }
      }
    }
}

В файле ландшафта я обновил параметр как "UrlTemplate" : "https://tile.thunderforest.com/landscape/{z}/{x}/{y}.png?apikey=<api-key>", Это не сработало, пользовательский вид карты был пуст. Можно ли удалить с помощью ключа API? Спасибо

1 Ответ

2 голосов
/ 23 июня 2020

(Скопировано из моей статьи в блоге здесь: http://blog.mikeasoft.com/2020/06/22/qt-qml-maps-using-the-osm-plugin-with-api-keys/)

Это не очевидно, но после небольшого изучения того, как работает плагин OSM, я обнаружил механизм с помощью которого ключ API может быть предоставлен серверам листов, которым он нужен.

Когда плагин OSM инициализируется, он связывается с репозиторием поставщиков Qt, который сообщает ему, какие URL-адреса использовать для каждого типа карты. Расположение репозитория поставщиков можно настроить с помощью свойства плагина OSM osm.mapping.providersrepository.address , поэтому все, что нам нужно сделать, чтобы использовать наш ключ API, - это настроить собственный репозиторий поставщиков с URL-адресами, которые включите наш ключ API в качестве параметра. Сам репозиторий представляет собой просто набор JSON файлов с конкретными c именами ( цикл, аренда велосипеда, походы, найм пеших туристов, ночной транзит, аренда ночного транспорта, спутник, улица, улица -hires, terrain, terrain-hires, transit, transit-hires ), каждый из которых соответствует типу карты. Файлы * -hires предоставляют URL-адреса для тайлов с удвоенным нормальным разрешением для дисплеев с высоким разрешением.

Например, это файл цикла, обслуживаемый репозиторием поставщиков Qt по умолчанию:

{
    "UrlTemplate" : "http://a.tile.thunderforest.com/cycle/%z/%x/%y.png",
    "ImageFormat" : "png",
    "QImageFormat" : "Indexed8",
    "ID" : "thf-cycle",
    "MaximumZoomLevel" : 20,
    "MapCopyRight" : "<a href='http://www.thunderforest.com/'>Thunderforest</a>",
    "DataCopyRight" : "<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors"
}

Чтобы предоставить ключ API с нашими запросами плитки, мы можем просто изменить UrlTemplate:

    "UrlTemplate" : "http://a.tile.thunderforest.com/cycle/%z/%x/%y.png?apikey=YOUR_API_KEY",

Automati c настройка репозитория

Я создал простой инструмент для настройки полного репозитория с использованием настраиваемого ключа API здесь: https://github.com/Elleo/qt-osm-map-providers

  1. Сначала получите ключ API от https://www.thunderforest.com/docs/apikeys/
  2. Следующее клонирование моего репозитория: git clone https://github.com/Elleo/qt-osm-map-providers.git
  3. Выполнить: ./set_api_keys.sh your_api_key (заменив your_api_key ключом, полученным на шаге 1)
  4. Скопируйте файлы из этого репозитория на свой веб-сервер ( например, http://www.mywebsite.com/osm_repository)
  5. Установите свойство osm.mapping.providersrepository.address, чтобы оно указывало на настройку местоположения на шаге 4 (см. пример QML ниже)

Пример QML

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

import QtQuick 2.7
import QtQuick.Controls 2.5
import QtLocation 5.10

ApplicationWindow {

    title: qsTr("Map Example")
    width: 1280
    height: 720

    Map {
        anchors.fill: parent
        zoomLevel: 14
        plugin: Plugin {
            name: "osm"
            PluginParameter { name: "osm.mapping.providersrepository.address"; value: "http://www.mywebsite.com/osm_repository" }
            PluginParameter { name: "osm.mapping.highdpi_tiles"; value: true }
        }
        activeMapType: supportedMapTypes[1] // Cycle map provided by Thunderforest
    }
    
}

Снимок экрана с примером карты QML

...