百度地圖實現鼠標繪制圖形並獲取相關數據


<template>
  <div id="business">
    <div class="search-wrapper">
      <el-form  :model="business" size="small">
        <el-row>
          <el-col :span="6">
            <el-form-item label="省份">
              <el-select v-model="business.addressProvince" size='small'>
                <el-option
                  v-for="item in provinceArray"
                  :key="item.index"
                  :label="item"
                  :value="item">
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="城市">
              <el-select v-model="business.addressCity" size='small'>
                <el-option
                  v-for="item in cityArray"
                  :key="item.index"
                  :label="item"
                  :value="item">
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="區域">
              <el-select v-model="business.addressDistrict" size='small'>
                <el-option
                  v-for="item in districtArray"
                  :key="item.index"
                  :label="item"
                  :value="item">
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="6">
            <el-form-item label="葯店名稱">
              <el-select v-model="business.sellerUserId" size='small'>
                <el-option
                  v-for="item in sellerUserList"
                  :key="item.index"
                  :label="item.sellerName"
                  :value="item.sellerUserId">
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="24">
            <el-form-item>
              <!-- 操作 -->
              <el-button type="primary" icon="el-icon-edit" size="small" @click="edit">編輯</el-button>
              <el-button type="primary" icon="el-icon-error" size="small" @click="clearAll">重繪</el-button>
              <el-button type="primary" icon="el-icon-success" size="small" @click="preservation">保存</el-button>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
    </div>
    <div class="enclosureTil">
      <div>繪制電子圍欄多邊形圖案完成時,請雙擊鼠標左鍵 確定完成圖案的繪制結束;點擊編輯電子圍欄的范圍時,請將地圖右上角的繪制工具替換成 <img src="./imgs/1.png" alt=""> 第一個小手的編輯狀態。</div>
      <div>繪制圓形和矩形的時候,需要點擊鼠標右上角的小手來結束繪制的狀態。</div>
    </div>
    <div>
      <div id="allmap" style="overflow:hidden;zoom:1;position:relative;">
        <div id="map" style="height:100%;-webkit-transition: all 0.5s ease-in-out;transition: all 0.5s ease-in-out;"></div>
      </div>
    </div>
  </div>
</template>

