项目内网PGIS地图的使用:以天地图做打底,使用leaflet.js交互式地图 JavaScript 库做开发。

相关参考网址:https://leafletjs.cn/reference.html#map-example

区域回显:https://kklimczak.github.io/Leaflet.Pin/;

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/124026478

热力图:https://www.jb51.net/javascript/290354ppf.htm

轨迹:https://blog.51cto.com/BADAOLIUMANGQZ/6843897
PS:相关搜索可搜Leaflet.MovingMarker-master
一、点的标记,区域的展示,以及点的点击事件

相关代码组件如下,此组件整合了热力图的展示,具体根据实际业务需要选择性展示。

<template>
    <!-- 该组件是展示点的添加,区域的添加以及点击事件 和热力图的展示的整合组件 -->
  <div class="data_map" style="height: 100%; position: relative">
    <div
      class="bg_heights"
      style="position: relative; width: 100%"
      :style="{ height: height }"
    >
      <div :id="mapId" style="width: 100%" :style="{ height: height }"></div>
    </div>
    <div class="tabClickA" v-if="$route.path != '/index'">
      <div class="tabList" @click="clickGrid('1')">警务区</div>
      <div class="tabList" @click="clickGrid('2')">网格</div>
    </div>
  </div>
</template>
<style scoped lang="scss"></style>
<style>
.anchorBL {
  display: none;
}
body,
html,
#map {
  height: 100%;
  margin: auto;
  font-family: "微软雅黑";
}
.my-label-a {
  width: 100%;
  height: 20px;
}
</style>
<script type="text/ecmascript-6">
// require('echarts/extension/bmap/bmap.min');
// import * as zrender from 'zrender'  //引入zrender库

