Qt編寫地圖綜合應用50-獲取區域邊界

一、前言

區域邊界也是一些座標點集合,而且不同的行政區劃得到的區域邊界點數組集合個數不同,覺得部分都是一個集合,少部分有一些飛地之類的,需要多個閉合區域,所以會得到多個數組集合,繪製的時候都要分別取出來繪製就行。

獲取邊界點一般和行政區劃搭配起來使用,比如用戶輸入一個省市的名稱,然後自動定位到該省市,然後對該輪廓獲取所有邊界點集合輸出到js文件,最後供離線使用,獲取邊界點還有一個功能就是獲取當前區域內的左下角右上角等經緯度座標,這個主要是供離線地圖下載使用的,百度地圖很好的提供了bdary.get(cityname, function(rs)的函數來獲取行政區劃的邊界點集合,其中rs.boundaries就是所有的邊界點集合,估計他是服務器上存儲好的每個區域的集合,查詢到了立即返回,可能早期也是人工的一點點圈起來連線好存到到數據庫的,按照此方式其實可以搞一個程序自動將全國的所有省市邊界點集合數據全部扒下來,給離線地圖使用,測試了下貌似只支持到縣城級別,不支持具體到鄉鎮。

二、功能特點

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

三、體驗地址

  1. 體驗地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取碼:o05q 文件名:bin_map.zip
  2. 國內站點:https://gitee.com/feiyangqingyun
  3. 國際站點:https://github.com/feiyangqingyun
  4. 個人主頁:https://blog.csdn.net/feiyangqingyun
  5. 知乎主頁:https://www.zhihu.com/people/feiyangqingyun/

四、效果圖

五、相關代碼

void frmMapBoundary::getBoundary()
{
    //判斷當前索引對應的省會的複選框有沒有勾選,沒有勾選則找到下一個勾選的
    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++;

    //更新進度條
    int value = bars.at(indexMain)->value();
    bars.at(indexMain)->setValue(value + 1);
    ui->txtTip->setText(name);
}

void frmMapBoundary::addBoundary()
{
    //開啓編輯狀態
    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)
{
    //傳過來的是行政區劃的邊界點座標集合,存儲到js文件
    //可能會有多個數據,比如臺灣的金門島,都是獨立的區域形狀,存入數組
    QStringList boundarys;
    QStringList list = data.toString().split("|");
    foreach (QString points, list) {
        boundarys << QString("{'points': '%1'}").arg(points);
    }

    //最終js文件內容數據
    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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章