天地图功能实现合集,使用天地图js4.0实现箭头绘制显示,图标绘制显示,区域绘制显示、轨迹绘制等

发布于:2025-06-13 ⋅ 阅读:(22) ⋅ 点赞:(0)

天地图API

1.需要引入的文件,密钥需要自己在官网申请

<link rel="stylesheet" href="https://api.tianditu.gov.cn/api/css?v=4.0">
<script src="http://api.tianditu.gov.cn/api?v=4.0&tk=你的密钥" type="text/javascript"></script>
<script src="http://lbs.tianditu.gov.cn/js/lib/d3/d3.min.js" charset="utf-8"></script>
<script src="http://lbs.tianditu.gov.cn/api/js4.0/opensource/openlibrary/D3SvgOverlay.js"></script>
<script src="http://lbs.tianditu.gov.cn/api/js4.0/opensource/openlibrary/CarTrack.js">

2.合集代码

/**
 * 天地-地图方法合集
 */
import Vue from 'vue'
import { httpAction, getAction,deleteAction } from '@/api/manage'
import defaultMark from "@/assets/commant/not_running.png"
import xbUrl from "@/assets/xb.png"
import imgUrl1 from "@assets/yj1.png";
import imgUrl2 from "@assets/yj2.png";
import imgUrl3 from "@assets/yj3.png";
import imgUrl4 from "@assets/yj4.png";
import imgUrl5 from "@assets/yj5.png";
import imgUrl6 from "@assets/yj6.png";
import imgUrl7 from "@assets/yj7.png";
import imgUrl8 from "@assets/yj8.png";
import imgUrl9 from "@assets/yj9.png";
import imgUrl10 from "@assets/yj10.png";
import imgUrl11 from "@assets/yj11.png";
import imgUrl12 from "@assets/yj12.png";
import imgUrl13 from "@assets/yj13.png";
import imgUrl14 from "@assets/yj14.png";
import imgUrl15 from "@assets/yj15.png";
import imgUrl16 from "@assets/yj16.png";
import imgUrl17 from "@assets/yj17.png";
import imgUrlyp1 from "@assets/jcjing.png";
export const TMapMixin = {
  data(){
    return{
      TMap:null, //地图创建名称
      minZoom:11, //地图最小缩放 11
      zoom:17, //地图缩放级别
      center:[118.581853,38.024604], //中心经纬度
      mapStyle: {},//地图显示样式
      btnStyle: {},//地图按钮显示隐藏
      markIdsArray:[],//区域绘制标点数组,
      defaultMark:defaultMark, //默认点击时的图标
      xbUrl:xbUrl, //信标图标
      imgUrl1:imgUrl1, //设备管理图标 1-17
      imgUrl2:imgUrl2,
      imgUrl3:imgUrl3,
      imgUrl4:imgUrl4,
      imgUrl5:imgUrl5,
      imgUrl6:imgUrl6,
      imgUrl7:imgUrl7,
      imgUrl8:imgUrl8,
      imgUrl9:imgUrl9,
      imgUrl10:imgUrl10,
      imgUrl11:imgUrl11,
      imgUrl12:imgUrl12,
      imgUrl13:imgUrl13,
      imgUrl14:imgUrl14,
      imgUrl15:imgUrl15,
      imgUrl16:imgUrl16,
      imgUrl17:imgUrl17,
      imgUrlyp1, //罐区
      isAdd:false, //是否新增
      disabled:false,
      model:{},
      labelCol: {
        xs: { span: 24 },
        sm: { span: 6 },
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 16 },
      },
      arrowArray:[],//箭头实例数组,
      isDeleteArrow:false,//是否删除箭头
      drawEntity:null,//多边形
      myData: [], //绘制多边形的经纬度

    }
  },


  methods:{
    //初始化地图,参数为绘制地图所在div的id
    initMap(type,div){
      var that = this;
      var dom = div 
      console.log(dom)
      that.deleteAll()
      that.TMap = new T.Map(dom,{
        minZoom:that.minZoom,
      });

      var lnglat = new T.LngLat(that.center[0],that.center[1]); //中心经纬度
      that.TMap.centerAndZoom(lnglat,that.zoom);
      that.TMap.enableScrollWheelZoom(); // 启用滚轮缩放


      if(type == "leftClick"){
        //需要创建标点的地图
        that.removeMapClick();
        that.TMap.addEventListener("click",that.MapClick);
      };// 2、初始化区点击标注
    },
    // 功能一、 添加标注
    // (一) 添加单个标注
    //参数 mark-数组 [108.617, 21.729]
    addMark(mark,id,imgType){
      var imgUrl = ""
      if(imgType){
        imgUrl = imgType
      }else{
        imgUrl = 'defaultMark'
      }
      let that = this
      var markId = 'mark'+id;
      //创建图片对象
      var icon = new T.Icon({
        iconUrl: that[imgUrl],
        iconSize: new T.Point(20, 20),
        iconAnchor: new T.Point(10, 25)
      });
      //向地图上添加自定义标注
      var marker = new T.Marker(new T.LngLat(mark[0], mark[1]), {icon: icon});
      that.TMap.addOverLay(marker);
      //保存id用于删除
      this.markIdsArray.push(marker);
    },
    // ( 三 )  根据数据自动绘制区域-面
    addArea(areaArr,id,colorType){
      let that = this
      var points = [];
      for(var i in areaArr){
        var item = areaArr[i];
        console.log(item,"线段数据")
        points.push(new T.LngLat(item.lon, item.lat));
      }

      var color = 'blue';


      //创建面对象
      var polygon = new T.Polygon(points,{
        color: color, weight: 3, opacity: 0.5, fillColor: "#FFFFFF", fillOpacity: 0.5
      });
      //向地图上添加面
      that.TMap.addOverLay(polygon);




    },
    //  功能六、鼠标左键 - 获取鼠标下的经纬度
    MapClick(e) {
      if(!e){
        return
      }
      var that = this;
      var i = 0;
      i++;
      var id = 'draw'+i;
      that.deleteAll()
      var longitudeString = e.lnglat.getLng()
      var latitudeString = e.lnglat.getLat()
      that.addMark([longitudeString,latitudeString],id);
      if(that.isAdd == true){
        that.$set(that.model,"lon", longitudeString);
        that.$set(that.model,"lng", longitudeString);
        that.$set(that.model,"lat", latitudeString);
      
      }


    },
    removeMapClick(){
      let that = this
      that.TMap.removeEventListener("click",that.MapClick);
    },
    // 功能十、 删除
    // 删除全部地图实例
    deleteAll(){
      if(this.TMap){
        this.TMap.clearOverLays(); //清除覆盖物
      }

    },
    //显示箭头,创建箭头
    showArrow(areaArr,id,colorType){

      let that = this
      var points = [];
      for(var i in areaArr){
        var item = areaArr[i];
        console.log(item,"线段数据")
        points.push(new T.LngLat(item.lon, item.lat));
      }
      let name = "arrow" + id
       name = new T.StraightArrow(points,{
        color:colorType,weight:2,opacity:0.5,fillColor:'red',fillOpacity:0.2,fill:true,id:id,
      })
      //向地图上添加面
      that.TMap.addOverLay(name);
      that.arrowArray.push(name)
      name.addEventListener("click",that.arrowClick);


    },
    //创建多边形
    drawAction() {
      let that = this
      if (that.drawEntity) that.drawEntity.close();
      that.drawEntity = new T.PolygonTool(that.TMap);
      that.drawEntity.open();
      //监听结束绘制
      this.drawEntity.addEventListener("draw", that.drawEnd);
    },
    //绘制结束
    drawEnd(e){
      console.log(e)
      console.log("多边形---绘制结束")
      var value = e.currentLnglats;
      var arr = [];
      for(var i in value ){
        console.log(value[i])
        var json = {
          lon:value[i].lng,
          lat: value[i].lat,
        }
        arr.push(json);
      }
      this.myData = arr
      console.log(arr,"经纬度----")
      //this.$set(this.model,"lonAndLat",JSON.stringify(arr));//经纬度
    },


    /*--------------------新增、编辑、详情、删除等数据处理方法---------------------------------*/


    //编辑-重绘标点或区域
    handleEditm(record){
      //重置区域绘制
      //this.resetDraw();
      this.deleteAll()
      this.model = Object.assign({}, record)
      this.disabled = false;
      this.isAdd = true;

      //判断是否有绘制区域
      if(this.model.data == "[]"){
        this.isDraw = false;
      }else{
        this.isDraw = true;
      }
      // 根据数据绘制区域
      var data = JSON.parse(record.data);
      this.addArea(data,record.id);
    },
    //详情-地图上显示对应标点或区域
    handleDetailm(record){
      //重置区域绘制
     // this.resetDraw();
      this.deleteAll()
      this.model = Object.assign({}, record)
      this.disabled = true;
      this.isAdd = true;

      //判断是否有绘制区域
      if(this.model.data == "[]"){
        this.isDraw = false;
      }else{
        this.isDraw = true;
      }
      // 根据数据绘制区域
      var data = JSON.parse(record.data);
      this.addArea(data,record.id);
    },



    //重置区域绘制
    resetDraw(){
      if (this.drawEntity) this.drawEntity.close();
      this.TMap.clearOverLays()
      this.myData = [];
      this.isDraw = false;
      return
      //取消默认的点击事件
      if( this.handler != null){
        this.handler.destroy();
      }
      //添加左键双击完成并退出绘制模式
      try{
        if( this.draw != null) this.stopDraw =  this.draw.isDraw();
        if(this.stopDraw){
          this.draw.disable();
        }
      }catch{
        console.log("箭頭")
      }

      this.actionDraw = false;
      var id = "";
      if(this.drawEntity != null){
        // 获取实例id
        id = this.drawEntity.id;
        // 删除地图上的绘制的任意一个实例
        this.deleteEntity(this.drawEntity);
      }else if(this.model.id){
        id = 'polygon'+this.model.id;
      }
      this.deleteEntityById(id);
      // (五) 删除区域绘制的线段及顶点标注
      this.deleteML();
      this.drawEntity = null;
      this.myData = [];
      this.isDraw = false;
      // this.model.data = [];
    },
  
      //删除区域
      deleteAction(this.url.delete, {id: id}).then((res) => {
        if (res.success) {
          this.$message.success(res.message);
          //重置区域绘制
          if(id == this.model.id){
            this.handleCancelm();
          }else{
            this.deleteEntityById('polygon'+id);
          }
          this.loadData();
        } else {
          this.$message.warning(res.message);
        }
      });
    },
    //保存
    submitForm () {
      if(this.model.data == "[]" || this.model.data == null || this.model.data == undefined){
        if(this.drawEntity == null){
            this.$message.warning("请绘制围栏区域!");
            return;
        }

      }
      const that = this;
      // 触发表单验证
      this.$refs.form.validate(valid => {
        if (valid) {
          let httpurl = '';
          let method = '';
          if(!this.model.id){
            if(!this.url.add){
              this.$message.error("请设置url.add属性!")
              return
            }
            httpurl+=this.url.add;
            method = 'post';
          }else{
            if(!this.url.edit){
              this.$message.error("请设置url.edit属性!")
              return
            }
            httpurl+=this.url.edit;
            method = 'put';
          }
          if(this.myData.length != 0){
            var json = JSON.stringify(this.myData);
            this.model.data = json;
          }
          httpAction(httpurl,this.model,method).then((res)=>{
            if(res.success){
              that.$message.success(res.message);
              that.handleCancelm();
              that.searchQuery();
            }else{
              that.$message.warning(res.message);
            }
          })
        }

      })
    },
  },
}