import 'leaflet.heat'
import { loadBMap } from './map'
var map;
var T = window.T;
export default {
    props:{
        height:{
            type:String,
            default:'100%'
        },
        mapId:{
            type:String,
            default:'mapId'
        },
        //商圈区域
        businessList:{
            type:Array,
            default:()=>[]
        },
        //绘制商铺点
        shopList:{
            type:Array,
            default:()=>[]
        },
        //绘制设备点
        equList:{
            type:Array,
            default:()=>[]
        },
        //警务区网格
        policeArea:{
            type:Array,
            default:()=>[]
        },
        //综治网格
        gridArea:{
            type:Array,
            default:()=>[]
        },
        //警务区展示与否
        isShowPolice:{
            type:Boolean,
            default:false
        },
        //网格展示与否
        isShowGrid:{
            type:Boolean,
            default:false
        },
        //热力地图数据
        houtData:{
            type:Array,
            default:()=>[
            //     {coor:[118.711996,37.440117], count: 45},
            // {coor:[118.714751,37.439935], count: 56},
            // {coor:[118.709006,37.442001], count: 127},
            // {coor:[118.707861,37.438914],  count: 89},
            // {coor:[118.712757,37.434551],  count: 13},
            // {coor:[118.649018, 37.453269], count: 234},
            // {coor:[118.718937,37.434179],  count: 46},
            // {coor:[118.718398,37.443677],  count: 339},
            // {coor:[118.713907,37.448061],  count: 95},
            // {coor:[118.713907,37.448061],  count: 354},
            ]
        },
        //点击设备展示设备信息还是video
        isShowVideo:{
            type:Boolean,
            default:false
        },
        //是否展示商圈边界
        isBusiness:{
            type:Boolean,
            default:false
        },
        //这是商圈地图的点击商圈的展示与否的
    isMapEvery: {
      type: Boolean,
      default:false
    }

    },
    data(){
        return {
            mapLoading:false,
            bgHeight:'668px',
            map:'',
            currentLat:118.70034983319356,
            currentLon : 37.45030118084613,
            getZoom:16,   //地图当前的等级
            previousBusinessPolygons: [], // 存储之前绘制的业务描边图形
            previousPolicePolygons: [],   // 存储之前绘制的警察描边图形
            previousGridPolygons: []     // 存储之前绘制的网格描边图形
        }
    },
    watch: {
        businessList: {
        handler: function (newObj, oldObj) {
            let that = this;
                that.addMarker(this.businessList,'business')
            },
            deep: true, // 深度监听
            immediate: true // 会在监测开始时调用一次该处理函数
        },
        shopList: {
            handler: function(newObj, oldObj) {
                let that=this;
                that.drawPoint(that.shopList,'shop')
            },
            deep: true, // 深度监听
            // immediate: true // 会在监测开始时调用一次该处理函数
        },
        equList: {
            handler: function(newObj, oldObj) {
                let that=this;
                that.drawPoint(that.equList,'camera')
            },
            deep: true, // 深度监听
            immediate: true // 会在监测开始时调用一次该处理函数
        },
        policeArea: {
            handler: function(newObj, oldObj) {
                let that=this;
                that.addMarker(that.policeArea,'police')
            },
            deep: true, // 深度监听
            immediate: true // 会在监测开始时调用一次该处理函数
        },
        gridArea: {
            handler: function(newObj, oldObj) {
                let that=this;
                that.addMarker(that.gridArea,'grid')
            },
            deep: true, // 深度监听
            immediate: true // 会在监测开始时调用一次该处理函数
        },
        houtData: {
            handler: function(newObj, oldObj) {
                let that=this;
                setTimeout(function(){
                    that.initHotMap()
                },100)
            },
            deep: true, // 深度监听
            immediate: true // 会在监测开始时调用一次该处理函数
        },

    },
    methods:{
         //初始化百度地图
        initBdMap() {
            var that = this
            var cenPoint = [118.688,37.443]
            var map = L.map(this.mapId, {
                attributionControl:false,
                crs:L.CRS.EPSG4326,  //要使用的坐标系  WGS84 是目前最流行的地理坐标系统
                center:[cenPoint[1],cenPoint[0]],
                zoom: 16
            });
            //这里是加载的内网的瓦片地址
            L.tileLayer('http://10.52.86.242:8686/mapdb/tilesets/dy-vector-2019/{z}/{x}/{y}.png', {
            // L.tileLayer(imageURL, {
                minZoom:0,
                maxZoom:19,
                zoomOffset:0,
                tms:false
            }).addTo(map);
            this.map = map
        },

        //绘制点
      drawPoint(data, type) {
            var that = this
            //获取所有的图层
            let all = this.map._layers
            let arr = Object.values(all)
            arr.map(item=>{
                if (item.class === "shopPointA") {
                    //如果是点图层就删除相关的点图层
                    that.map.removeLayer(item);
                }
            })
            //图标大小
            var LeafIcon = L.Icon.extend({
                options: {
                    iconSize: [36, 47],
                }
            });
            document.body.addEventListener('click', function(event) {
                //查看更多的跳转
                if (event.target.innerText == '查看更多>>') {
                    that.$router.push("/business/shopDetail?id="+event.target.id );
                }
            });
            var data_info = data,content,newPoint,mapUrl,shopName;
            for(var i = 0;i<data_info.length;i++){
                //根据不同的类型展示不同的点的图片以及点击点的弹框的内容
                if(type=='shop'){
                    mapUrl = require("../../assets/base/shop.png")
                    shopName = data_info[i].shopName
                    content = "<div class='skyDiv'>"+
                            "<div class='skyTitle'>"+shopName+"</div>"+
                            "<p class='skyP'>联系人:"+data_info[i].userName +'  ('+data_info[i].phone+')'+"</p>"+
                            "<p class='skyP'>地址:"+data_info[i].addressName+"</p>"+
                            "<p class='skyP' style='color:#50b3ff;cursor: pointer' id='"+data_info[i].id+"'>查看更多>></p>"+
                            "</div>"
                }else{
                    mapUrl = require("../../assets/base/equ.png")
                    shopName = data_info[i].name
                    content = "<div class='skyDiv'>"+
                            "<div class='skyTitle'>"+shopName+"</div>"+
                            "</div>"
                }
                //申明点
                var icon = new LeafIcon({iconUrl: mapUrl});
                L.icon = function (options) {
                    return new L.Icon(options);
                };
                newPoint = [data_info[i].longitude, data_info[i].latitude]
                var shopPoint = L.marker([Number(newPoint[1]), Number(newPoint[0])], { icon: icon })
                shopPoint.class='shopPointA'   //确立点的标识,方便后期做相关的操作应用,具体看实际的业务逻辑
                shopPoint.addTo(that.map).bindPopup(content);   //bindPopup  在点上添加点击事件
            }
        },
        //绘制区域描边
        addMarker(data, type) {
            let that = this
                //添加警务网格
                var business = data;
                for(var i = 0;i<business.length;i++){
                    if(business[i].border!=''&&business[i].border!=null){
                        //整理绘制区域需要的数据格式
                        var policeGrid = business[i].border.split(';'),newArr = [],newArrNow = [],oneArr = []
                        if(policeGrid.length>0){
                            policeGrid.forEach(item=>{
                                var aa = [Number(item.split(',')[1]), Number(item.split(',')[0])]
                            newArr.push(aa)
                            })
                            //获取相关图层
                            let all = this.map._layers
                            let arr = Object.values(all)
                            var bus
                            //此处是商圈的区域添加  --》》mxj 20231214
                            if (type == 'business') {
                                bus = L.polygon(newArr, {
                                    color: "#FF5663", weight: 2, opacity: 1, fillColor: "#FF5663", fillOpacity: 0.5,lineStyle:'dashed',
                                })
                                bus.class = 'businessA'   //添加唯一标识
                                //isBusiness是在搜索的时候判断是否在次添加  --》》mxj 20231214
                                if (this.isBusiness == true) {
                                    bus.bindTooltip(business[i].name, {
                                        permanent: true,
                                        direction: 'top'
                                    }).openTooltip()
                                    bus.addTo(that.map)   //添加区域展示
                                } else {
                                    if (that.isMapEvery == true) {
                                        //此处的业务逻辑是先删除,在添加区域展示,具体的根据实际业务逻辑来
                                        arr.map(item=>{
                                            if (item.class === "businessA") {
                                                //删除相关图层
                                                that.map.removeLayer(item);
                                            }
                                        })
                                        bus.bindTooltip(business[i].name, {
                                            permanent: true,
                                            direction: 'top'
                                        }).openTooltip()
                                        bus.addTo(that.map)
                                    }
                                }
                            } else if (type == 'police') {
                                //此处是警务区的区域添加  --》》mxj 20231214
                                var police = L.polygon(newArr, {
                                    color: "#FF5663", weight: 2, opacity: 1, fillColor: "#FF5663", fillOpacity: 0.5,lineStyle:'dashed',
                                })
                                police.class='policeA'
                                //isShowPolice判断是添加还是隐藏  --》》mxj 20231214
                                if(this.isShowPolice){
                                    police.bindTooltip(business[i].policeDistrictName,{
                                        permanent:true,
                                        direction:'top'
                                    }).openTooltip()
                                    police.addTo(this.map)   //添加
                                }else{
                                    arr.map(item=>{
                                        if (item.class === "policeA") {   //删除
                                            that.map.removeLayer(item);
                                        }
                                    })
                                }
                            }else if(type=='grid'){
                                //此处是网格的区域添加  --》》mxj 20231214
                                var grid = L.polygon(newArr, {
                                    // color: "#FF642E", weight: 2, opacity: 1, fillColor: "#FF642E", fillOpacity: 0.5,lineStyle:'dashed',
                                    color: "#FF5663", weight: 2, opacity: 1, fillColor: "#FF5663", fillOpacity: 0.5,lineStyle:'dashed',
                                })
                                grid.class='gridA'
                                //isShowGrid判断是添加还是隐藏  --》》mxj 20231214
                                if(this.isShowGrid){
                                    grid.bindTooltip(business[i].gridName,{
                                        permanent:true,
                                        direction:'top'
                                    }).openTooltip()
                                    grid.addTo(this.map)   //添加
                                }else{
                                    arr.map(item=>{
                                        if (item.class === "gridA") {
                                            //删除
                                            that.map.removeLayer(item);
                                        }
                                    })
                                }
                            }
                        }
                    }
                }
        },
        clickGrid(data){
            this.$emit('clickGrid',data)
        },
        //热力图
        initHotMap(){
            var that = this
            //热力图添加之前先把之前的热力图层去掉,以防止多次重复添加
            let all = this.map._layers
            let arr = Object.values(all)
            arr.map(item=>{
                if (item.class === "heatA") {
                    that.map.removeLayer(item);
                }
            })
            let heatDataList = [
                // { lat: 39.6408, lng: 116.7728, count: 1 },
                // { lat: 39.75, lng: 116.55, count: 1 },
                // { lat: 39.55, lng: 116.55, count: 100 },
                // { lat: 39.65, lng: 116.45, count: 1 },
                // { lat: 39.45, lng: 116.35, count: 1 },
                // { lat: 39.35, lng: 116.25, count: 1 },
                // { lat: 39.25, lng: 116.15, count: 1 }
            ]
            // 构造热力图数据
            this.houtData.forEach((v) => {
                // 纬度、经度、阈值
                var aa = v.coor
                let group = [aa[0], aa[1], v.count]
                heatDataList.push(group)
            })

            // 生成热力图图层,并添加到地图中
            let heat = L.heatLayer(heatDataList, {
                radius: 12,
                minOpacity: 0.2,
                gradient: { // 自定义渐变颜色,区间为 0~1 之间(也可以不指定颜色,使用默认颜色)
                    '0.25': 'rgba(0, 0, 255, 1)',
                    '0.55': 'rgba(0, 255, 0, 1)',
                    '0.85': 'rgba(255, 255, 0, 1)',
                    '1': 'rgba(255, 0, 0, 1)'
                }
            });
            heat.class='heatA'
            heat.addTo(this.map)
        },
    },
    //调用方法
    mounted() {
        var that = this
        that.$nextTick(() => {
            that.initBdMap();
        })
    }
}
</script>
<style lang="scss">
.tabClickA {
  position: absolute;
  top: 20px;
  right: 20px;
  display: flex;
  z-index: 1000;
  cursor: pointer;
  .tabList {
    width: 93px;
    height: 38px;
    background: #53c9fc;
    color: #ffffff;
    font-size: 14px;
    text-align: center;
    line-height: 38px;
    margin-left: 10px;
  }
}
.divOutMap {
  width: 290px;
  height: 185px;
  background: url("http://218.56.180.213:8035/shopping/static/file/pic/202307/picrXBtW1uh1689581712300.png");
  margin-top: -50px;
  margin-left: -145px;
  .topDiv {
    display: flex;
    padding: 25px 10px 0px 20px;
    justify-content: space-between;
    .closeDiv {
      margin-left: 10px;
      font-size: 14px;
      color: #53c9fc;
      text-decoration: underline;
    }
    opLeft {
      font-size: 16px;
      color: rgba(235, 251, 255, 0.8);
      flex: 1;
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }
    .topRight {
      font-size: 14px;
      color: #53c9fc;
      text-decoration: underline;
      width: 56px;
    }
  }
  .shopBoxMap {
    padding: 0px 10px 0px 20px;
    .shopOne {
      background: rgba(58, 129, 200, 0.26);
      border-radius: 5px;
      height: 40px;
      margin-top: 15px;
      box-shadow: 0px 0px 15px rgba(50, 121, 198, 1) inset;
      line-height: 40px;
      color: #ffffff;
      font-size: 14px;
      padding: 0px 10px;
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }
  }
  .mapShowImgA {
    width: 250px;
    height: 106px;
    margin-top: 10px;
    margin-left: 25px;
  }
}
</style>

