溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Qt如何實(shí)現(xiàn)經(jīng)緯度坐標(biāo)糾偏

發(fā)布時(shí)間:2022-03-10 09:46:43 來(lái)源:億速云 閱讀:135 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容主要講解“Qt如何實(shí)現(xiàn)經(jīng)緯度坐標(biāo)糾偏”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Qt如何實(shí)現(xiàn)經(jīng)緯度坐標(biāo)糾偏”吧!

一、前言

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

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

二、功能特點(diǎn)

1 省市區(qū)域地圖封裝類(lèi)功能特點(diǎn)

  1. 同時(shí)支持閃爍點(diǎn)圖、遷徙圖、區(qū)域地圖、世界地圖、儀表盤(pán)等。

  2. 可以設(shè)置標(biāo)題、提示信息、背景顏色、文字顏色、線(xiàn)條顏色、區(qū)域顏色等各種顏色。

  3. 可設(shè)置城市的名稱(chēng)、值、經(jīng)緯度 集合。

  4. 可設(shè)置地圖的放大倍數(shù)、是否允許鼠標(biāo)滾輪縮放。

  5. 內(nèi)置世界地圖、全國(guó)地圖、省份地圖、地區(qū)地圖,可以精確到縣,所有地圖全部離線(xiàn)使用。

  6. 內(nèi)置了各省市json數(shù)據(jù)文件轉(zhuǎn)js文件功能,如有數(shù)據(jù)更新自行轉(zhuǎn)換即可,支持單個(gè)文件轉(zhuǎn)換和一鍵轉(zhuǎn)換所有文件。

  7. 內(nèi)置了從json文件或者js文件獲取該區(qū)域的所有名稱(chēng)和經(jīng)緯度信息集合的功能,可以通過(guò)該方法獲取到信息用來(lái)顯示。

  8. 依賴(lài)瀏覽器組件顯示地圖,提供的demo支持webkit/webengine/miniblink/ie 多種方式加載網(wǎng)頁(yè)。

  9. 采用miniblink瀏覽器內(nèi)核打通了Qt5.6及后續(xù)版本+mingw編譯器缺少瀏覽器模塊的遺憾,使得整個(gè)項(xiàng)目支持所有Qt版本,親測(cè)4.7到6.2等任意版本。

  10. 閃爍點(diǎn)遷徙圖等設(shè)置的點(diǎn)支持單獨(dú)設(shè)置顏色。

  11. 提供接口直接獲取點(diǎn)擊的點(diǎn)相關(guān)信息,方便程序聯(lián)動(dòng)處理。

  12. 拓展性極強(qiáng),可以依葫蘆畫(huà)瓢自行增加各種精美的echarts組件,做出牛逼的效果。

  13. 內(nèi)置的儀表盤(pán)組件提供交互功能,demo演示中包含了對(duì)應(yīng)的代碼。

  14. 函數(shù)接口友好和統(tǒng)一,使用簡(jiǎn)單方便,就一個(gè)類(lèi)。

  15. 支持任意Qt版本、任意系統(tǒng)、任意編譯器。

2 百度地圖封裝類(lèi)功能特點(diǎn)

  1. 同時(shí)支持在線(xiàn)地圖和離線(xiàn)地圖兩種模式。

  2. 同時(shí)支持webkit內(nèi)核、webengine內(nèi)核、miniblink內(nèi)核、IE內(nèi)核。

  3. 支持設(shè)置多個(gè)標(biāo)注點(diǎn),信息包括名稱(chēng)、地址、經(jīng)緯度。

  4. 可設(shè)置地圖是否可單擊、拖動(dòng)、鼠標(biāo)滾輪縮放。

  5. 可設(shè)置協(xié)議版本、秘鑰、主題樣式、中心坐標(biāo)、中心城市、地理編碼位置等。

  6. 可設(shè)置地圖縮放比例和級(jí)別,縮略圖、比例尺、路況信息等控件的可見(jiàn)。

  7. 支持地圖交互,比如鼠標(biāo)按下獲取對(duì)應(yīng)位置的經(jīng)緯度。

  8. 支持查詢(xún)路線(xiàn),可設(shè)置起點(diǎn)位置、終點(diǎn)位置、路線(xiàn)模式、路線(xiàn)方式、路線(xiàn)方案(最少時(shí)間、最少換乘、最少步行、不乘地鐵、最短距離、避開(kāi)高速)。

  9. 可顯示點(diǎn)線(xiàn)面工具,可直接在地圖上劃線(xiàn)、點(diǎn)、矩形、圓形等。

  10. 可設(shè)置行政區(qū)劃,指定某個(gè)城市區(qū)域繪制圖層,在線(xiàn)地圖自動(dòng)輸出行政區(qū)劃邊界點(diǎn)集合到j(luò)s文件給離線(xiàn)地圖使用。

  11. 可靜態(tài)或者動(dòng)態(tài)添加多個(gè)覆蓋物。支持點(diǎn)、折線(xiàn)、多邊形、矩形、圓形、弧線(xiàn)、點(diǎn)聚合等。

  12. 提供函數(shù)接口處理經(jīng)緯度解析成地址和地址解析成經(jīng)緯度坐標(biāo)。

  13. 提供的demo直接可以單獨(dú)選點(diǎn)執(zhí)行對(duì)應(yīng)的處理比如路線(xiàn)查詢(xún)。

  14. 可以拿到路線(xiàn)查詢(xún)到的點(diǎn)坐標(biāo)信息集合,比如用于機(jī)器人坐標(biāo)導(dǎo)航等。

  15. 封裝了豐富的函數(shù)比如刪除指定點(diǎn)和所有點(diǎn),刪除指定覆蓋物和所有覆蓋物等。

  16. 標(biāo)注點(diǎn)彈框信息可以自定義內(nèi)容,標(biāo)準(zhǔn)html格式。

  17. 標(biāo)注點(diǎn)單擊事件可選 0-不處理 1-自己彈框 2-發(fā)送信號(hào)。

  18. 標(biāo)注點(diǎn)可設(shè)置動(dòng)畫(huà)效果 0-不處理 1-跳動(dòng) 2-墜落

  19. 標(biāo)注點(diǎn)可設(shè)置本地圖片文件等。

  20. 函數(shù)接口友好和統(tǒng)一,使用簡(jiǎn)單方便,就一個(gè)類(lèi)。

  21. 支持js動(dòng)態(tài)交互添加點(diǎn)、刪除點(diǎn)、清空點(diǎn)、重置點(diǎn),不需要刷新頁(yè)面。

  22. 支持任意Qt版本、任意系統(tǒng)、任意編譯器。

