内网离线高德地图开发

最近公司需要内网开发,使用到高德地图,正好碰到,在这里记录一下。本博客中实现了离线高德地图显示,点聚合,非聚合点自定义图标,图标点击弹出信息框,框选,圈选区域这些功能。
效果图:


1.png
2.png
3.png

实现思路:
1、下载地图瓦片数据,gitee有个开源地图瓦片下载项目,我fork了一下,地图下载器
如果有fork失败的兄弟,可以找我私信要。

4.png

5.png
11.png

6.png

2、下载高德地图离线2.0JS API,高德地图离线地图api地址

amap文件夹放在public下边,和瓦片数据同一级。

声明

  • 本离线包基于高德地图js-api2.0,在此基础进行修改。
  • 本项目仅为个人兴趣开发,不收费,作者也不提供任何付费服务。
  • 本项目仅供个人学习研究使用。
  • 本项目禁止商用,禁止在企业项目开发中使用此地图离线包,禁止使用此离线包以及基于此项目二次开发的软件从事盈利活动。

3、第一步和第二步已经能实现简单的高德地图渲染了,但是我们加载地图肯定是需要别的操作,比如点聚合,非聚合点自定义图标,图标点击弹出信息框,框选,圈选区域这些功能。这时候就需要我们我们自带的AMap3.js可能没有或者对应的插件包报错,我们就应该添加新的插件对应的js。

7.png

下载方法,本地项目中引入在线的高德地图,plugins中把我们需要的插件添加进去。
8.png

然后运行起来,在网页端network中下载对应的js,然后查找关键字jsload,把我们新添加插件对应的这一串添加到我们本地AMap3.js的最下边就OK了。
9.png