二、功能包括点的添加展示,区域的绘制,回显,编辑,删除的功能。

引用步骤如下:

1.在public页面引入如下代码:


<!-- 内网 -->
<link rel="stylesheet" href="leaflet.css"/>
<script type="text/javascript" src="leaflet.js"></script>
<script type="text/javascript" src="leaflet-hash.js"></script>
<script type="text/javascript" src="MovingMarker.js"></script>
<!-- <script type="text/javascript" src="leaflet-search.js"></script> -->
<!-- <script type="text/javascript" src="leaflet-search-geocoder.js"></script> -->
<!-- 这是绘制区域 -->
<script type="text/javascript" src="Leaflet.draw.js"></script>
<link rel="stylesheet" href="leaflet.draw.css"/>
<script src="leaflet.pin.js"></script>
<!-- <script type="text/javascript" src="http://56.74.188.188:9009/map3.0_init.js"></script>
<script type="text/javascript" src="http://56.74.188.188:9009/map3.0.js"></script> -->
<!-- 天地图 -->
<script type="text/javascript" src="https://api.tianditu.gov.cn/api?v=4.0&tk=d98028206b9637c8e3e21a7041c01b7a"></script>

页面的相关代码,具体根据实际情况来:

<!--
 * @Author: wxl
 * @Date: 2023-07-14 10:24:08
 * @LastEditors: wxl
 * @LastEditTime: 2023-08-24 13:36:24