3 離線(xiàn)地圖下載類(lèi)功能特點(diǎn)

  1. 多線(xiàn)程同步下載多級(jí)別瓦片地圖,不卡界面。

  2. 內(nèi)置多個(gè)離線(xiàn)地圖下載請(qǐng)求地址,自動(dòng)隨機(jī)選擇一個(gè)發(fā)送請(qǐng)求。

  3. 下載地圖類(lèi)型同時(shí)支持街道圖和衛(wèi)星圖。

  4. 自動(dòng)計(jì)算可視區(qū)域或者行政區(qū)域的下載瓦片數(shù)量。

  5. 下載的級(jí)別可以自定義范圍和選擇。

  6. 每個(gè)瓦片下載完成都發(fā)送信號(hào)通知,參數(shù)包括下載用時(shí)。

  7. 可設(shè)置下載最大超時(shí)時(shí)間,超過(guò)了則丟棄跳到下一個(gè)下載任務(wù)。

  8. 實(shí)時(shí)顯示下載進(jìn)度,以及當(dāng)前級(jí)別已經(jīng)下載的瓦片數(shù)和總瓦片數(shù)。

  9. 下載過(guò)程中可以停止下載,下載完成自動(dòng)統(tǒng)計(jì)總用時(shí)。

  10. 內(nèi)置經(jīng)緯度和屏幕坐標(biāo)互相轉(zhuǎn)換函數(shù)。

  11. 目前支持百度地圖,其他地圖比如谷歌地圖、騰訊地圖、高德地圖可以定制。

  12. 函數(shù)接口友好和統(tǒng)一,使用簡(jiǎn)單方便,就一個(gè)類(lèi)。

  13. 支持任意Qt版本、任意系統(tǒng)、任意編譯器。

4 省市輪廓下載類(lèi)功能特點(diǎn)

  1. 定時(shí)器排隊(duì)下載省市輪廓圖點(diǎn)坐標(biāo)集合存儲(chǔ)到JS文件。

  2. 支持一個(gè)行政區(qū)域多個(gè)不規(guī)則區(qū)域下載。

  3. 自動(dòng)計(jì)算行政區(qū)域的下載輪廓數(shù)量。

  4. 可精確選擇省份、市區(qū)、縣城,也可直接輸入行政區(qū)域的名稱(chēng)。

  5. 可以設(shè)置下載間隔、隨時(shí)開(kāi)始下載和停止下載。

  6. 提供編輯邊界功能,可以直接在地圖上編輯好不規(guī)則區(qū)域的點(diǎn)集合,然后獲取邊界點(diǎn)集合數(shù)據(jù),這個(gè)可以用來(lái)自己繪制區(qū)域拿到數(shù)據(jù),比如某個(gè)鄉(xiāng)鎮(zhèn)甚至某個(gè)小區(qū)的行政區(qū)域數(shù)據(jù),很牛逼。

三、體驗(yàn)地址

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

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

國(guó)際站點(diǎn):https://github.com/feiyangqingyun

四、效果圖

Qt如何實(shí)現(xiàn)經(jīng)緯度坐標(biāo)糾偏

五、相關(guān)代碼

//常用轉(zhuǎn)換就4種: GPS轉(zhuǎn)百度、GPS轉(zhuǎn)其他、百度轉(zhuǎn)其他、其他轉(zhuǎn)百度
//WGS-84: 國(guó)際標(biāo)準(zhǔn),GPS坐標(biāo)(Google Earth使用、或者GPS模塊)
//GCJ-02: 中國(guó)坐標(biāo)偏移標(biāo)準(zhǔn),Google Map、高德、騰訊使用
//BD-09:  百度坐標(biāo)偏移標(biāo)準(zhǔn),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)星橢球坐標(biāo)投影到平面地圖坐標(biāo)系的投影因子
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)過(guò)兩重轉(zhuǎn)換
    return gcj2bd(wgs2gcj(point));
}

到此,相信大家對(duì)“Qt如何實(shí)現(xiàn)經(jīng)緯度坐標(biāo)糾偏”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

qt
AI