一、设置3D成果

1、在初始化地图时开启3D视图、设置视图角度及设置光照(AmbientLight环境光源、DirectionLight平行光源)、增加3D图层(Object3DLayer)、创立Object3D实例、增加Object3D实例到object3dLayer.


二、绘制省市区边界

function DrawSection(cityName, district, isSearchNextLevel) {        district.search(cityName, function (status, result) {          console.log('result===', result)          let bounds = result.districtList[0].boundaries;          if (bounds) {            for (let i = 0; i < bounds.length; i += 1) {              if (isSearchNextLevel) {                // 绘制省的版块                new AMap.Polygon({                  map: map,                  path: bounds[i],                  strokeColor: "#0dcdd1",                  fillColor: "#3D6BB1",                });              } else {                // 绘制市的边界线                new AMap.Polyline({                  path: bounds[i],                  strokeColor: "#0dcdd1",                  map: map,                });              }            }            if (isSearchNextLevel) {              let districtList = result.districtList[0].districtList;              for (let i = 0; i < districtList.length; i += 1) {                DrawSection(districtList[i].name, district, false);              }            }          }        });      }

办法调用

 // 应用递归的形式      let opts = {        // 是否返回行政区边界坐标点        extensions: "all",        // 设置查问行政区级别为 市        level: "city",      };      // 创立DistrictSearch对象      const district = new AMap.DistrictSearch(opts);      DrawSection('陕西省', district, true)

三、画线

    setRiver(data, currentData) {      data.forEach((item, ind) => {        let polyline = null        let strokeColor =          currentData && currentData.name === item.name ? '#F9E446' : item.color        if (item && item.type === 'MultiLineString') {          item.coordinates.forEach(iitem => {            polyline = new AMap.Polyline({              path: iitem,              data: item,              strokeWeight: 8,              strokeColor: strokeColor, // 线条色彩              lineJoin: 'round' // 折线拐点连接处款式            })          })        } else if (item) {          // [[],[]]          polyline = new AMap.Polyline({            path: item.coordinates,            data: item,            strokeWeight: 8,            strokeColor: strokeColor,            lineJoin: 'round' // 折线拐点连接处款式          })        }        let map = this.map        // 绘制当火线        // 将折线增加至地图实例        map.add(polyline)        this.polylines.push(polyline)        polyline.on('click', this.polylineClick)      })    },

四、线或者点的点击事件

 polylineClick(e) {      let position = [e.lnglat.lng, e.lnglat.lat]      let data = e.target.w.data      this.setRiver(this.list, data)      heliuDetail({ year: this.year, zl: data.name }).then(res => {        let detail = res.data[0]        let riverItem = getRiverItem()        riverItem.forEach(item => {          if (item.name === 'jll' || item.name === 'ssl') {            item.label = item.label + '(' + this.year + ')' + ':'          } else {            item.label = item.label + ':'          }        })        let riverInfo = this.setContentByItem(riverItem, detail)        let myRow = '<div class="info_title">' + detail.zl + '</div>'        let html = '<div class="info_box">' + myRow + riverInfo + '</div>'        this.infoWindow.setContent(html)        this.infoWindow.open(this.map, position)      })    },

通过js循环arr渲染dom内容

    setContentByItem(arr, detail) {      let InfoDom = ''      for (let i = 0; i < arr.length; i++) {        let val = arr[i].name2          ? detail[arr[i].name] + '(' + detail[arr[i].name2] + ')'          : detail[arr[i].name]        if (arr[i] && arr[i].prop) {          let value = detail[arr[i].prop]            ? detail[arr[i].prop][arr[i].name]            : ''          if (value && _.isArray(value.list)) {            val = value.count + value.unit + ':' + value.list.join(',')          } else {            val = value          }        }        let arrVal = ''        if (val && _.isArray(val)) {          val.forEach(item => {            arrVal += this.getArrDomByType(item)          })        }        let unit = val && arr[i].unit ? arr[i].unit : ''        let showVal = arrVal          ? '<div class="row_content">' + arrVal + '</div>'          : val          ? val + unit          : '-'        InfoDom +=          '<div class="info_row "><span class="info_lable">' +          arr[i].label +          '</span>' +          showVal +          '</div>'      }      return InfoDom    },

五、加载海量点

         let validList = []          if (list && list.length) {            list.forEach((item, ind) => {            let lon = item[0]            let lat = item[1]              if (lon && lat && lon !== '0.0' && lat !== '0.0') {                item.lnglat = [lon, lat]                let icon = this.newRiverIcon()                item.style = ind                style.push(icon)                validList.push(item)              }            })          }          var mass = new AMap.MassMarks(validList, {            opacity: 1,            zIndex: 111,            cursor: 'pointer',            style: style          })          let map = this.map          this.mass = mass          mass.setMap(map)

六、热力求渲染

       var heatmap;          map.plugin(["AMap.Heatmap"], function () {            //初始化heatmap对象            heatmap = new AMap.Heatmap(map, {                radius: 1, //给定半径                opacity: [1, 1]                ,                gradient:{                    0.5: 'rgb(117,211,248)',                    0.65: 'rgb(117,211,248)',                    0.7: 'rgb(117,211,248)',                    0.9: 'rgb(117,211,248)',                    1.0: 'rgb(117,211,248)'                }            });            //设置数据集:该数据为北京局部“公园”数据            heatmap.setDataSet({                data: validList,                max: 0.1            });          }); 

七、地图重置

    removeMarkers() {      if (this.mass) {        this.mass.clear() //革除海量点        this.infoWindow.close() //敞开所有信息窗体      }    },    resetMap() {      this.removeMarkers()      this.map.setCenter([100.907295, 35.901474])      this.map.setZoom(6.8)      let infoWindowContent = document.getElementsByClassName(        'amap-info-content'      )[0]      if (infoWindowContent) {        infoWindowContent.style.display = 'none'      }    },