-->
<template>
  <div class="appInner">
      <form-back></form-back>
      <base-cont height="100%" :isScrollbar="false">
          <template #head>
              <hy-header :importe="false" :exporte="false" :add="false" :deleted="false">绘制地图</hy-header>
          </template>
          <template #cont>
              <div >
                  <titleTwo title="基础信息"></titleTwo>
                  <disPlay>
                      <listOne paddingLeft="0px" name="商铺名称" :content="detailObj.name"></listOne>
                      <listOne name="是否绘制" :content="detailObj.border==''?'无':'是'"></listOne>
                      <listOne  paddingRight="0px" name="中心点坐标" :content="centerPoint.toString()"></listOne>
                      <div class="newDrawEwar">
                        <el-form >
                          <el-form-item label="拾取中心点坐标" class="labelItem" style="z-index: 30 !important;margin-bottom: 0 !important;padding-top:10px;padding-left:10px">
                            <el-switch v-model="getCenPoint" active-text="开始" inactive-text="关闭"></el-switch>
                          </el-form-item>
                        </el-form>
                      </div>
                  </disPlay>
              </div>
              <div id="adjustMap" class="adjustStyle" ></div>
          </template>
      </base-cont>
      <increasePop
        :centerDialogVisible.sync="tipsAlert"
        title="绘制数据"
        :ruleForm="ruleFormH"
        @resertClick="resertDetailH"
        @sureClick="sureClickH"
      >
        <form-textarea :value.sync="ruleFormH.areaStr" label="边界数据" preFixIcon="" placeholder="请输入边界数据"></form-textarea>
      </increasePop>
  </div>