<script>
import javaAjax from '@/utils/javaApiRequest';
import BMap from 'BMap';
import BMapLib from 'BMapLib';
import BMAP_ANCHOR_TOP_RIGHT from 'BMAP_ANCHOR_TOP_RIGHT';
export default {
  data() {
    return {
      business: {
        addressProvince: '', // 省份
        addressCity: '', // 城市
        addressDistrict: '', // 區域
        sellerName: '', // 葯店
        sellerUserId: '', // 葯店id
      },
      // 省份列表
      provinceArray: [],
      // 城市列表
      cityArray: [],
      // 區域列表
      districtArray: [],
      // 葯店列表
      // sellerNameArray: [],
      // 葯店信息列表
      sellerUserList: [],
      // 商戶信息
      merchantInfo: '',
      // 保存圍欄的數據
      fence: {
        sellerUserId: '',
        shippingArea: [],
        // backupsShippingArea: []
      },
      // 百度地圖
      map: '',
      // 圍欄數據
      overlays: [],
      // 繪制圍欄得到的坐標值
      coordinate: [],
      // 圍欄樣式
      styleOptions: {
        strokeColor: 'red',    // 邊線顏色。
        fillColor: '#ccc',      // 填充顏色。當參數為空時,圓形將沒有填充效果。
        strokeWeight: 2,       // 邊線的寬度,以像素為單位。
        strokeOpacity: 0.8,    // 邊線透明度,取值范圍0 - 1。
        fillOpacity: 0.6,      // 填充的透明度,取值范圍0 - 1。
        strokeStyle: 'solid'   // 邊線的樣式,solid或dashed。
      },
      // 鼠標繪制工具
      drawingManager: {},
      // 商戶id
      sellerUserId: '',
      isWholeCountry: 1,
    };
  },
  watch: {
    // 省份
    'business.addressProvince': function() {
      this.business.addressCity = '';
      this.business.addressDistrict = '';
      this.business.sellerName = '';
      this.business.sellerUserId = '';
      this.isWholeCountry = 0;
      this.getCity();
    },
    //
    'business.addressCity': function() {
      this.business.addressDistrict = '';
      this.business.sellerName = '';
      this.business.sellerUserId = '';
      this.getArea();
    },
    //
    'business.addressDistrict': function() {
      this.business.sellerName = '';
      this.business.sellerUserId = '';
      this.getPharmacy();
    },
    // 葯店
    'business.sellerUserId': function() {
      if (this.business.sellerUserId) {
        this.queryMerchant();
      }
    },
  },
  methods: {
    // 選擇范圍重置坐標點
    resetCoordinate(sellerUserList) {
      // 建立坐標點:
      // lng:經度 lat:緯度
      let points = sellerUserList.map(item => {
        return {
          lng: item.longitude,
          lat: item.latitude,
          sellerUserId: item.sellerUserId,
          sellerName: item.sellerName,
          shippingArea: item.shippingArea,
          businessDate: item.businessDate
        };
      });
      // 清除之前的坐標點
      let allOverlay = this.map.getOverlays();
      for (let i = 0; i < allOverlay.length - 1; i++) {
        this.map.removeOverlay(allOverlay[i]);
      }
      this.createCoordinate(points);
    },
    //
    getProvince() {
      javaAjax.post(`/mall_manage/authority/queryThreeLevelLinkage`, this.business).then((res) => {
        if (res.status === 200 && res.data.resultCode === '0') {
          this.provinceArray = res.data.resultData.provinceArray;
          // this.sellerNameArray = res.data.resultData.sellerNameArray;
          this.sellerUserList = res.data.resultData.sellerUserList;
        }
      });
    },
    //
    getCity() {
      javaAjax.post(`/mall_manage/authority/queryThreeLevelLinkage`, this.business).then((res) => {
        if (res.status === 200 && res.data.resultCode === '0') {
          this.cityArray = res.data.resultData.cityArray;
          // this.sellerNameArray = res.data.resultData.sellerNameArray;
          this.sellerUserList = res.data.resultData.sellerUserList;
          this.resetCoordinate(res.data.resultData.sellerUserList);
        }
      });
    },
    //
    getArea() {
      javaAjax.post(`/mall_manage/authority/queryThreeLevelLinkage`, this.business).then((res) => {
        if (res.status === 200 && res.data.resultCode === '0') {
          this.districtArray = res.data.resultData.districtArray;
          // this.sellerNameArray = res.data.resultData.sellerNameArray;
          this.sellerUserList = res.data.resultData.sellerUserList;
          this.resetCoordinate(res.data.resultData.sellerUserList);
        }
      });
    },
    // 葯店
    getPharmacy() {
      javaAjax.post(`/mall_manage/authority/queryThreeLevelLinkage`, this.business).then((res) => {
        if (res.status === 200 && res.data.resultCode === '0') {
          // this.sellerNameArray = res.data.resultData.sellerNameArray;
          this.sellerUserList = res.data.resultData.sellerUserList;
          this.resetCoordinate(res.data.resultData.sellerUserList);
        }
      });
    },
    // 查詢商戶詳細的信息
    queryMerchant() {
      javaAjax.post(`/mall_manage/authority/queryAppointSellerUser`, this.business).then((res) => {
        if (res.status === 200 && res.data.resultCode === '0') {
          let tempData = res.data.resultData[0];
          console.log(tempData);
          this.merchantInfo = tempData;
          this.fence.sellerUserId = tempData.sellerUserId;
          // 顯示的地圖范圍移動至選擇的葯店附近
          let new_point = new BMap.Point(tempData.longitude, tempData.latitude);
          this.map.centerAndZoom(new_point, 15);
          this.map.panTo(new_point);
          this.ready(tempData.longitude, tempData.latitude);
          this.resetCoordinate(res.data.resultData);
          // 初始化電子圍欄
          this.clearAll();
          // 當商戶有圍欄信息的時候將會繪制原本商戶已有的圍欄
          if (tempData.shippingArea) {
            let xyArray =  JSON.parse(tempData.shippingArea);
            // 顯示商戶的電子圍欄區域
            if (xyArray.length > 0) {
              let polylinePointsArray = [];
              for (let i = 0; i < xyArray.length; i++) {
                polylinePointsArray[i] = new BMap.Point(xyArray[i].y, xyArray[i].x);
              }
              let polygon = new BMap.Polygon(polylinePointsArray, this.styleOptions);  // 創建多邊形
              this.map.addOverlay(polygon);   // 增加多邊形
              this.overlays.push(polygon); // 是否把該圖像加入到編輯和刪除行列
              this.overlays[0].enableEditing();// 開啟編輯狀態
            }
          }
        }
      });
    },
    // 百度坐標轉火星坐標
    bd_decrypt(bd_lng, bd_lat) {
      let X_PI = Math.PI * 3000.0 / 180.0;
      let x = bd_lng - 0.0065;
      let y = bd_lat - 0.006;
      let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * X_PI);
      let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * X_PI);
      let gg_lng = z * Math.cos(theta);
      let gg_lat = z * Math.sin(theta);
      return { y: gg_lng, x: gg_lat };
    },
    // 百度地圖API功能初始化
    ready(longitude, latitude) {
      let lon  = longitude ? longitude : 114.066519;
      let lat  = latitude ? latitude : 22.549303;
      let _this = this;
      // 創建Map實例
      _this.map = new BMap.Map('map');
      // 初始化地圖,設置中心點坐標和地圖級別
      // let poi = new BMap.Point(114.066519, 22.549303);
      let poi = new BMap.Point(lon, lat);
      _this.map.centerAndZoom(poi, 15);
      // 啟用滾輪放大縮小,默認禁用
      _this.map.enableScrollWheelZoom();
      // 繪制工具事件
      let overlaycomplete = function(e) {
        _this.clearAll();
        _this.overlays = [];
        _this.coordinate = [];
        _this.overlays.push(e.overlay);
        let path = e.overlay.getPath();// Array<Point> 返回多邊型的點數組'y:' + path[i].lng + ',x:' + path[i].lat
        console.log(path);
        for (let i = 0; i < path.length; i++) {
          _this.coordinate.push({ x: path[i].lat, y: path[i].lng });
          // 百度坐標轉火星坐標
          // let t = _this.bd_decrypt(path[i].lng, path[i].lat);
          // _this.coordinate.push(t);
        }
        console.log(_this.coordinate);
      };
      // 實例化鼠標繪制工具
      _this.drawingManager = new BMapLib.DrawingManager(_this.map, {
        isOpen: false, // 是否開啟繪制模式
        enableDrawingTool: true, // 是否顯示工具欄
        drawingToolOptions: {
          anchor: BMAP_ANCHOR_TOP_RIGHT, // 位置
          offset: new BMap.Size(5, 5), // 偏離值
        },
        circleOptions: _this.styleOptions, // 圓的樣式
        polylineOptions: _this.styleOptions, // 線的樣式
        polygonOptions: _this.styleOptions, // 多邊形的樣式
        rectangleOptions: _this.styleOptions // 矩形的樣式
      });
      // 添加鼠標繪制工具監聽事件,用於獲取繪制結果
      _this.drawingManager.addEventListener('overlaycomplete', overlaycomplete);
    },
    // 編輯
    edit() {
      this.overlays[0].enableEditing();
    },
    // 保存
    preservation() {
      if (this.overlays.length === 0) {
        this.$message('請先繪制電子圍欄才能保存');
        return false;
      }
      this.overlays[0].disableEditing();
      // this.coordinate = [];
      // let path = this.overlays[0].getPath();// Array<Point> 返回多邊型的點數組
      // for (let i = 0; i < path.length; i++) {
      //   this.coordinate.push({ y: path[i].lng, x: path[i].lat });
      // }
      this.fence.shippingArea = this.coordinate;
      // this.fence.backupsShippingArea = this.coordinate;
      console.log(this.fence);
      javaAjax.post(`/mall_manage/authority/updateShippingAreea`, this.fence).then((res) => {
        console.log(res);
        if (res.status === 200 && res.data.resultCode === '0') {
          this.$message(res.data.msg);
          // 保存成功之后刷新頁面上的數據
        }
      });
    },
    // 重繪
    clearAll() {
      for (let i = 0; i < this.overlays.length; i++) {
        this.map.removeOverlay(this.overlays[i]);
      }
      this.overlays = [];
      this.coordinate = [];
    },
    // 編寫信息顯示方法
    showInfo(thisMarker, point, _this) {
      console.log(point);
      _this.fence.sellerUserId = point.sellerUserId;
      // 點擊坐標點的時候顯示的地圖范圍移動至選擇的葯店附近
      let new_point = new BMap.Point(point.lng, point.lat);
      this.map.centerAndZoom(new_point, 15);
      this.map.panTo(new_point);
      // 初始化電子圍欄
      _this.clearAll();
      // 當商戶有圍欄信息的時候將會繪制原本商戶已有的圍欄
      if (point.shippingArea) {
        let xyArray =  JSON.parse(point.shippingArea);
        // 顯示商戶的電子圍欄區域
        if (xyArray.length > 0) {
          let polylinePointsArray = [];
          for (let i = 0; i < xyArray.length; i++) {
            polylinePointsArray[i] = new BMap.Point(xyArray[i].y, xyArray[i].x);
          }
          let polygon = new BMap.Polygon(polylinePointsArray, _this.styleOptions);  // 創建多邊形
          _this.map.addOverlay(polygon);   // 增加多邊形
          _this.overlays.push(polygon); // 是否把該圖像加入到編輯和刪除行列
          _this.overlays[0].enableEditing();// 開啟編輯狀態
        }
      }
      // 獲取點的信息
      let sContent =
        '<ul style="margin:0 0 5px 0;padding:0.2em 0">'
        + '<li style="line-height: 26px;font-size: 15px;">'
        + '<span style="width: 200px;display: inline-block;">葯店id:</span>' + point.sellerUserId + '</li>'
        + '<li style="line-height: 26px;font-size: 15px;">'
        + '<span style="width: 200px;display: inline-block;">葯店名稱:</span>' + point.sellerName + '</li>'
        + '<li style="line-height: 26px;font-size: 15px;">'
        + '<span style="width: 200px;display: inline-block;">營業日期:</span>' + point.businessDate + '</li>'
        + '</ul>';
      let infoWindow = new BMap.InfoWindow(sContent); // 創建信息窗口對象
      thisMarker.openInfoWindow(infoWindow); // 圖片加載完后重繪infoWindow
    },
    // 創建坐標點
    createCoordinate(points) {
      let _this = this;
      // 循環建立標注點
      for (let i = 0, pointsLen = points.length; i < pointsLen; i++) {
        let point = new BMap.Point(points[i].lng, points[i].lat); // 將標注點轉化成地圖上的點
        let marker = new BMap.Marker(point); // 將點轉化成標注點
        this.map.addOverlay(marker);  // 將標注點添加到地圖上
        // 添加監聽事件
        (function() {
          let thePoint = points[i];
          marker.addEventListener('click',
            // 顯示信息的方法
            function() {
              _this.showInfo(this, thePoint, _this);
            });
        })();
      }
    },
    // 查詢全國數據的所有商戶電子圍欄
    wholeCountry() {
      this.isWholeCountry = 1;
      javaAjax.post(`/mall_manage/authority/queryShippingAreeaIsNotNull`, { 'sellerUserId': this.sellerUserId }).then((res) => {
        if (res.status === 200 && res.data.resultCode === '0') {
          let tempData = res.data.resultData;
          // 建立坐標點:
          // lng:經度 lat:緯度
          let points = tempData.map(item => {
            return {
              lng: item.longitude,
              lat: item.latitude,
              sellerUserId: item.sellerUserId,
              sellerName: item.sellerName,
              shippingArea: item.shippingArea,
              businessDate: item.businessDate
            };
          });
          this.createCoordinate(points);
        }
      });
    }
  },
  mounted() {
    this.ready();
  },
  created() {
    // 查詢全國數據的所有商戶電子圍欄
    this.wholeCountry();
    // 獲取省列表
    this.getProvince();
  }
};
</script>

<style lang="less" scoped>
#allmap,#editMap {
  width: 100%; height:500px; overflow: hidden;
  border: 1px solid #ccc;
  /deep/ .BMapLib_box.BMapLib_marker,/deep/ .BMapLib_box.BMapLib_polyline{
    display: none;
  }
}
dl,dt,dd,ul,li{
  margin:0;
  padding:0;
  list-style:none;
}
p{font-size:12px;}
dt{
  font-size:14px;
  font-family:"微軟雅黑";
  font-weight:bold;
  border-bottom:1px dotted #000;
  padding:5px 0 5px 5px;
  margin:5px 0;
}
dd{
  padding:5px 0 0 5px;
}
li{
  line-height:28px;
}
.enclosureTil{
  div{
    line-height: 20px;
    font-size: 16px;
    color: red;
  }
  img{
    width: 30px;
    height: 30px;
  }
}
</style>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM