vue【天地图】使用天地图api绘制GeoJson解析,矩形绘画,实现本地js天地图效果

标签: 天地图  vue.js  javascript  ecmascript

Vue项目引入天地图

在vue的静态资源目录下的index.html中引入天地图的底图,开发天地图源码路径:http://lbs.tianditu.gov.cn/api/js4.0/examples.html

方法一:加载天地图,引用:public/index.html

<script type="text/javascript" src="http://api.tianditu.gov.cn/api?v=4.0&tk=你申请的key"></script>

方法二:下载4.0天地图js,使用本地js文件实现天地图,加快天地图绘画和解决天地图加载卡顿

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

天地图:GeoJson,网址画矩形形状,得到geoJson 数据
https://geojson.io/#map=22/31.62690/120.30547

<template>
  <div >
  	<div class="Map_conter" id="map"></div>
  	<div class="Draw_draw__pv">
  		<el-tooltip class="item" effect="dark" content="测距" placement="left">
			<div class="point" @click="lineTool.open()">
				<img src="../assets/images/lineTool.png" class="pointImg">
            </div>
		</el-tooltip>
        <el-tooltip class="item" effect="dark" content="测面" placement="left">
	         <div class="point" @click="polygonTool.open()">
				<img src="../assets/images/polygonTool.png" class="pointImg2">
			</div>
		</el-tooltip>
	</div>
  </div>
</template>

<script>
export default {
  data () {
        return {
            map: {},//地图
            infoWin: '',
            lineTool: '',//测距工具
            polygonTool: '',//测面工具

    };
  },

  created() {},

    methods: {
    handleAddPoint(id) {
      this.ID = id
      pubOne(this.ID).then(res => {
        this.pubOneData = res.data
        if (this.pubOneData.GEOJSON == null || this.pubOneData.GEOJSON == '') {
          this.$message({ type: 'success', message: '定位不到相关位置!', })
          this.clearAll();
        } else {
          this.getLinesFromGeojson(this.pubOneData.GEOJSON,this.pubOneData.name) //服务器返回GEOJSON数据传
        }
      })
    },
    /**
     * 从GEOJSON获取所有linestring
     * @param {*} GEOJSON 
     * @returns  返回线段数组
     */
    getLinesFromGeojson(GEOJSON, name) {
      var json = JSON.parse(GEOJSON);
      let lines = [];
      let _bounds = [];
      let points = [];
      let geometries = json.geometry.coordinates[0];
      for (let i = 0; i < geometries.length; i++) {
        lines.push(geometries[i])
      }
      lines.forEach((coors) => {
        let polygon = this.createPolygon(coors, {
          fillOpacity: 0.001
        });
        this.map.addOverLay(polygon);

        if (this.infoWin) {
          this.map.removeOverLay(this.infoWin);
          this.infoWin = null;
        }
        var html = "<h5>" + name + "</h5>";
        this.infoWin = new T.InfoWindow(html, new T.Point([0, 0]));
        polygon.openInfoWindow(this.infoWin);
        
        polygon.addEventListener("click", function () {
          this.isShowDetails = true
        }, this);

        //设置中心点
        let _Bounds = polygon.getBounds();//拿到对象范围
        _bounds = _Bounds.getCenter();//获取中心点
        geometries.forEach((lonlat) => {
          points.push(new T.LngLat(lonlat[0], lonlat[1]));
        })
        this.map.setViewport(points); //设置范围
      })
      this.map.centerAndZoom(new T.LngLat(_bounds.lng, _bounds.lat), 10);
      return lines
    },

    /**
     * 创建polygon
     * @param {*} points 多边形坐标 二维数组
     * @param {*} option 
     * @returns  返回polygon
     */
    createPolygon(coors, option){
      let points = [];
      coors.forEach((lonlat) => {
        points.push(new T.LngLat(lonlat[0], lonlat[1]));
      })
      this.clearAll();
      let polygon = new T.Polygon(points, {
        color: "#167FFD", weight: 2, opacity: 1, fillColor: "#167FFD", fillOpacity: 0.5
      });
      return polygon
    },
    //清空地图及搜索列表
    clearAll() {
      this.map.clearOverLays();
      this.map.centerAndZoom(new T.LngLat(112.944895, 28.236163), 12);
    },
    load() {
      var T = window.T;
      var imageURL = 'http://t0.tianditu.gov.cn/img_c/wmts?tk=你申请的key';
      var lay = new T.TileLayer(imageURL, { minZoom: 1, maxZoom: 18 });
      var config = { layers: [lay], name: 'TMAP_SATELLITE_MAP' };

      this.map = new T.Map('map', config); // 地图实例

      var ctrl = new T.Control.MapType();
      this.map.addControl(ctrl);
      this.map.setMapType(window.TMAP_HYBRID_MAP);   // 设置地图位地星混合图层

      this.map.centerAndZoom(new T.LngLat(112.944895, 28.236163), 12);
      //允许鼠标双击放大地图
      this.map.enableScrollWheelZoom();
      this.map.enableDrag();
      //创建比例尺控件对象 添加比例尺控件
      var scale = new T.Control.Scale();
      this.map.addControl(scale);

      var config = {
        showLabel: true,
        color: "red", weight: 3, opacity: 0.5, fillColor: "#FFFFFF", fillOpacity: 0.5
      };
      //创建标注工具对象
      this.lineTool = new T.PolylineTool(this.map, config);
      //创建标注工具对象
      this.polygonTool = new T.PolygonTool(this.map, config);
      this.GetMaps()
    },
    GetMaps() {
      let T = window.T;
      //设置显示地图的中心点和级别
      this.map.clearOverLays();
      this.map.centerAndZoom(new T.LngLat(111.52232, 25.116313), 9);
      var icon = new T.Icon({
        iconUrl: 'http://api.tianditu.gov.cn/img/map/markerA.png',
        iconSize: new T.Point(33, 33),
        iconAnchor: new T.Point(10, 25)
      });
      var latlng = new T.LngLat(21, 22,); // 设置坐标点传入经度纬度
      let marker = new T.Marker(latlng, { icon: icon });// 创建标注

    },
    
    },
    mounted() {
        this.load();
    }
}
</script>

<style lang='less' scoped>
.Map_conter {
    position: relative;
    width: 100%;
    height: 800px;
    overflow: hidden;
    z-index: 3;
}
</style>

如果想学全栈开发,从写接口到,前端实现调接口,一整套流程,可以进群获取视频资料学习!

Java全栈交流①群要是满了可以加2群 1135453115, ②群 821596752

版权声明:本文为hui_54520原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hui_54520/article/details/126161381

智能推荐

NOIP2013【优质代码】

为了加速,把c++全改成了c语言。。。。。 block flower puzzle   600ms 小Z的袜子 优化过后的代码,效果强劲……    ...

Haproxy+Nginx+Tomcat实现动静分离页面

Haproxy+Nginx+Tomcat实现动静分离页面 一、Haproxy概述; 二、Haproxy原理实现; 三、Nginx、LVS、Haproxy对比; 四、Haproxy配置文件讲解; 五、案例:Haproxy+Nginx+Tomcat搭建高可用集群; 一、Haproxy概述; 概述:Haproxy是一个开源的高性能的反向代理或者说是负载均衡服务软件之一,由C语言编写而成,支持会话保持、七...

python中heapq堆的讲解

1. 基本概念 堆是非线性的树形的数据结构,有两种堆,最大堆与最小堆。 heapq库中的堆默认是最小堆 最小堆,树种各个父节点的值总是小于或等于任何一个子节点的值。 最大堆,树种各个父节点的值总是大于或等于任何一个子节点的值。 一般使用二叉堆来实现优先级队列,它的内部调整算法复杂度为logN。 堆是一个二叉树,heapq堆数据结构最重要的特征是heap[0]永远是最小的元素。 2. 解题技巧 常用...

BuleHero 蠕虫分析

文章目录 前言 执行过程 详细分析 火绒剑分析 IDA关键词分析 Wireshark抓包 漏洞利用 CVE-2017-12615 漏洞利用 CVE-2017-5638 漏洞利用 CVE-2018-2628 漏洞利用 CNVD-2018-24942 漏洞利用 CVE-2019-2725 漏洞利用 CVE-2018-7600 漏洞利用 CVE-2019-0193 漏洞利用 PHPStudy后门 总结 ...

Java基础面试点1

1.Java跨平台原理 java通过不同的系统、不同版本、不同位数的java虚拟机(jvm),来屏蔽不同的系统指令差异,而对外提供统一的接口(Java API),对于开发者而言,只需要按照接口开发即可。如果需要部署到不同的环境时,只需要在对应的系统环境安装对应版本的虚拟机即可。 2.装箱和拆箱 Java中提供了8中基本的数据类型:byte、short、 int、 long 、float 、doub...

猜你喜欢

什么?原来C#还有这两个关键字

系列介绍 简介 【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net知识等等。 场景 您可以在下班坐地铁的时候,拿出手机逛一逛博客园,利用短短的五分钟完成阅读。 诞生缘由 曾经学过的内容可能过不了多久就忘了,我们需要一些文章来帮我们查漏补缺。 太长篇幅的文章看着...

TensorFlow技术解析与实战 11 自然语言处理

       与图像识别不同,在自然语言处理中输入的往往是一段语音或者一段文字,输入数据的长短是不确定的,并且它与上下文有很密切的关系,所以常用的是循环神经网络(recurrent neural network,RNN)模型 11.1 模型的选择        使用不同输入和不同数据时,分别适用哪种模型以及如何应用 (...

2020年Java面试题基础系列二(21~50题)

21、存在两个类,B 继承 A,C 继承 B,我们能将 B 转换为C 么?如 C = (C) B; 这属于强制类型转换,如果被转换的B实例不是C类型,会有异常 比如你的ABC分别对应动物,猫,黑猫。 向上转型就是比如 C c = new C(); B b = c; 你把c转型为B,黑猫是猫吗?是啊,所以这是ok的。 但是反过来 B b = new B(); C c = (C)b; 这就不ok了,只...

有序表的合并——链表实现

完整代码 运行结果...

HashMap和Hashtable

HashMap与Hashtable的区别 一.类继承体系 HashMap继承自抽象类AbstractMap,而Hashtable继承自抽象类Dictionary。其中Dictionary已经被放弃,HashTable比HashMap多了两个公开方法,一个是elements(),另一个是contains()。 二.Null Key 与 Null Value HashMap支持null键和null值的...