</template>

<script>
import { businessEdit,businessDetail } from "@/api/shop/business";
import titleTwo from '@/components/shopNew/title.vue';
import listOne from '@/components/shopNew/list.vue';
import disPlay from '@/components/shopNew/disPlay.vue';
// import twoMap from "@/components/map/twoMap.vue";  //百度地图绘制
import twoMap from "@/components/map/twoMapNei.vue";  //天地图
import increasePop from '@/components/form/increasePop.vue';
export default {
  components: {titleTwo,listOne,disPlay,twoMap,increasePop},
  name: "Drawarea",
  data() {
      return {
        detailId:'',
        detailObj:{},
        map:null,
        centerPoint:[],
        getCenPoint:false,  //是否拾取中心点坐标
        //绘制完成的弹框
        tipsAlert:false,
        ruleFormH:{
          areaStr:'',
        },
        //地图
        nowArrBorder:[],
        newBorder:'',  //新绘制的边界数据
      }
  },
  mounted() {
      this.initDetail()
  },
  created(){
      this.detailId = this.$route.query.id;
  },
  methods: {
      resertDetailH(){
        this.tipsAlert = false
        this.ruleFormH.areaStr = ''
      },
      //获取详情
      initDetail(){
          let that=this;
          businessDetail({id:this.detailId}).then((res) => {
              if (res.code == 0) {
                  this.detailObj = res.data
                  if(res.data.border!=''&&res.data.border!=null){
                    var aa = res.data.border.split(';'),newArrBOrder = []
                    aa.forEach(item=>{
                      var singArr = [Number(item.split(',')[0]),Number(item.split(',')[1])]

                      newArrBOrder.push(singArr)
                    })
                    that.nowArrBorder = newArrBOrder
                    var bb = res.data.border.split(';')[0].split(',')
                    that.centerPoint = res.data.centerPoint.split(',');
                  }else{
                    that.centerPoint = [118.7241,37.45292]
                  }

                  that.$nextTick(() => {
                    that.initBdMap();
                  })
                  } else {
                  that.$global.tipMsg("error", res.msg);
              }
          });
      },
      cenPoint(data){
          this.centerPoint = data
          var that = this
          businessEdit({id:this.detailId,centerPoint:data.toString()}).then(res=>{
              if(res.code==0){
                  // this.$router.go(-1)
                  this.$global.tipMsg("success", '中心点设置成功');
              }else{
                  this.$global.tipMsg("error", res.msg);
              }
          }).catch()
      },
      //展示地图
      loadJson () {
        var data = this.nowArrBorder,newData = []
        data.forEach(item=>{
          var aa = JSON.stringify(item)
          newData.push(JSON.parse(aa))
        })
          return {
              "type": "FeatureCollection",
              "features": [{
                  "type": "Feature",
                  "properties": {},
                  "geometry": {
                      "type": "Polygon",
                      "coordinates": [
                        // [
                          // [118.69159877773762,37.481140660363366],
                          // [118.69102386221124,37.47756100936721],
                          // [118.70011471397221,37.47747509561818],
                          // [118.7004021717354,37.48016701241549],
                          // [118.69838996739306,37.48185656980892],
                          // [118.69159877773762,37.481140660363366]
                          // this.nowArrBorder
                          // [118.69159877773762, 37.481140660363366],
                          // [118.69102386221124, 37.47756100936721],
                          // [118.70011471397221, 37.47747509561818],
                          // [118.7004021717354, 37.48016701241549],
                          // [118.69838996739306, 37.48185656980892],
                          // [118.69159877773762, 37.481140660363366],
                          newData
                        // ]
                      ]
                  }
              },
            ]
          }
      },
      //添加点
      addPoint(data){
        var that = this
        var center = JSON.parse(data)   // 经度,维度的排序
        var LeafIcon = L.Icon.extend({
          options: {
              iconSize: [29, 25],
          }
        });
        let mapUrl = 'http://218.56.180.213:8035/shopping/static/file/pic/202307/piclCI6umdv1689299533795.png'
        var icon = new LeafIcon({iconUrl: mapUrl});
        L.icon = function (options) {
          return new L.Icon(options);
        };
        L.marker([center[1],center[0]],{icon: icon}).addTo(that.map);
      },
      //初始化百度地图
      initBdMap() {
           //声明地图
           var that = this
          var cenPoint = [Number(this.centerPoint[0]),Number(this.centerPoint[1])]
          var map = L.map('adjustMap', {
              attributionControl:false,
              crs:L.CRS.EPSG4326,  //要使用的坐标系  WGS84 是目前最流行的地理坐标系统
              center:[cenPoint[1],cenPoint[0]],
              zoom: 15,
          });
          // L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
          // L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
          L.tileLayer('http://10.52.86.242:8686/mapdb/tilesets/dy-vector-2019/{z}/{x}/{y}.png', {
          // L.tileLayer(imageURL, {
              minZoom:0,
              maxZoom:19,
              zoomOffset:0,
              tms:false
          }).addTo(map);
          this.map = map

          //添加绘制图层
          var drawnItems = new L.FeatureGroup();
          map.addLayer(drawnItems);
          //添加绘制控件
          var drawControl = new L.Control.Draw({
              draw:{
                  // //绘制线
                  polyline:false,
                  //绘制多边形
                  polygon:true,
                  //绘制矩形
                  rectangle:false,
                  //绘制圆
                  circle:false,
                  //绘制标注
                  marker:false,
                  //绘制圆形标注
                  circlemarker:false
              },
              edit:{
                  //绘制图层
                  featureGroup:drawnItems,
                  //图形编辑控件
                  edit:true,
                  //图形删除控件
                  remove:true,
              }
          });

      //添加绘制控件
      map.addControl(drawControl);
      //这里时将已绘制的区域进行回显展示
      if(this.nowArrBorder.length!=0){
        L.geoJson(this.loadJson(), {
          onEachFeature: function (feature, layer) {
            //设置颜色,目前没有到,暂时留存,不影响功能
            if(feature.geometry.type == "LineString") {
              layer.setStyle({
                color: 'purple',
                weight: 5
              });
            }
            drawnItems.addLayer(layer);
          }
        });

        map.addGuideLayer(drawnItems);
        map.removeGuideLayer(drawnItems);
      }
      //对中心点进行回显
      this.addPoint(JSON.stringify(this.centerPoint))

      // //绘制事件
      map.on(L.Draw.Event.CREATED, function(e){
         //获取绘制图形类型
         var type = e.layerType,
         //获取绘制图层
         drawlayer = e.layer;
         if (type === 'marker') {
             //显示Popup
             drawlayer.bindPopup('A popup!');
         }
         //显示图层
         drawnItems.addLayer(drawlayer);
         //几何信息字符串
         var latlngsStr = "";
          //获取多边形几何信息
         if (type == 'polygon') {
             if (drawlayer._latlngs[0].length > 0) {
                 for (var latlngslength = 0; latlngslength < drawlayer._latlngs[0].length; latlngslength++) {
                     //获取几何信息
                     latlngsStr +=  drawlayer._latlngs[0][latlngslength].lng + "," + drawlayer._latlngs[0][latlngslength].lat + ";"
                 }
                 var bb = [latlngsStr.slice(0,latlngsStr.length-1)];
                 that.newBorder = bb.toString();
                 that.ruleFormH.areaStr = bb.toString();
                 that.tipsAlert = true
             }
         }
         //显示信息
        });
        this.map.addLayer(drawnItems);
        // 删除事件
        this.map.on(L.Draw.Event.DELETED, this.handleDelete)
        // 编辑事件
        this.map.on(L.Draw.Event.EDITED, this.handleEdited)

        //监听鼠标点击事件,点击拾取坐标,设置中心店
        function onMapClick(e) {
          // console.log(e)
          if(that.getCenPoint == true){
            that.centerPoint = [e.latlng.lng,e.latlng.lat]
            //清空之前全部的标记点,然后重新添加
            $(".leaflet-marker-pane").empty()
            //点击的时候顺便加点
            that.addPoint(JSON.stringify(that.centerPoint))
            //设置中心点接口
            that.cenPoint(that.centerPoint)
          }
        };
        map.on('click',onMapClick);
      },
      //删除
      handleDelete(e){
        this.nowArrBorder = []
      },
      //编辑
      handleEdited(e){
        var that = this
        if(e.layers._layer!=undefined){
          var obj = e.layers._layers,newArr = [],arrSub=[],strSub = ''
          for(var i in obj) {
            newArr = obj[i]._latlngs[0]
          }
          for(var i = 0;i<newArr.length;i++){
            strSub+=newArr[i].lng+','+newArr[i].lat+';'   //strSu是上传所需要的数据
          }
          var bb = [strSub.slice(0,strSub.length-1)];
          businessEdit({id:this.detailId,border:bb.toString()}).then(res=>{
            if(res.code==0){
                this.$global.tipMsg("success", '保存成功');
            }else{
                this.$global.tipMsg("error", res.msg);
            }
          }).catch()
        }

      },
      //提交绘制
      sureClickH(){
        var that = this
        businessEdit({id:this.detailId,border:this.ruleFormH.areaStr}).then(res=>{
            if(res.code==0){
                this.tipsAlert = false
            }else{
                this.$global.tipMsg("error", res.msg);
            }
        }).catch()
      },
  },
};
</script>

