RuoYi vue-element-admin 增加原生高德地圖並顯示海量點

haiyaoyouyou發表於2020-11-20

1、在public/index.html中增加js引用

記得放到head中

  <!-- 引入高德地圖API -->
  <script type="text/javascript" src="http://webapi.amap.com/maps?v=1.4.15&key=1edb3d323fb05a961b3321111111ddff145"></script>

2、vue.config.js 增加配置內容

    externals: {
      'AMap': 'AMap',
      'AMapUI': 'AMapUI'
    }

3、要引用地圖的頁面

要顯示地圖的div

    <!-- 顯示地圖的div -->
    <div id="mapDiv" ref="mapDiv" class="mapDiv">
      loading...
    </div>

 引用AMap

import AMap from 'AMap'

初始化地圖 

 // 初始化地圖
    initMap() {
      const map = new AMap.Map('mapDiv', {
        center: [120.56587, 36.20366],
        resizeEnable: true,
        zoom: 12
        // lang: 'en'
      })
      this.map = map

      // 地圖新增各種控制元件
      AMap.plugin(['AMap.ControlBar', 'AMap.Scale', 'AMap.MapType', 'AMap.Geolocation'], function() {
        // 在圖面新增工具條控制元件,工具條控制元件整合了縮放、平移、定位等功能按鈕在內的組合控制元件
        map.addControl(new AMap.ToolBar())
        // 在圖面新增類別切換控制元件,實現預設圖層與衛星圖、實施交通圖層之間切換的控制
        map.addControl(new AMap.MapType())

        // 在圖面新增定位控制元件,用來獲取和展示使用者主機所在的經緯度位置
        // map.addControl(new AMap.Geolocation())

        // 在圖面新增比例尺控制元件,展示地圖在當前層級和緯度下的比例尺
        map.addControl(new AMap.Scale())
      })

      // 海量點的樣式
      var style = [{
        // 必填引數,圖示的地址
        url: 'https://a.amap.com/jsapi_demos/static/images/mass0.png',
        // 必填引數,圖示顯示位置偏移量,以圖示的左上角為基準點(0,0)點,例如:anchor:new AMap.Pixel(5,5)
        anchor: new AMap.Pixel(6, 6),
        // 必填引數,圖示的尺寸;例如:size:new AMap.Size(11,11)
        size: new AMap.Size(11, 11)
      },
      // 紅色 未除治
      {
        url: this.baseURL + '/storage/dfs/display?path=group1/M00/00/0E/wKgABV-2IPiAEO2hAAAEJdf9ZKs794.png',
        anchor: new AMap.Pixel(6, 6),
        size: new AMap.Size(11, 11)
      },
      // 綠色  已經除治
      {
        url: this.baseURL + '/storage/dfs/display?path=group1/M00/00/0E/wKgABV-2IriAQ7-IAAAEJWeQRis039.png',
        anchor: new AMap.Pixel(6, 6),
        size: new AMap.Size(11, 11)
      },
      // 灰色以前的資料
      {
        url: this.baseURL + '/storage/dfs/display?path=group1/M00/00/0E/wKgABV-2IyGAS1xQAAAEJeELcZs238.png',
        anchor: new AMap.Pixel(6, 6),
        size: new AMap.Size(11, 11)
      }]

      this.mass = new AMap.MassMarks(null, {
        // 圖層的透明度,取值範圍[0,1],1代表完全不透明,0代表完全透明
        opacity: 0.6,
        // 圖層疊加的順序值,0表示最底層。預設zIndex:5
        zIndex: 111,
        // 指定滑鼠懸停時的滑鼠樣式,自定義cursor,IE僅支援cur/ani/ico格式,Opera不支援自定義cursor
        cursor: 'pointer',
        style: style,
        // 表示是否在拖拽縮放過程中實時重繪,預設true,建議超過10000的時候設定false
        alwaysRender: false
      })

      // 滑鼠懸浮 彈出視窗
      var marker = new AMap.Marker({ content: ' ', map: map })

      this.mass.on('mouseover', function(e) {
        marker.setPosition(e.data.lnglat)
        marker.setLabel({ content: e.data.name })
      })

      // 海量點繫結到地圖上
      this.mass.setMap(map)
    },

附:整個vue程式碼 

<template>
  <div class="app-container">
    <!-- 搜尋工具欄 -->
    <el-form v-show="showSearch" ref="queryForm" :model="queryParams" :inline="true" label-width="68px">
      <el-form-item label="" prop="deptId">
        <!-- <treeselect v-model="form.deptId" :options="deptOptions" :disable-branch-nodes="true" :show-count="true" placeholder="請選擇歸屬部門" /> -->
        <treeselect v-model="queryParams.deptId" :options="deptOptions" :show-count="true" placeholder="歸屬區域" clearable size="small" style="width: 180px" />
      </el-form-item>
      <el-form-item label="" prop="compart">
        <el-input
          v-model="queryParams.compart"
          placeholder="請輸入小班編號"
          clearable
          size="small"
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="" prop="markSn">
        <el-input
          v-model="queryParams.markSn"
          placeholder="請輸入疫木編號"
          clearable
          size="small"
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <!-- <el-form-item label="" prop="deptId">
        <el-input
          v-model="queryParams.deptId"
          placeholder="請輸入部門ID"
          clearable
          size="small"
          @keyup.enter.native="handleQuery"
        />
      </el-form-item> -->

      <el-form-item label="" prop="treeStatus">
        <el-select v-model="queryParams.treeStatus" placeholder="疫木除治狀態" clearable size="small">
          <el-option
            v-for="dict in treeStatusOptions"
            :key="dict.dictValue"
            :label="dict.dictLabel"
            :value="dict.dictValue"
          />
        </el-select>
      </el-form-item>

      <el-form-item label="" prop="markOperate">
        <el-input
          v-model="queryParams.markOperate"
          placeholder="請輸入定標操作人"
          clearable
          size="small"
          @keyup.enter.native="handleQuery"
        />
      </el-form-item>
      <el-form-item label="" prop="markTime">
        <el-date-picker
          v-model="queryParams.beginTime"
          clearable
          size="small"
          style="width: 200px"
          type="date"
          value-format="yyyy-MM-dd"
          placeholder="開始時間"
        />
      </el-form-item>

      <el-form-item label="" prop="markTime">
        <el-date-picker
          v-model="queryParams.endTime"
          clearable
          size="small"
          style="width: 200px"
          type="date"
          value-format="yyyy-MM-dd"
          placeholder="結束時間"
        />
      </el-form-item>

      <el-form-item>
        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜尋</el-button>
        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
      </el-form-item>
    </el-form>
    <!-- 顯示地圖的div -->
    <div id="mapDiv" ref="mapDiv" class="mapDiv">
      loading...
    </div>

  </div>
</template>
<script>
import AMap from 'AMap'
import { listMarkAll } from '@/api/tree/mark'
import { treeselect } from '@/api/system/dept'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'

