需要QtLocation OSM API密钥

我正在使用OSM和这里的地图插件的QML应用程序。我用的是 map.activeMapType = map.supportedMapTypes[currentIndex] 在ComboBox中显示地图提供者支持的地图类型。这里的地图插件与 "here.app_id""here.token" 的参数,但对于OSM插件来说,除了街道地图磁贴外,地形、公交等磁贴都会显示 “API Key Required”。但是在OSM插件中,除了街道地图磁贴外,地形、交通和其他磁贴都显示 “API Key Required”。我得到的API密钥从 thunderforest.com. 当使用该参数时,它仍然显示 “API Key Required”。

   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.ioosm5.8。 的网站上使用,就像这样的qrc。

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密钥将其删除?谅谅

解决方案:

(复制自我的博客文章,这里。http:/blog.mikeasoft.com20200622qt-qml-maps-using-theosm-plugin-with-api-keys。)

这并不明显,但在对OSM插件的工作方式进行了一番研究后,我发现了一个机制,通过这个机制,可以向需要API密钥的瓦片服务器提供一个密钥。

当OSM插件被初始化时,它与Qt providers repository通信,Qt providers repository告诉它每个地图类型要使用什么URLs。提供者存储库的位置可以通过 osm.mapping.providerrepository.地址。 OSM插件属性,所以我们要使用我们的API密钥所需要做的就是建立我们自己的供应商仓库,其URL包含我们的API密钥作为参数。资源库本身只是一个JSON文件的集合,有特定的名称(自行车, 自行车出租, 徒步旅行, 徒步旅行出租, 夜间运输, 夜间运输出租, 卫星, 街道, 街道出租, 地形, 地形出租, 运输, 运输出租。),每个类型对应一个地图类型。的*。-雇用 文件为高DPI显示提供了两倍于正常分辨率的磁贴的URL。

例如,这是默认的Qt providers仓库提供的循环文件。

{
    "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",

自动存储库设置

我在这里创建了一个简单的工具,用于使用自定义API密钥设置一个完整的仓库。https:/github.comElleoqt-osm-map-providers。

  1. 首先,从以下地方获得一个API密钥 https:/www.thunderforest.comdocsapikeys
  2. 接下来克隆我的版本库。git clone https://github.com/Elleo/qt-osm-map-providers.git
  3. 运行: ./set_api_keys.sh your_api_key (把你的api_key替换成你在第一步中得到的key)
  4. 将此仓库中的文件复制到你的网络服务器上(例如 http:/www.mywebsite.comosm_repository)
  5. 将 osm.mapping.providerrepository.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地图示例截图

本文来自投稿,不代表实战宝典立场,如若转载,请注明出处:https://www.shizhanbaodian.com/baodian/6124.html