<style  lang="scss">
.appInner {
  min-width: 1055px;
  height: 100%;
  position: relative;
}
.adjustStyle{
  width: 100%;
  height: calc(100% - 125px);
  margin-top: 20px;
}
.backBtnDraw{
  position: absolute;
  top:200px;
  right: 40px;
}
.showSearch{
  background: rgba(23, 114, 153, 1);
  padding: 10px;
  display: flex;
  border-radius: 5px;
}
.newDrawEwar{
  .el-form-item__label{
    width:100%;
    text-align: left;
    color: rgba(225, 225, 225, 0.5);
  }
  .el-form-item__content{
    // widows: 100%;
    background:rgba(75, 173, 248, 0.33);
    height: 32px;
    margin-top:35px;
    .el-radio{
      margin-left: 10px;
    }
    .el-switch{
      margin-left: 10px;
      margin-top: -10px;
      .el-switch__label{
        color: rgba(255,255,255,0.5);
      }
      .is-active{
        color: #47d0f1;
      }
    }
  }
}
</style>

三、内网热力图的关键代码如下

在index.html页面引入js

<script type="text/javascript" src="HeatmapOverlay.js"></script>
//热力图
initHotMap(){
    var that = this
    //热力图添加之前先把之前的热力图层去掉,以防止多次重复添加
    let all = this.map._layers
    let arr = Object.values(all)
    arr.map(item=>{
        if (item.class === "heatA") {
            that.map.removeLayer(item);
        }
    })
    let heatDataList = [
        // { lat: 39.6408, lng: 116.7728, count: 1 },
        // { lat: 39.75, lng: 116.55, count: 1 },
        // { lat: 39.55, lng: 116.55, count: 100 },
        // { lat: 39.65, lng: 116.45, count: 1 },
        // { lat: 39.45, lng: 116.35, count: 1 },
        // { lat: 39.35, lng: 116.25, count: 1 },
        // { lat: 39.25, lng: 116.15, count: 1 }
    ]
    // 构造热力图数据
    this.houtData.forEach((v) => {
        // 纬度、经度、阈值
        var aa = v.coor
        let group = [aa[0], aa[1], v.count]
        heatDataList.push(group)
    })

    // 生成热力图图层,并添加到地图中
    let heat = L.heatLayer(heatDataList, {
        radius: 12,
        minOpacity: 0.2,
        gradient: { // 自定义渐变颜色,区间为 0~1 之间(也可以不指定颜色,使用默认颜色)
            '0.25': 'rgba(0, 0, 255, 1)',
            '0.55': 'rgba(0, 255, 0, 1)',
            '0.85': 'rgba(255, 255, 0, 1)',
            '1': 'rgba(255, 0, 0, 1)'
        }
    });
    heat.class='heatA'
    heat.addTo(this.map)
},
posted @ 2024-01-29 11:06  xuelin  阅读(352)  评论(0编辑  收藏  举报