QT編寫(xiě)地圖實(shí)現(xiàn)獲取區(qū)域邊界
一、前言
區(qū)域邊界也是一些坐標(biāo)點(diǎn)集合,而且不同的行政區(qū)劃得到的區(qū)域邊界點(diǎn)數(shù)組集合個(gè)數(shù)不同,覺(jué)得部分都是一個(gè)集合,少部分有一些飛地之類(lèi)的,需要多個(gè)閉合區(qū)域,所以會(huì)得到多個(gè)數(shù)組集合,繪制的時(shí)候都要分別取出來(lái)繪制就行。
獲取邊界點(diǎn)一般和行政區(qū)劃搭配起來(lái)使用,比如用戶輸入一個(gè)省市的名稱,然后自動(dòng)定位到該省市,然后對(duì)該輪廓獲取所有邊界點(diǎn)集合輸出到j(luò)s文件,最后供離線使用,獲取邊界點(diǎn)還有一個(gè)功能就是獲取當(dāng)前區(qū)域內(nèi)的左下角右上角等經(jīng)緯度坐標(biāo),這個(gè)主要是供離線地圖下載使用的,百度地圖很好的提供了bdary.get(cityname, function(rs)的函數(shù)來(lái)獲取行政區(qū)劃的邊界點(diǎn)集合,其中rs.boundaries就是所有的邊界點(diǎn)集合,估計(jì)他是服務(wù)器上存儲(chǔ)好的每個(gè)區(qū)域的集合,查詢到了立即返回,可能早期也是人工的一點(diǎn)點(diǎn)圈起來(lái)連線好存到到數(shù)據(jù)庫(kù)的,按照此方式其實(shí)可以搞一個(gè)程序自動(dòng)將全國(guó)的所有省市邊界點(diǎn)集合數(shù)據(jù)全部扒下來(lái),給離線地圖使用,測(cè)試了下貌似只支持到縣城級(jí)別,不支持具體到鄉(xiāng)鎮(zhèn)。
二、功能特點(diǎn)
定時(shí)器排隊(duì)下載省市輪廓圖點(diǎn)坐標(biāo)集合存儲(chǔ)到JS文件。
支持一個(gè)行政區(qū)域多個(gè)不規(guī)則區(qū)域下載。
自動(dòng)計(jì)算行政區(qū)域的下載輪廓數(shù)量。
可精確選擇省份、市區(qū)、縣城,也可直接輸入行政區(qū)域的名稱。
可以設(shè)置下載間隔、隨時(shí)開(kāi)始下載和停止下載。
提供編輯邊界功能,可以直接在地圖上編輯好不規(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
四、效果圖

五、相關(guān)代碼
void frmMapBoundary::getBoundary()
{
//判斷當(dāng)前索引對(duì)應(yīng)的省會(huì)的復(fù)選框有沒(méi)有勾選,沒(méi)有勾選則找到下一個(gè)勾選的
int count = names.count();
while (indexMain < count - 1 && !cks.at(indexMain)->isChecked()) {
indexMain++;
indexSub = 0;
}
//到了最后一個(gè)省會(huì)的索引,停止定時(shí)器
if (indexMain == count || !cks.at(indexMain)->isChecked()) {
on_btnStop_clicked();
return;
}
//下載到省會(huì)的最后一個(gè)縣,索引自動(dòng)跳到下一個(gè)省會(huì)
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()
{
//開(kāi)啟編輯狀態(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)
{
//傳過(guò)來(lái)的是行政區(qū)劃的邊界點(diǎn)坐標(biāo)集合,存儲(chǔ)到j(luò)s文件
//可能會(huì)有多個(gè)數(shù)據(jù),比如臺(tái)灣的金門(mén)島,都是獨(dú)立的區(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ě)地圖實(shí)現(xiàn)獲取區(qū)域邊界的詳細(xì)內(nèi)容,更多關(guān)于QT獲取區(qū)域邊界的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++文件關(guān)鍵詞快速定位出現(xiàn)的行號(hào)實(shí)現(xiàn)高效搜索
這篇文章主要為大家介紹了C++文件關(guān)鍵詞快速定位出現(xiàn)的行號(hào)實(shí)現(xiàn)高效搜索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
C++11系列學(xué)習(xí)之類(lèi)型推導(dǎo)
這篇文章主要介紹了C++11系列學(xué)習(xí)之類(lèi)型推導(dǎo),文章基于C++的相關(guān)資料展開(kāi)對(duì)主題的詳細(xì)內(nèi)容介紹,具有一定的參考價(jià)值需要的小伙伴可參考一下2022-04-04
詳解C語(yǔ)言中二級(jí)指針與鏈表的應(yīng)用
對(duì)于初學(xué)者而言,有很多地方肯定是費(fèi)解的。比如函數(shù)的參數(shù)列表的多樣化,動(dòng)態(tài)分配內(nèi)存空間函數(shù)malloc等,其實(shí)這些知識(shí)和指針聯(lián)系緊密,尤其是二級(jí)指針,快跟隨小編來(lái)學(xué)習(xí)一下吧2022-07-07
C++指針運(yùn)算符(&和*)的實(shí)現(xiàn)
C++ 提供了兩種指針運(yùn)算符,一種是取地址運(yùn)算符 &,一種是間接尋址運(yùn)算符 *,本文就詳細(xì)的介紹一下這兩種運(yùn)算符的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08