基本步骤就说清楚了,下边是一些显示,点聚合,非聚合点自定义图标,图标点击弹出信息框的代码。

    //初始化
    async initData() {
      //定义地图
      const base_url = "../../";
      const layers = [new AMap.TileLayer({
        getTileUrl: function (x, y, z) {
          return `${base_url}MAP_zxy/${z}/${x}/${y}.png`;
        },
        opacity: 1,
        zIndex: 99,
      })]
      this.map = new AMap.Map('container', { // 设置地图容器id
        zoom: 10,
        resizeEnable: true,
        rotateEnable: true,
        pitchEnable: true,
        // center: [104.96824,33.375687],
        center: [103.847998, 36.067468],
        defaultCursor: 'pointer',
        showLabel: true,  //是否显示文字标注
        layers: layers
      })

      //聚合打点
      this.addCluster();

      //定义鼠标框选工具
      this.mouseTool = new AMap.MouseTool(this.map);
      const that = this;
      this.mouseTool.on('draw', function (event) {
        that.markerForFigure = [];
        that.mouseTool.close(false);

        // 获取所有点
        var allMarkers = that.map.getAllOverlays('marker');
        var eObject = event.obj;//obj覆盖物对象。
        allMarkers.forEach((marker => {
          var markerInPolygon = eObject.contains(marker.getPosition());//是否包含marker
          if (markerInPolygon) {
            that.markerForFigure.push(marker)
          }
        }));
        console.log(that.markerForFigure, "被选中的标记")
      });
    },

    addCluster() {
      let pointers = [];
      if (this.rawData) {
        this.rawData.map((value, index) => {
          if (value.longitude !== undefined && value.latitude !== undefined) {
            pointers.push({
              weight: 1,
              lnglat: [
                this.toFixedDigit(value.longitude - 0, 5),
                this.toFixedDigit(value.latitude - 0, 5),
              ],
              deviceId: value.deviceId,
              deviceCode: value.channelId,
              deviceName: value.channelName,
              orgCode: value.orgCode,
              isOnline: value.psOnlineState,
              manufacture: value.manufacture,
            });
            this.allPointers = pointers;
          }
        });
      }
      if (this.cluster && this.cluster != null) { //1. 如果存在 cluster 说明已经初始化过了,直接使用,变更它的点的内容就可以了。
        this.cluster.setData(pointers);
      } else {//2. 如果没有 cluster 就进行初始化。
        this.infoWindow = new AMap.InfoWindow({ closeWhenClickMap: true, offset: new AMap.Pixel(0, -30) });
        this.cluster = new AMap.MarkerCluster(
          this.map, // 地图实例
          pointers, // 海量点数据,数据中需包含经纬度信息字段 lnglat
          {
            gridSize: 60,// 设置网格像素大小
            // renderClusterMarker: this.renderClusterMarker, // 自定义聚合点样式
            renderMarker: this.renderMarker, // 自定义非聚合点样式
          }
        )
      }
      this.cluster.on('click', (item) => {
        //此处是通过包含点的数量判断是否是聚合点,不是聚合点就执行上方单个点的点击方式
        if (item.clusterData.length <= 1) {
          return;
        }
        //这里是计算所有聚合点的中心点
        let alllng = 0, alllat = 0;
        for (const mo of item.clusterData) {
          alllng += mo.lnglat.lng;
          alllat += mo.lnglat.lat;
        }
        const lat = alllat / item.clusterData.length;
        const lng = alllng / item.clusterData.length;
        //这里是放大地图,此处写死了每次点击放大的级别,可以根据点的数量和当前大小适应放大,体验更佳
        this.map.setZoomAndCenter(this.map.getZoom() + 4, [lng, lat]);
      });
    },
    //格式化经纬度
    toFixedDigit(num, n) {
      //保留n位
      if (typeof num != "number") {
        return false;
      }

      num = num.toString();
      var result = "";
      var zeroResult = function (n) {
        var zero = "";
        for (var i = 0; i < n; i++) {
          zero += "0";
        }
        return zero;
      };
      if (num % 1 == 0) {
        //整数
        result = num + "." + zeroResult(n);
      } else {
        //小数
        var num1 = num.split(".");
        if (num1[1].length < n) {
          result = num1[0] + "." + num1[1] + zeroResult(n - num1[1].length);
        } else {
          result = num1[0] + "." + num1[1].substring(0, n);
        }
      }
      return result;
    },
    //自定义非聚合点样式
    renderMarker(context) {
      const { marker, data } = context;
      let iconOn = new AMap.Icon({
        size: new AMap.Size(66, 80), // 图标尺寸
        image: require(`../../assets/images/video-online.png`), // Icon的图像
        imageSize: new AMap.Size(38, 50), // 根据所设置的大小拉伸或压缩图片
      });
      let iconOff = new AMap.Icon({
        size: new AMap.Size(66, 80), // 图标尺寸
        image: require(`../../assets/images/video-offline.png`), // Icon的图像
        imageSize: new AMap.Size(38, 50), // 根据所设置的大小拉伸或压缩图片
      });
      if (data[0].isOnline == '1') {
        marker.setIcon(iconOn)
      } else if (data[0].isOnline == '0') {
        marker.setIcon(iconOff)
      }
      marker.on("click", (e) => {
        this.singleData = [];
        console.log(this.$refs.infoWindow);
        this.allPointers.forEach(item => {
          if (item.deviceId == data[0].deviceId) {
            this.singleData.push(item)
          }
        })
        console.log(this.singleData);
        this.$nextTick(()=>{
           this.openInfoWindow(e)
        })
       
      });
    },
    openInfoWindow(e) {
      this.infoWindow = new AMap.InfoWindow({
        isCustom: true,
        autoMove: true,
        avoid: [20, 20, 20, 20],
        content: this.$refs.infoWindow,
        closeWhenClickMap: true,
        offset: new AMap.Pixel(16, -40)
      })
      this.infoWindow.open(this.map, e.target.getPosition())
    },
    // 线段
    drawPolyline() {
      this.mouseTool.polyline({
        strokeColor: "#3366FF",
        strokeOpacity: 1,
        strokeWeight: 6,
        // 线样式还支持 'dashed'
        strokeStyle: "solid",
        // strokeStyle是dashed时有效
        // strokeDasharray: [10, 5],
      })
    },
    // 多边形
    drawPolygon() {
      this.mouseTool.close(true)
      this.mouseTool.polygon({
        strokeColor: "#FF33FF",
        strokeOpacity: 1,
        strokeWeight: 6,
        // strokeOpacity: 0.2,
        fillColor: '#1791fc',
        fillOpacity: 0.4,
        // 线样式还支持 'dashed'
        strokeStyle: "solid",
        // strokeStyle是dashed时有效
        // strokeDasharray: [30,10],
      })
    },
    // 矩形
    drawRectangle() {
      this.mouseTool.close(true)
      this.mouseTool.rectangle({
        strokeColor: 'red',
        strokeOpacity: 0.5,
        strokeWeight: 6,
        fillColor: 'blue',
        fillOpacity: 0.5,
        // strokeStyle还支持 solid
        strokeStyle: 'solid',
        // strokeDasharray: [30,10],
      })
    },
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容