1. 程式人生 > >qt qml 高德地圖--WebAPI 獲取靜態地圖

qt qml 高德地圖--WebAPI 獲取靜態地圖

高德地圖提供了很多Web API,本文展示如何使用Qt + qml 獲取靜態地圖

效果圖:
程式執行示例

原理:
QNetworkAccessManager通過get方法傳送一個URL請求出去,高德的伺服器接收到這個請求,會把對應的圖片以流的方式回覆給你,你接收到資料後,把資料放到一個QQuickImageProvider裡面,然後讓qml獲取這個QQuickImageProvider的圖片就好了。

下面貼程式碼:

MapProvider.hpp

#pragma once

#include <QFile>
#include <QDebug>
#include <QQuickImageProvider>
class MapProvider : public QQuickImageProvider { public: MapProvider() : QQuickImageProvider(QQuickImageProvider::Pixmap) { //pixmap 初始化為800 x 600 的紅色圖片 mPixmap = QPixmap(800, 600); mPixmap.fill(QColor("red")); } //過載, qml就是通過這個函式得到的圖片 virtual QPixmap requestPixmap(const
QString &id, QSize *size, const QSize &requestedSize) override { return mPixmap; } //將資料設定到pixmap中 void setData(QByteArray data) { mPixmap.loadFromData(data); } private: QPixmap mPixmap; };

Map.hpp

#pragma once

#include <memory>
#include <cstdlib>
#include <functional> #include <QUrl> #include <QObject> #include <QNetworkReply> #include <QNetworkRequest> #include <QNetworkAccessManager> #include "MapProvider.hpp" class Map : public QObject { Q_OBJECT public: explicit Map(QObject *parent = nullptr); //獲取 provider MapProvider * getProvider(); //INVOKABLE 開放給qml,用來發起GET 請求 Q_INVOKABLE void get(QUrl url); signals: void replayReady(); public slots: void replaySlot(QNetworkReply *reply); private: //C++ std 風格的智慧指標 std::shared_ptr<QNetworkAccessManager> mManager; std::shared_ptr<MapProvider> mMapProvider; };

Map.cpp

#include "Map.hpp"

Map::Map(QObject *parent) : QObject(parent)
{
    //指標初始化
    mManager = std::make_shared<QNetworkAccessManager>();
    mMapProvider = std::make_shared<MapProvider>();
    //連線訊號 槽
    connect(mManager.get(), &QNetworkAccessManager::finished, this, &Map::replaySlot);
}

MapProvider *Map::getProvider()
{
    return mMapProvider.get();
}

void Map::get(QUrl url)
{
    //GET 請求
    mManager->get(QNetworkRequest(QUrl(url)));
}
// GET請求的響應處理 
void Map::replaySlot(QNetworkReply *reply)
{
    //讀取全部資料,寫入provider
    mMapProvider->setData(reply->readAll());
    //通知qml,重新整理圖片
    emit replayReady();
}

Main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>
#include <QQmlContext>
#include <QQmlEngine>
#include "Map.hpp"
#include "MapProvider.hpp"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQuickView view;
    Map map;
    //新增Provider,注意字串中的大小寫,qml中使用要一致
    view.engine()->addImageProvider(QLatin1String("Provider"), map.getProvider());
    view.engine()->rootContext()->setContextProperty("IMap", &map);
    view.setSource(QUrl("qrc:/Qml/Main.qml"));
    view.show();

    return app.exec();
}

Main.qml (注意把key換掉,我的key就不貼出來了)

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3

Item {
    visible: true
    width: 1024
    height: 768

    readonly property var key : "此處寫上你的key"

    Connections {
        target: IMap
        onReplayReady: {
            image.source = "image://Provider";
        }
    }
    Image {
        id: image
        width: 800
        height: 600
        anchors.centerIn: parent

        Component.onCompleted: {
            var url = "http://restapi.amap.com/v3/staticmap?location=116.481485,39.990464&zoom=10&size=800*600&markers=mid,,A:116.481485,39.990464&key=" + key;
            IMap.get(url);
        }
    }
}

相關推薦

qt qml 地圖--WebAPI 獲取靜態地圖

高德地圖提供了很多Web API,本文展示如何使用Qt + qml 獲取靜態地圖 效果圖: 原理: QNetworkAccessManager通過get方法傳送一個URL請求出去,高德的伺服器接收到這個請求,會把對應的圖片以流的方式回覆給你,你接收

android跳轉手機百度騰訊谷歌地圖地圖傳座標、座標偏移、base64解碼相關

調起百度的native app http://developer.baidu.com/map/uri-introandroid.htm#idmykey47 座標轉換 http://api.map.baidu.com/ag/coord/convert?from=2&

包含,百度等地圖 apikey 專案打包 relese debug keystore

