Qt編寫地圖綜合應用54-動態點位標註

一、前言

動態點位標註是定製的一個功能模塊,提供直接地圖上選點設置標記點,點位信息用結構體存儲,其中包括了經度、緯度、速度、時間等信息,單擊對應的標註點可以顯示詳細的彈框信息,彈框信息採用自定義的html格式顯示,而不是地圖自帶的格式,這樣顯示更方便,比如可控不同行不同顏色或者加粗。標註點可選是否標記,標記的話就是一個設備圖標顯示,不標記的就普通的顯示,一般在明顯的拐彎的地方建議設置標記。

近期在動態點位標註功能中還增加了新增點以後立即移動到地圖中心,相當於把新增的點作爲地圖中心點,這樣可以保證每次都能看到新增的點位置,不然還要自己去移動拉動地圖才能看到,其實後面的路書功能也可以增加類似的處理,軌跡點在移動的時候自動切換最近的點爲中心點。

二、功能特點

  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 frmMapMarker::append(const MarkerInfo &markerInfo)
{
    //先刪除上一次添加的線條,不然會重疊不好看
    runJs("deleteOverlay('Polyline')");

    //取出詳細數據,添加到座標集合中進行繪製線條
    QString point = markerInfo.lng + "," + markerInfo.lat;
    points << point;
    QString js = QString("addPolyline('%1')").arg(points.join("|"));
    runJs(js);

    //如果isMark則還需要添加對應的點
    if (markerInfo.isMark) {
        //標註點名稱 爲空則不顯示
        QString name = "";
        //標註點地址 爲空則不顯示
        QString addr = "";
        //標註點彈框信息html格式標題 爲空則採用默認的格式
        QString title = "";
        //title = "<div style=\"color:#CE5521;font-size:25px;\">標題: 測試設備</div>";

        //標註點彈框信息html格式內容 爲空則採用默認的格式
        QString tips = "";
        QStringList list;
        list << QString("<div style=\"color:#CE5521;font-size:15px;\">經度: %1</div>").arg(markerInfo.lng);
        list << QString("<div style=\"color:#CE5521;font-size:15px;\">緯度: %1</div>").arg(markerInfo.lat);
        list << QString("<div style=\"color:#CE5521;font-size:15px;\">速度: %1 kv/h</div>").arg(markerInfo.speed);
        list << QString("<div style=\"color:#CE5521;font-size:15px;\">時間: [%1]</div>").arg(markerInfo.time);
        tips = list.join("");

        //標註點彈框信息最小寬度
        int width = 150;
        //單擊以後觸發什麼動作 0-不處理 1-自己彈框 2-發送信號
        int action = 1;
        //動畫效果 0-不處理 1-跳動 2-墜落
        int animation = 0;

        //動態圖 http://lbsyun.baidu.com/jsdemo/img/fox.gif
        //靜態圖 http://api.map.baidu.com/img/markers.png 需要指定iconindex
        //本地圖 m0.png ./m0.png m1.png 圖標必須放在config文件夾下 大小默認53*52
        //爲空則採用默認圖標
        QString iconfile = "http://api.map.baidu.com/img/markers.png";
        QString js = QString("addMarker('%1', '%2', '%3', '%4', %5, '%6', %7, %8, '%9')")
                     .arg(name).arg(addr).arg(title).arg(tips).arg(width)
                     .arg(point).arg(action).arg(animation).arg(iconfile);
        runJs(js);

        //移動中心點到當前點,不需要可以註釋掉
        js = QString("setCenter('%1')").arg(point);
        runJs(js);
    }

    int count = ui->tableWidget->rowCount() + 1;
    ui->tableWidget->setRowCount(count);

    QTableWidgetItem *itemLng = new QTableWidgetItem;
    QTableWidgetItem *itemLat = new QTableWidgetItem;
    QTableWidgetItem *itemMark = new QTableWidgetItem;
    QTableWidgetItem *itemSpeed = new QTableWidgetItem;
    QTableWidgetItem *itemTime = new QTableWidgetItem;

    itemLng->setText(markerInfo.lng);
    itemLat->setText(markerInfo.lat);
    itemMark->setText(markerInfo.isMark ? "是" : "否");
    itemSpeed->setText(QString::number(markerInfo.speed));
    itemTime->setText(markerInfo.time);

    ui->tableWidget->setItem(count - 1, 0, itemLng);
    ui->tableWidget->setItem(count - 1, 1, itemLat);
    ui->tableWidget->setItem(count - 1, 2, itemMark);
    ui->tableWidget->setItem(count - 1, 3, itemSpeed);
    ui->tableWidget->setItem(count - 1, 4, itemTime);
}

void frmMapMarker::clear()
{
    points.clear();
    ui->tableWidget->setRowCount(0);
    runJs("deleteOverlay('')");
}

void frmMapMarker::on_btnAdd_clicked()
{
    MarkerInfo markerInfo;
    markerInfo.lng = ui->txtLng->text().trimmed();
    markerInfo.lat = ui->txtLat->text().trimmed();
    markerInfo.isMark = (ui->cboxMark->currentIndex() == 0);
    markerInfo.speed = ui->txtSpeed->text().trimmed().toInt();
    markerInfo.time = ui->txtTime->text().trimmed();
    append(markerInfo);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章