1. 程式人生 > 實用技巧 >vue--百度地圖點覆蓋和區域劃分(區級以下)

vue--百度地圖點覆蓋和區域劃分(區級以下)

專案中接到一個這樣的需求,需要展示公司所有員工在本市的住址分佈情況,需要展示員工資訊,需要展示本市疫情中風險地區並用紅色覆蓋,彈框展示資訊,以及快速定位該區域。

em。。。很緊急,領導要看。

來吧,二話不說開啟百度地圖api來研究,官方地址:http://lbsyun.baidu.com/

開啟api文件的時候,瞬間被潑冷水,公司網路不能使用,攔截掉了嗎?不服氣的我立馬申請了金鑰,建立了專案,寫了個例子,果不其然,攔截了。這裡沒有研究怎麼解決,畢竟公司大部分用的內網。時間緊急,放棄。。。

搗騰半天,發現百度地圖api有專門供vue使用的,可以百度搜vue-baidu-map,中文文件地址:https://dafrok.github.io/vue-baidu-map/#/zh/other/boundary。

寫了個小demo,發現還是有上面的問題。切到外網,就可以了,啊。。。咋整

突然想起以前寫的一個百度地圖覆蓋物的小筆記,哈,還可以這樣,不管了,先把功能整出來,上乾貨(這裡就不使用vue-baidu-map了,下次有需求再寫寫)

index.html檔案中引用,金鑰ak就不貼出來了,可以自己申請:http://lbsyun.baidu.com/apiconsole/key#/home

<script src="http://api.map.baidu.com/api?v=3.0&ak=xxx"></script>

index.vue檔案

<template>
    <
div class="home"> <div class="title"> <p>中風險地區:</p> <Row v-for="(item,index) in contentArray" :key="index"> <Col class="ground"><span @click="goTake(index)">{{index+1}}、{{item}}</span></Col> </
Row> </div> <div style="position:absolute;top:0;left:0;z-index:998;width:100%;height:100%;border:#ccc solid 1px;font-size:12px" id="map"></div> </div> </template>
initMap() {
    let map = new BMap.Map('map');
    let _this = this;
    _this.map = map;

    let point = new BMap.Point(121.48053886017651, 31.235929042252014) // 建立點座標
    map.centerAndZoom(point, 12) // 初始化地圖,設定中心點座標和地圖級別
    map.enableScrollWheelZoom(true) //開啟滑鼠滾輪縮放

    map.addControl(new BMap.NavigationControl()) //新增預設縮放平移控制元件
    map.addControl(new BMap.ScaleControl({anchor: BMAP_ANCHOR_BOTTOM_LEFT})) //向地圖中新增比例尺控制元件
    map.addControl(new BMap.OverviewMapControl())
    map.addControl(new BMap.MapTypeControl())
    //map.setMapStyle({ style: 'midnight' }) //地圖風格
}

重點來了,如何在地圖上建立點覆蓋和區域劃分覆蓋,達到顯示員工資訊分佈和中風險地區顯示的目的。

首先點覆蓋,公司整了份線上excel文件,裡面有所有員工資訊,那麼如何把所有資訊都展示在地圖上呢,後臺很忙,沒空把這些資料匯入資料庫,再整個介面給我,所以自己想辦法唄,不就是轉成json資料嘛。。。百度搜索excel線上轉json,地址:http://www.jsonla.com/excel2json/,順便還格式化了一下,美滋滋

init() {
    this.custArr = require('../../../../static/json/person.json');
//             this.$axios.get(URL).then((res) => {
    //    this.custArr = res.data
       this.initMap();
       this.getPoints();
    // })
},

json放在了static檔案中,這裡沒有用axios,直接用的require,使用相對路徑是為了打包後路徑依然正確。相信用過這種獲取檔案方式的人都遇到過打包後路徑不對的問題,這裡不做考究。

var myGeo = new BMap.Geocoder();

this.custArr.forEach((item,index) => {
    if(!item.address) return
    myGeo.getPoint(item.address, function(point){
        if (point) {
            let address = new BMap.Point(point.lng, point.lat);//建立座標點
                // console.log(item.name,item.address,address)
            
            let opts = {
                width:250,
                height: 100,
                title: ''
            };
            let label = new BMap.Label(item.name,{offset:new BMap.Size(25,5)})
            label.setStyle({
                color: 'blue',
                borderRadius: '3px',
                borderColor: 'blue',
                padding: '0 3px',
                fontFamily: '微軟雅黑'
            });
            let content = '<div>';
                content += '<p style="height:20px;line-height:20px;">二級部門:' + item.department + '</p>';
                content += '<p style="height:20px;line-height:20px;">姓名:' + item.name + '</p>';
                content += '<p style="height:20px;line-height:20px;">手機號:' + item.phone + '</p>';
                content += '<p style="height:20px;line-height:20px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;" title="'+item.address+'">住址:' + item.address + '</p>';
                content += '<p style="height:20px;line-height:20px;">小區名:' + item.village + '</p>';
            let infoWindows = new BMap.InfoWindow(content,opts);
            _this.addMarker(address,label,infoWindows);
        }
    },'中國');
})

if(this.boundariesArr.length != 0){
    setTimeout(function () {
        _this.getBoundary(map);
    }, 2000);
}

addMarker (points,label,infoWindows) {
    let greenIcon = new BMap.Icon(require("./images/greenIcon.png"), new BMap.Size(26, 26));
    let markers = new BMap.Marker(points, {icon: greenIcon});
    this.map.addOverlay(markers);
    markers.setLabel(label);
    markers.addEventListener("click",function (event) {
        this.map.openInfoWindow(infoWindows,points);//引數:視窗、點  根據點選的點出現對應的視窗
    });
},
getBoundary(map) {
    let polygons = [];

    let colors = ["#b95817", "#fff492", "#fff492"];

    let pointArray = [];
    this.boundariesArr.forEach(item => {
        var ply = new BMap.Polygon(item, { strokeWeight: 2, strokeColor: "#ff0000" }); //建立多邊形覆蓋物
        ply.setFillColor(colors[0])   //設定多邊形的填充顏色
        ply.setFillOpacity(0.35);

        // ply.enableEditing();  //範圍可編輯
        polygons.push(ply);  //加入多邊形陣列,以之後獲取多邊形邊界點集

        map.addOverlay(ply);  //新增覆蓋物
        pointArray = pointArray.concat(ply.getPath());
    })
    // console.log(pointArray,123);
    // map.setViewport(pointArray);    //調整視野  
    this.addlabel(map);
},

這裡建立點覆蓋,和區域覆蓋貼了部分程式碼,大部分都是官網api就能看到。

最重要的問題來了,區域覆蓋,如何獲取行政區域區級以下邊界的點集,查了很多資料,大部分也沒有說出個所以然來,其實很簡單,百度地圖自己就帶有這樣的功能。

先上個地址:http://api.map.baidu.com/lbsapi/creatmap/, 一看是不是就明悟了一些

<--未完待續-->