1.debug版, 不同編譯環境,sha1不同,需要自己提取; 在android studio terminal中輸入 keytool -list -v -keystore C:\Users\Ad

關於通過js-api獲取定位在iPhone和Android手機上不同的表現

開發了一個工單系統,其中有幾處需要上傳手機的當前經緯度,程式碼不復雜,直接引用了高德lbs服務的js-api介面,前端程式碼參考: <div id="map2" class="map"></div>

php 根據地址獲取經緯度|| 根據 經緯度獲取地址

/** * 根據地址 獲取經緯度 * @param $address * @return mixed */ function addresstolatlag($address){ $url='http://restapi.amap.com/v3/geoco

使用谷歌的地圖 衛星標準進行切換

shee 進行 .cn 1.0 疊加 pad mar css visible 高德地圖使用谷歌瓦片的方法 <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-

android ------ 實現定位並獲取相應資訊 ( 最新版SDK 和 Android SDK版本)

Android開發專案時常常會遇到定位這個功能, 很久以前寫過一篇了,官方也更新了一些東西,我也更新下 以前使用的是jar包 匯

地圖獲取當前屏幕中心點的經緯度

java sso tar () 附近 初始 chan map對象 protected 公司有個需求就是要隨著屏幕的改變而載入附近的商戶信息. 那麽高德地圖獲取當前屏幕中心點的經緯度呢? 核心方法:aMap.setOnCameraChangeLis

繪制靜態地圖API-地圖

linux環境 ade verify != transfer file trim tour put 1 高德靜態地圖鏈接 http://lbs.amap.com/api/webservice/guide/api/staticmaps 2 <?php /**

基於vue 2.X和地圖的vue-amap組件獲取經緯度

實例 con ati ble off 組件 posit return play   今天我就講了一下怎麽通過vue和高德地圖開發的vue-amap組件來獲取經緯度。   這是vue-amap的官網文檔:https://elemefe.github.io/vue-amap/#

知道經緯度來調地圖的官網API來獲取所在的位置(逆地理編碼)

第一步:首先要有一個key值 高德的參考 https://lbs.amap.com/api/webservice/guide/api/georegeo/?sug_index=2 第二步:調介面 https://restapi.amap.com/v3/geocode/regeo?key

地圖 ——獲取定位資訊

上一篇文章已經講解了如何整合高德地圖SDK:跳轉連結 如何你想獲取附近位置資訊 關鍵字檢索poi:跳轉這兒 下面我們介紹下定位功能: 配置AndroidManifest檔案 上一篇文章已經講解清單檔案配置:  對應的許可權,服務和key值   注意:

(簡單詳細)React Native獲取手機當前經緯度,(通過地圖介面)獲取當前地理位置

要獲取手機的當前地理位置,首先要獲得經緯度,然後通過逆地理編碼獲得位置資訊 地理編碼/逆地理編碼 API 是通過 HTTP/HTTPS 協議訪問遠端服務的介面,提供結構化地址與經緯度之間的相互轉化的能力。 1.AndroidManifest.xml加入許可權 <uses-per

地圖API獲取的經緯度轉為百度地圖經緯度顯示

通過高德地圖API獲取的經緯度顯示在百度地圖上會有位置的偏差,原因是百度地圖對經緯度進行了加密,通過以下方法對經緯度進行轉換可在百度地圖上精準顯示 private double[] gaoDeToBaidu(double gd_lon, double gd_lat) { double[]

java api從地圖獲取某個位置的經緯度

import com.fasterxml.jackson.databind.JsonNode; import com.ning.http.client.AsyncHttpClient; import com.ning.http.client.AsyncHttpClientConfig; impor

地圖根據經緯度陣列獲取所有的點標記

具體效果: 放大後: 具體程式碼如下: <!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-C

vue-amap 地圖定位 點選獲取經緯度和具體地址的使用

官方文件地址: 點這裡!!   經緯度獲取只要通過點選事件就可以通過e.lnglat來獲取,然後就是外掛Geocoder使用了。在main.js中initAMapApiLoader中寫入:AMap.Geocoder,注意 官方文件中有提示: 所以外掛中使用

地圖和百度地圖獲取當前位置經緯度

高德 匯入高德js mapObj = new AMap.Map('iCenter'); mapObj.plugin('AMap.Geolocation', function () { geolocation = new AMap.Geolocation({ e

(自我學習篇之地圖)使用與獲取marker的點選事件

獲取之後下載SDK然後倒入libs用什麼導什麼我先簡單說一個2D的實現與獲取marker的點選事件  3d的多了一步   OK就可以使用了   注意許可權 <uses-permission android:name="android.permission

php+地圖webapi jsapi 實現 當前位置與目標位置距離 並按照距離排序(座標逆轉換)

<script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak='自己申請'&s=1"></script> <script type="text/javas