// import tdtmap from '@/utils/tdt-map'
export default {
  name: 'Mark',
  components: { Treeselect },
  data() {
    return {

      baseURL: process.env.VUE_APP_BASE_API,
      // 遮罩層
      loading: true,
      // 選中陣列
      ids: [],
      // 非單個禁用
      single: true,
      // 非多個禁用
      multiple: true,
      // 顯示搜尋條件
      showSearch: true,
      // 總條數
      total: 0,
      // 定標資訊表格資料
      markList: [],
      // 彈出層標題
      title: '',
      // 是否顯示彈出層
      open: false,
      // 部門樹選項
      deptOptions: undefined,
      // 疫木狀態字典
      treeStatusOptions: [],
      // 定標標誌字典
      markFlagOptions: [],
      // 除治標誌字典
      sealedFlagOptions: [],
      // 定標型別字典
      markTypeOptions: [],

      // 查詢引數
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        markSn: null,
        deptId: null,
        treeStatus: null,
        compart: null,
        diam: null,
        markPic1: null,
        markPic2: null,
        markPic3: null,
        markPic4: null,
        markOperate: null,
        markTime: null,
        markUploadTime: null,
        markFlag: null,
        markRemark: null,
        operate: null
      },
      // 表單引數
      form: {},
      // 地圖物件
      map: '',
      mass: '',

      infowindowL: null // 資訊窗體

    }
  },
  created() {
    this.getList()
    this.getTreeselect()
    this.getDicts('tree_status').then(response => {
      this.treeStatusOptions = response.data
    })
    this.getDicts('work_flag').then(response => {
      this.markFlagOptions = response.data
      this.sealedFlagOptions = response.data
    })

    this.getDicts('mark_type').then(response => {
      this.markTypeOptions = response.data
    })
  },

  mounted() {
    this.initMap()
  },
  methods: {
    /** 查詢疫木位置列表 */
    getList() {
      this.loading = true
      listMarkAll(this.queryParams).then(response => {
        // 查詢到的列表
        this.markList = response.rows

        // 查詢到的總數
        this.total = response.total

        this.loading = false

        // 處理接收到的資料
        this.markPoint(this.markList)
      })
    },
    // 疫木狀態字典翻譯
    treeStatusFormat(row, column) {
      return this.selectDictLabel(this.treeStatusOptions, row.treeStatus)
    },
    // 定標型別字典翻譯
    markTypeFormat(row, column) {
      return this.selectDictLabel(this.markTypeOptions, row.markSelf)
    },
    /** 查詢部門下拉樹結構 */
    getTreeselect() {
      treeselect().then(response => {
        this.deptOptions = response.data
      })
    },
    // 定標標誌字典翻譯
    markFlagFormat(row, column) {
      return this.selectDictLabel(this.markFlagOptions, row.markFlag)
    },
    // 除治標誌字典翻譯
    sealedFlagFormat(row, column) {
      return this.selectDictLabel(this.sealedFlagOptions, row.sealedFlag)
    },
    // 取消按鈕
    cancel() {
      this.open = false
      this.reset()
    },

    /** 搜尋按鈕操作 */
    handleQuery() {
      this.queryParams.pageNum = 1
      this.getList()
    },
    /** 重置按鈕操作 */
    resetQuery() {
      this.resetForm('queryForm')
      this.handleQuery()
    },

    // 初始化地圖
    initMap() {
      const map = new AMap.Map('mapDiv', {
        center: [120.56587, 36.20366],
        resizeEnable: true,
        zoom: 12
        // lang: 'en'
      })
      this.map = map

      // 地圖新增各種控制元件
      AMap.plugin(['AMap.ControlBar', 'AMap.Scale', 'AMap.MapType', 'AMap.Geolocation'], function() {
        // 在圖面新增工具條控制元件,工具條控制元件整合了縮放、平移、定位等功能按鈕在內的組合控制元件
        map.addControl(new AMap.ToolBar())
        // 在圖面新增類別切換控制元件,實現預設圖層與衛星圖、實施交通圖層之間切換的控制
        map.addControl(new AMap.MapType())

        // 在圖面新增定位控制元件,用來獲取和展示使用者主機所在的經緯度位置
        // map.addControl(new AMap.Geolocation())

        // 在圖面新增比例尺控制元件,展示地圖在當前層級和緯度下的比例尺
        map.addControl(new AMap.Scale())
      })

      // 海量點的樣式
      var style = [{
        // 必填引數,圖示的地址
        url: 'https://a.amap.com/jsapi_demos/static/images/mass0.png',
        // 必填引數,圖示顯示位置偏移量,以圖示的左上角為基準點(0,0)點,例如:anchor:new AMap.Pixel(5,5)
        anchor: new AMap.Pixel(6, 6),
        // 必填引數,圖示的尺寸;例如:size:new AMap.Size(11,11)
        size: new AMap.Size(11, 11)
      },
      // 紅色 未除治
      {
        url: this.baseURL + '/storage/dfs/display?path=group1/M00/00/0E/wKgABV-2IPiAEO2hAAAEJdf9ZKs794.png',
        anchor: new AMap.Pixel(6, 6),
        size: new AMap.Size(11, 11)
      },
      // 綠色  已經除治
      {
        url: this.baseURL + '/storage/dfs/display?path=group1/M00/00/0E/wKgABV-2IriAQ7-IAAAEJWeQRis039.png',
        anchor: new AMap.Pixel(6, 6),
        size: new AMap.Size(11, 11)
      },
      // 灰色以前的資料
      {
        url: this.baseURL + '/storage/dfs/display?path=group1/M00/00/0E/wKgABV-2IyGAS1xQAAAEJeELcZs238.png',
        anchor: new AMap.Pixel(6, 6),
        size: new AMap.Size(11, 11)
      }]

      this.mass = new AMap.MassMarks(null, {
        // 圖層的透明度,取值範圍[0,1],1代表完全不透明,0代表完全透明
        opacity: 0.6,
        // 圖層疊加的順序值,0表示最底層。預設zIndex:5
        zIndex: 111,
        // 指定滑鼠懸停時的滑鼠樣式,自定義cursor,IE僅支援cur/ani/ico格式,Opera不支援自定義cursor
        cursor: 'pointer',
        style: style,
        // 表示是否在拖拽縮放過程中實時重繪,預設true,建議超過10000的時候設定false
        alwaysRender: false
      })

      // 滑鼠懸浮 彈出視窗
      var marker = new AMap.Marker({ content: ' ', map: map })

      this.mass.on('mouseover', function(e) {
        marker.setPosition(e.data.lnglat)
        marker.setLabel({ content: e.data.name })
      })

      // 海量點繫結到地圖上
      this.mass.setMap(map)
    },

    markPoint(pointData) {
      // this.initMap()
      var len = pointData.length
      console.log('收到資料,開始處理資料,樹木資訊數量 :' + len)
      var lnglat1 = []

      // {"lnglat":[116.258446,37.686622],"name":"景縣","style":2}
      for (var i = 0; i < len; i++) {
        var tree1 = { 'lnglat': [pointData[i].lng, pointData[i].lat], 'name': pointData[i].markSn, 'style': pointData[i].treeStatus }
        // 座標轉換
        // AMap.convertFrom(tree1.lnglat, 'gps', function(status, result) {
        //   if (result.info === 'ok') {
        //     var resLnglat = result.locations[0]
        //     tree1.lnglat = resLnglat
        //   }
        // })

        lnglat1.push(tree1)
      }

      if (document.createElement('canvas').getContext) { // 判斷當前瀏覽器是否支援繪製海量點
        console.log('資料處理完畢,進入繪製')

        // 清理位置資訊
        this.mass.clear()
        // 繫結新的位置資訊
        this.mass.setData(lnglat1)
        console.log('資料繪製完畢')
      } else {
        alert('此示例目前只有在IE9及以上瀏覽器開啟')
      }
    }

  }
}
</script>

<style scoped>
.mapDiv{
  width: 100%;
  height: 80vh;
}
</style>

最終顯示效果

 

 

相關文章