欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Qt編寫地圖之實現(xiàn)經(jīng)緯度坐標糾偏

 更新時間:2022年03月10日 08:31:01   作者:feiyangqingyun  
地圖應用中都涉及到一個問題就是坐標糾偏的問題,這個問題的是因為根據(jù)地方規(guī)則保密性要求不允許地圖廠商使用標準的GPS坐標,而是要用國家定義的偏移標準。本文將詳細講解如何在Qt中實現(xiàn)經(jīng)緯度坐標糾偏,需要的可以參考一下

一、前言

地圖應用中都涉及到一個問題就是坐標糾偏的問題,這個問題的是因為根據(jù)地方規(guī)則保密性要求不允許地圖廠商使用標準的GPS坐標,而是要用國家定義的偏移標準,或者在此基礎上再做算法運算,所以這就出現(xiàn)了三種常規(guī)的坐標標準:GPS坐標(WGS-84,國際標準,谷歌地球軟件,硬件GPS模塊等)、中國坐標偏移標準(GCJ-02,谷歌地圖、騰訊地圖、高德地圖等)、百度坐標偏移標準(BD-09,僅僅百度地圖采用)。由于不允許其他坐標轉(zhuǎn)換成GPS坐標,所以三種坐標互換就剩4種常用轉(zhuǎn)換:GPS轉(zhuǎn)百度、GPS轉(zhuǎn)其他、百度轉(zhuǎn)其他、其他轉(zhuǎn)百度,其他就是中國坐標偏移標準,目前谷歌地圖、騰訊地圖、高德地圖都采用這個標準。

在線百度地圖提供了Convertor類專門負責這個轉(zhuǎn)換,只需要調(diào)用對應translate方法傳入?yún)?shù)即可,這個轉(zhuǎn)換出來的結(jié)果比較理想,缺點就是必須在線使用,畢竟算法是存儲在服務器上的保密的,但是很多應用場景是離線使用的,這就需要找一個比較準確的算法做這個轉(zhuǎn)換,網(wǎng)上流傳的主要是java、c#、python等語言的版本,于是特意將其改寫成了c++ Qt的版本,親測和在線版本的運算結(jié)果基本一致,據(jù)說赤道附近可能偏差很大,但是在中國地圖上偏差很小。

二、功能特點

1 省市區(qū)域地圖封裝類功能特點

  1. 同時支持閃爍點圖、遷徙圖、區(qū)域地圖、世界地圖、儀表盤等。
  2. 可以設置標題、提示信息、背景顏色、文字顏色、線條顏色、區(qū)域顏色等各種顏色。
  3. 可設置城市的名稱、值、經(jīng)緯度 集合。
  4. 可設置地圖的放大倍數(shù)、是否允許鼠標滾輪縮放。
  5. 內(nèi)置世界地圖、全國地圖、省份地圖、地區(qū)地圖,可以精確到縣,所有地圖全部離線使用。
  6. 內(nèi)置了各省市json數(shù)據(jù)文件轉(zhuǎn)js文件功能,如有數(shù)據(jù)更新自行轉(zhuǎn)換即可,支持單個文件轉(zhuǎn)換和一鍵轉(zhuǎn)換所有文件。
  7. 內(nèi)置了從json文件或者js文件獲取該區(qū)域的所有名稱和經(jīng)緯度信息集合的功能,可以通過該方法獲取到信息用來顯示。
  8. 依賴瀏覽器組件顯示地圖,提供的demo支持webkit/webengine/miniblink/ie 多種方式加載網(wǎng)頁。
  9. 采用miniblink瀏覽器內(nèi)核打通了Qt5.6及后續(xù)版本+mingw編譯器缺少瀏覽器模塊的遺憾,使得整個項目支持所有Qt版本,親測4.7到6.2等任意版本。
  10. 閃爍點遷徙圖等設置的點支持單獨設置顏色。
  11. 提供接口直接獲取點擊的點相關信息,方便程序聯(lián)動處理。
  12. 拓展性極強,可以依葫蘆畫瓢自行增加各種精美的echarts組件,做出牛逼的效果。
  13. 內(nèi)置的儀表盤組件提供交互功能,demo演示中包含了對應的代碼。
  14. 函數(shù)接口友好和統(tǒng)一,使用簡單方便,就一個類。
  15. 支持任意Qt版本、任意系統(tǒng)、任意編譯器。

2 百度地圖封裝類功能特點

  1. 同時支持在線地圖和離線地圖兩種模式。
  2. 同時支持webkit內(nèi)核、webengine內(nèi)核、miniblink內(nèi)核、IE內(nèi)核。
  3. 支持設置多個標注點,信息包括名稱、地址、經(jīng)緯度。
  4. 可設置地圖是否可單擊、拖動、鼠標滾輪縮放。
  5. 可設置協(xié)議版本、秘鑰、主題樣式、中心坐標、中心城市、地理編碼位置等。
  6. 可設置地圖縮放比例和級別,縮略圖、比例尺、路況信息等控件的可見。
  7. 支持地圖交互,比如鼠標按下獲取對應位置的經(jīng)緯度。
  8. 支持查詢路線,可設置起點位置、終點位置、路線模式、路線方式、路線方案(最少時間、最少換乘、最少步行、不乘地鐵、最短距離、避開高速)。
  9. 可顯示點線面工具,可直接在地圖上劃線、點、矩形、圓形等。
  10. 可設置行政區(qū)劃,指定某個城市區(qū)域繪制圖層,在線地圖自動輸出行政區(qū)劃邊界點集合到js文件給離線地圖使用。
  11. 可靜態(tài)或者動態(tài)添加多個覆蓋物。支持點、折線、多邊形、矩形、圓形、弧線、點聚合等。
  12. 提供函數(shù)接口處理經(jīng)緯度解析成地址和地址解析成經(jīng)緯度坐標。
  13. 提供的demo直接可以單獨選點執(zhí)行對應的處理比如路線查詢。
  14. 可以拿到路線查詢到的點坐標信息集合,比如用于機器人坐標導航等。
  15. 封裝了豐富的函數(shù)比如刪除指定點和所有點,刪除指定覆蓋物和所有覆蓋物等。
  16. 標注點彈框信息可以自定義內(nèi)容,標準html格式。
  17. 標注點單擊事件可選 0-不處理 1-自己彈框 2-發(fā)送信號。
  18. 標注點可設置動畫效果 0-不處理 1-跳動 2-墜落
  19. 標注點可設置本地圖片文件等。
  20. 函數(shù)接口友好和統(tǒng)一,使用簡單方便,就一個類。
  21. 支持js動態(tài)交互添加點、刪除點、清空點、重置點,不需要刷新頁面。
  22. 支持任意Qt版本、任意系統(tǒng)、任意編譯器。

3 離線地圖下載類功能特點

  1. 多線程同步下載多級別瓦片地圖,不卡界面。
  2. 內(nèi)置多個離線地圖下載請求地址,自動隨機選擇一個發(fā)送請求。
  3. 下載地圖類型同時支持街道圖和衛(wèi)星圖。
  4. 自動計算可視區(qū)域或者行政區(qū)域的下載瓦片數(shù)量。
  5. 下載的級別可以自定義范圍和選擇。
  6. 每個瓦片下載完成都發(fā)送信號通知,參數(shù)包括下載用時。
  7. 可設置下載最大超時時間,超過了則丟棄跳到下一個下載任務。
  8. 實時顯示下載進度,以及當前級別已經(jīng)下載的瓦片數(shù)和總瓦片數(shù)。
  9. 下載過程中可以停止下載,下載完成自動統(tǒng)計總用時。
  10. 內(nèi)置經(jīng)緯度和屏幕坐標互相轉(zhuǎn)換函數(shù)。
  11. 目前支持百度地圖,其他地圖比如谷歌地圖、騰訊地圖、高德地圖可以定制。
  12. 函數(shù)接口友好和統(tǒng)一,使用簡單方便,就一個類。
  13. 支持任意Qt版本、任意系統(tǒng)、任意編譯器。

