您好,登錄后才能下訂單哦!
本篇內容主要講解“Qt如何實現經緯度坐標糾偏”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Qt如何實現經緯度坐標糾偏”吧!
地圖應用中都涉及到一個問題就是坐標糾偏的問題,這個問題的是因為根據地方規則保密性要求不允許地圖廠商使用標準的GPS坐標,而是要用國家定義的偏移標準,或者在此基礎上再做算法運算,所以這就出現了三種常規的坐標標準:GPS坐標(WGS-84,國際標準,谷歌地球軟件,硬件GPS模塊等)、中國坐標偏移標準(GCJ-02,谷歌地圖、騰訊地圖、高德地圖等)、百度坐標偏移標準(BD-09,僅僅百度地圖采用)。由于不允許其他坐標轉換成GPS坐標,所以三種坐標互換就剩4種常用轉換:GPS轉百度、GPS轉其他、百度轉其他、其他轉百度,其他就是中國坐標偏移標準,目前谷歌地圖、騰訊地圖、高德地圖都采用這個標準。
在線百度地圖提供了Convertor類專門負責這個轉換,只需要調用對應translate方法傳入參數即可,這個轉換出來的結果比較理想,缺點就是必須在線使用,畢竟算法是存儲在服務器上的保密的,但是很多應用場景是離線使用的,這就需要找一個比較準確的算法做這個轉換,網上流傳的主要是java、c#、python等語言的版本,于是特意將其改寫成了c++ Qt的版本,親測和在線版本的運算結果基本一致,據說赤道附近可能偏差很大,但是在中國地圖上偏差很小。
1 省市區域地圖封裝類功能特點
同時支持閃爍點圖、遷徙圖、區域地圖、世界地圖、儀表盤等。
可以設置標題、提示信息、背景顏色、文字顏色、線條顏色、區域顏色等各種顏色。
可設置城市的名稱、值、經緯度 集合。
可設置地圖的放大倍數、是否允許鼠標滾輪縮放。
內置世界地圖、全國地圖、省份地圖、地區地圖,可以精確到縣,所有地圖全部離線使用。
內置了各省市json數據文件轉js文件功能,如有數據更新自行轉換即可,支持單個文件轉換和一鍵轉換所有文件。
內置了從json文件或者js文件獲取該區域的所有名稱和經緯度信息集合的功能,可以通過該方法獲取到信息用來顯示。
依賴瀏覽器組件顯示地圖,提供的demo支持webkit/webengine/miniblink/ie 多種方式加載網頁。
采用miniblink瀏覽器內核打通了Qt5.6及后續版本+mingw編譯器缺少瀏覽器模塊的遺憾,使得整個項目支持所有Qt版本,親測4.7到6.2等任意版本。
閃爍點遷徙圖等設置的點支持單獨設置顏色。
提供接口直接獲取點擊的點相關信息,方便程序聯動處理。
拓展性極強,可以依葫蘆畫瓢自行增加各種精美的echarts組件,做出牛逼的效果。
內置的儀表盤組件提供交互功能,demo演示中包含了對應的代碼。
函數接口友好和統一,使用簡單方便,就一個類。
支持任意Qt版本、任意系統、任意編譯器。
2 百度地圖封裝類功能特點
同時支持在線地圖和離線地圖兩種模式。
同時支持webkit內核、webengine內核、miniblink內核、IE內核。
支持設置多個標注點,信息包括名稱、地址、經緯度。
可設置地圖是否可單擊、拖動、鼠標滾輪縮放。
可設置協議版本、秘鑰、主題樣式、中心坐標、中心城市、地理編碼位置等。
可設置地圖縮放比例和級別,縮略圖、比例尺、路況信息等控件的可見。
支持地圖交互,比如鼠標按下獲取對應位置的經緯度。
支持查詢路線,可設置起點位置、終點位置、路線模式、路線方式、路線方案(最少時間、最少換乘、最少步行、不乘地鐵、最短距離、避開高速)。
可顯示點線面工具,可直接在地圖上劃線、點、矩形、圓形等。
可設置行政區劃,指定某個城市區域繪制圖層,在線地圖自動輸出行政區劃邊界點集合到js文件給離線地圖使用。
可靜態或者動態添加多個覆蓋物。支持點、折線、多邊形、矩形、圓形、弧線、點聚合等。
提供函數接口處理經緯度解析成地址和地址解析成經緯度坐標。
提供的demo直接可以單獨選點執行對應的處理比如路線查詢。
可以拿到路線查詢到的點坐標信息集合,比如用于機器人坐標導航等。
封裝了豐富的函數比如刪除指定點和所有點,刪除指定覆蓋物和所有覆蓋物等。
標注點彈框信息可以自定義內容,標準html格式。
標注點單擊事件可選 0-不處理 1-自己彈框 2-發送信號。
標注點可設置動畫效果 0-不處理 1-跳動 2-墜落
標注點可設置本地圖片文件等。
函數接口友好和統一,使用簡單方便,就一個類。
支持js動態交互添加點、刪除點、清空點、重置點,不需要刷新頁面。
支持任意Qt版本、任意系統、任意編譯器。
3 離線地圖下載類功能特點
多線程同步下載多級別瓦片地圖,不卡界面。
內置多個離線地圖下載請求地址,自動隨機選擇一個發送請求。
下載地圖類型同時支持街道圖和衛星圖。
自動計算可視區域或者行政區域的下載瓦片數量。
下載的級別可以自定義范圍和選擇。
每個瓦片下載完成都發送信號通知,參數包括下載用時。
可設置下載最大超時時間,超過了則丟棄跳到下一個下載任務。
實時顯示下載進度,以及當前級別已經下載的瓦片數和總瓦片數。
下載過程中可以停止下載,下載完成自動統計總用時。
內置經緯度和屏幕坐標互相轉換函數。
目前支持百度地圖,其他地圖比如谷歌地圖、騰訊地圖、高德地圖可以定制。
函數接口友好和統一,使用簡單方便,就一個類。
支持任意Qt版本、任意系統、任意編譯器。
4 省市輪廓下載類功能特點
定時器排隊下載省市輪廓圖點坐標集合存儲到JS文件。
支持一個行政區域多個不規則區域下載。
自動計算行政區域的下載輪廓數量。
可精確選擇省份、市區、縣城,也可直接輸入行政區域的名稱。
可以設置下載間隔、隨時開始下載和停止下載。
提供編輯邊界功能,可以直接在地圖上編輯好不規則區域的點集合,然后獲取邊界點集合數據,這個可以用來自己繪制區域拿到數據,比如某個鄉鎮甚至某個小區的行政區域數據,很牛逼。
體驗地址:https://pan.baidu.com/s/15ZKAlptW-rDcNq8zlzdYLg 提取碼:uyes 文件名:bin_map.zip
國內站點:https://gitee.com/feiyangqingyun
國際站點:https://github.com/feiyangqingyun
//常用轉換就4種: GPS轉百度、GPS轉其他、百度轉其他、其他轉百度 //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); //圓周率轉換量 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; } //衛星橢球坐標投影到平面地圖坐標系的投影因子 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轉百度要經過兩重轉換 return gcj2bd(wgs2gcj(point)); }
到此,相信大家對“Qt如何實現經緯度坐標糾偏”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。