QT編寫地圖實現(xiàn)獲取區(qū)域邊界
一、前言
區(qū)域邊界也是一些坐標(biāo)點集合,而且不同的行政區(qū)劃得到的區(qū)域邊界點數(shù)組集合個數(shù)不同,覺得部分都是一個集合,少部分有一些飛地之類的,需要多個閉合區(qū)域,所以會得到多個數(shù)組集合,繪制的時候都要分別取出來繪制就行。
獲取邊界點一般和行政區(qū)劃搭配起來使用,比如用戶輸入一個省市的名稱,然后自動定位到該省市,然后對該輪廓獲取所有邊界點集合輸出到j(luò)s文件,最后供離線使用,獲取邊界點還有一個功能就是獲取當(dāng)前區(qū)域內(nèi)的左下角右上角等經(jīng)緯度坐標(biāo),這個主要是供離線地圖下載使用的,百度地圖很好的提供了bdary.get(cityname, function(rs)的函數(shù)來獲取行政區(qū)劃的邊界點集合,其中rs.boundaries就是所有的邊界點集合,估計他是服務(wù)器上存儲好的每個區(qū)域的集合,查詢到了立即返回,可能早期也是人工的一點點圈起來連線好存到到數(shù)據(jù)庫的,按照此方式其實可以搞一個程序自動將全國的所有省市邊界點集合數(shù)據(jù)全部扒下來,給離線地圖使用,測試了下貌似只支持到縣城級別,不支持具體到鄉(xiāng)鎮(zhèn)。
二、功能特點
定時器排隊下載省市輪廓圖點坐標(biāo)集合存儲到JS文件。
支持一個行政區(qū)域多個不規(guī)則區(qū)域下載。
自動計算行政區(qū)域的下載輪廓數(shù)量。
可精確選擇省份、市區(qū)、縣城,也可直接輸入行政區(qū)域的名稱。
可以設(shè)置下載間隔、隨時開始下載和停止下載。
提供編輯邊界功能,可以直接在地圖上編輯好不規(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
四、效果圖
五、相關(guān)代碼
void frmMapBoundary::getBoundary() { //判斷當(dāng)前索引對應(yīng)的省會的復(fù)選框有沒有勾選,沒有勾選則找到下一個勾選的 int count = names.count(); while (indexMain < count - 1 && !cks.at(indexMain)->isChecked()) { indexMain++; indexSub = 0; } //到了最后一個省會的索引,停止定時器 if (indexMain == count || !cks.at(indexMain)->isChecked()) { on_btnStop_clicked(); return; } //下載到省會的最后一個縣,索引自動跳到下一個省會 QStringList list = names.at(indexMain); if (indexSub == list.count()) { indexMain++; indexSub = 0; getBoundary(); return; } QString name = list.at(indexSub); addBoundary(name); indexSub++; //更新進(jìn)度條 int value = bars.at(indexMain)->value(); bars.at(indexMain)->setValue(value + 1); ui->txtTip->setText(name); } void frmMapBoundary::addBoundary() { //開啟編輯狀態(tài) QString name = ui->cboxName->currentText(); addBoundary(name, true); } void frmMapBoundary::addBoundary(const QString &name, bool edit) { currentName = name; QString js = QString("addBoundary('%1', true, %2)").arg(name).arg(edit ? "true" : "false"); runJs(js); } void frmMapBoundary::saveBoundary(const QString &fileName, const QVariant &data) { //傳過來的是行政區(qū)劃的邊界點坐標(biāo)集合,存儲到j(luò)s文件 //可能會有多個數(shù)據(jù),比如臺灣的金門島,都是獨立的區(qū)域形狀,存入數(shù)組 QStringList boundarys; QStringList list = data.toString().split("|"); foreach (QString points, list) { boundarys << QString("{'points': '%1'}").arg(points); } //最終js文件內(nèi)容數(shù)據(jù) QString boundary = QString("var boundarys = [%1]").arg(boundarys.join(", ")); QFile file(fileName); if (file.open(QFile::WriteOnly | QFile::Truncate)) { QTextStream out(&file); #if (QT_VERSION < QT_VERSION_CHECK(6,0,0)) out.setCodec("utf-8"); #endif out << boundary; } }
以上就是QT編寫地圖實現(xiàn)獲取區(qū)域邊界的詳細(xì)內(nèi)容,更多關(guān)于QT獲取區(qū)域邊界的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++文件關(guān)鍵詞快速定位出現(xiàn)的行號實現(xiàn)高效搜索
這篇文章主要為大家介紹了C++文件關(guān)鍵詞快速定位出現(xiàn)的行號實現(xiàn)高效搜索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10