4 省市輪廓下載類功能特點

  1. 定時器排隊下載省市輪廓圖點坐標集合存儲到JS文件。
  2. 支持一個行政區(qū)域多個不規(guī)則區(qū)域下載。
  3. 自動計算行政區(qū)域的下載輪廓數(shù)量。
  4. 可精確選擇省份、市區(qū)、縣城,也可直接輸入行政區(qū)域的名稱。
  5. 可以設置下載間隔、隨時開始下載和停止下載。
  6. 提供編輯邊界功能,可以直接在地圖上編輯好不規(guī)則區(qū)域的點集合,然后獲取邊界點集合數(shù)據(jù),這個可以用來自己繪制區(qū)域拿到數(shù)據(jù),比如某個鄉(xiāng)鎮(zhèn)甚至某個小區(qū)的行政區(qū)域數(shù)據(jù),很牛逼。

三、體驗地址

體驗地址:https://pan.baidu.com/s/15ZKAlptW-rDcNq8zlzdYLg  提取碼:uyes 文件名:bin_map.zip

國內(nèi)站點:https://gitee.com/feiyangqingyun

國際站點:https://github.com/feiyangqingyun

四、效果圖

五、相關代碼

//常用轉(zhuǎn)換就4種: GPS轉(zhuǎn)百度、GPS轉(zhuǎn)其他、百度轉(zhuǎn)其他、其他轉(zhuǎn)百度
//WGS-84: 國際標準,GPS坐標(Google Earth使用、或者GPS模塊)
//GCJ-02: 中國坐標偏移標準,Google Map、高德、騰訊使用
//BD-09:  百度坐標偏移標準,Baidu Map使用
static QPointF gcj2bd(const QPointF &point);
static QPointF bd2gcj(const QPointF &point);
static double transformLng(double lng, double lat);
static double transformLat(double lng, double lat);
static QPointF wgs2gcj(const QPointF &point);
static QPointF wgs2bd(const QPointF &point);

//圓周率轉(zhuǎn)換量
double x_pi = M_PI * 3000.0 / 180.0;
QPointF MapHelper::gcj2bd(const QPointF &point)
{
    double x = point.x();
    double y = point.y();
    double z = qSqrt(x * x + y * y) + 0.00002 * qSin(y * x_pi);
    double theta = qAtan2(y, x) + 0.000003 * qCos(x * x_pi);
    double lng = z * qCos(theta) + 0.0065;
    double lat = z * qSin(theta) + 0.006;
    return QPointF(lng, lat);
}

QPointF MapHelper::bd2gcj(const QPointF &point)
{
    double x = point.x() - 0.0065;
    double y = point.y() - 0.006;
    double z = qSqrt(x * x + y * y) - 0.00002 * qSin(y * x_pi);
    double theta = qAtan2(y, x) - 0.000003 * qCos(x * x_pi);
    double lng = z * qCos(theta);
    double lat = z * qSin(theta);
    return QPointF(lng, lat);
}

double MapHelper::transformLng(double lng, double lat)
{
    double ret = 300.0 + lat + 2.0 * lng + 0.1 * lat * lat + 0.1 * lat * lng + 0.1 * qSqrt(qAbs(lat));
    ret += (20.0 * qSin(6.0 * lat * M_PI) + 20.0 * qSin(2.0 * lat * M_PI)) * 2.0 / 3.0;
    ret += (20.0 * qSin(lat * M_PI) + 40.0 * qSin(lat / 3.0 * M_PI)) * 2.0 / 3.0;
    ret += (150.0 * qSin(lat / 12.0 * M_PI) + 300.0 * qSin(lat / 30.0 * M_PI)) * 2.0 / 3.0;
    return ret;
}

double MapHelper::transformLat(double lng, double lat)
{
    double ret = -100.0 + 2.0 * lat + 3.0 * lng + 0.2 * lng * lng + 0.1 * lat * lng + 0.2 * qSqrt(qAbs(lat));
    ret += (20.0 * qSin(6.0 * lat * M_PI) + 20.0 * qSin(2.0 * lat * M_PI)) * 2.0 / 3.0;
    ret += (20.0 * qSin(lng * M_PI) + 40.0 * qSin(lng / 3.0 * M_PI)) * 2.0 / 3.0;
    ret += (160.0 * qSin(lng / 12.0 * M_PI) + 320 * qSin(lng * M_PI / 30.0)) * 2.0 / 3.0;
    return ret;
}

//衛(wèi)星橢球坐標投影到平面地圖坐標系的投影因子
double a = 6378245.0;
//橢球的偏心率
double ee = 0.00669342162296594323;
QPointF MapHelper::wgs2gcj(const QPointF &point)
{
    double x = point.x();
    double y = point.y();
    double lng = transformLng(y - 35.0, x - 105.0);
    double lat = transformLat(y - 35.0, x - 105.0);

    double rad = y / 180.0 * M_PI;
    double magic = qSin(rad);
    magic = 1 - ee * magic * magic;
    double sqrtMagic = qSqrt(magic);

    lng = x + (lng * 180.0) / (a / sqrtMagic * qCos(rad) * M_PI);
    lat = y + (lat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * M_PI);
    return QPointF(lng, lat);
}

QPointF MapHelper::wgs2bd(const QPointF &point)
{
    //GPS轉(zhuǎn)百度要經(jīng)過兩重轉(zhuǎn)換
    return gcj2bd(wgs2gcj(point));
}

到此這篇關于Qt編寫地圖之實現(xiàn)經(jīng)緯度坐標糾偏的文章就介紹到這了,更多相關Qt地圖坐標糾偏內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++中的函數(shù)返回值問題

    C++中的函數(shù)返回值問題

    這篇文章主要介紹了C++中的函數(shù)返回值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • C語言實現(xiàn)掃雷游戲(可展開)

    C語言實現(xiàn)掃雷游戲(可展開)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)掃雷游戲,實現(xiàn)掃雷展開和提醒,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 深入探討Linux靜態(tài)庫與動態(tài)庫的詳解(一看就懂)

    深入探討Linux靜態(tài)庫與動態(tài)庫的詳解(一看就懂)

    本篇文章是對Linux靜態(tài)庫與動態(tài)庫進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言常量介紹

    C語言常量介紹

    這篇文章介紹了C語言中的常量,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12
  • C語言深入探索浮點數(shù)的使用秘密

    C語言深入探索浮點數(shù)的使用秘密

    在C語言中,浮點數(shù)是一個很重要的類型,浮點數(shù)可以使數(shù)據(jù)更為精確。浮點數(shù)說白了就是帶有小數(shù)點的數(shù)。比如1.6?0.0000?765.2等等,浮點數(shù)具體是怎么用的呢,讓我們一起來看看
    2022-04-04
  • c++ 類中const成員變量的賦值方法

    c++ 類中const成員變量的賦值方法

    下面小編就為大家?guī)硪黄猚++ 類中const成員變量的賦值方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C++中臨時對象的常見產(chǎn)生情況及其解決的方案

    C++中臨時對象的常見產(chǎn)生情況及其解決的方案

    這篇文章主要是探討常見的臨時對象產(chǎn)生的情況,及其如何避免和解決這種臨時對象產(chǎn)生的方式。具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 解析c中stdout與stderr容易忽視的一些細節(jié)

    解析c中stdout與stderr容易忽視的一些細節(jié)

    本篇文章是對在c語言中stdout與stderr容易忽視的一些細節(jié)進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++20中的協(xié)程(Coroutine)的實現(xiàn)

    C++20中的協(xié)程(Coroutine)的實現(xiàn)

    這篇文章主要介紹了C++20中的協(xié)程(Coroutine)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • C 語言基礎----詳解C中的運算符

    C 語言基礎----詳解C中的運算符

    這篇文章主要介紹了C語言中的運算符,文中講解非常詳細,適合初學小白進行學習,想入門C語言的朋友不妨了解下
    2020-06-06

最新評論