layui.define(['jquery', 'notice'], function (exports) { let $ = layui.jquery; let notice = layui.notice; /** * 模拟请求,判断网络 * @param {function} callback 回调 */ function onLine(callback) { let img = new Image(); img.src = 'https://www.baidu.com/favicon.ico?_t=' + Date.now(); img.onload = function () { if (callback) callback(true) }; img.onerror = function () { if (callback) callback(false) }; } function gaodeMap() { let that = this; this.map; let defaultOpt = { domID: 'container', zoom: 16, mapCenter: [121.503144, 31.235309] } this.opt = defaultOpt this.render = function (option) { // 根据网络情况,加载地图 onLine(function (flag) { if (flag) { window.onLoad = function () { that.opt = $.extend({}, defaultOpt, option); that.init(); if (typeof option.done === 'function') { option.done(); } }; let url = 'https://webapi.amap.com/maps?v=1.4.15&key=d57b9f334d35402807617176c660f1c3&callback=onLoad&plugin=AMap.MouseTool,AMap.PolyEditor,AMap.Autocomplete,AMap.PlaceSearch,AMap.Geocoder,AMap.CitySearch,AMap.PolyEditor,AMap.CircleEditor'; let jsapi = document.createElement('script'); jsapi.charset = 'utf-8'; jsapi.src = url; document.head.appendChild(jsapi); } else { option.done(); console.log('网络故障,禁止使用地图'); } }); } } /* * @method * @desc 卫星地图 */ gaodeMap.prototype.SatelliteLayer; gaodeMap.prototype.TileLayer; /* * @method * @param {object} lnglat 高德经纬度对象或者经纬度数组 * @desc 初始化地图对象 */ gaodeMap.prototype.init = function () { let that = this; this.SatelliteLayer = new AMap.TileLayer.Satellite(); this.TileLayer = new AMap.TileLayer(); this.map = new AMap.Map(that.opt.domID, { zoom: that.opt.zoom, zooms: [5, 18], center: that.opt.mapCenter, viewMode: '3D', pitch: 60, resizeEnable: true, }); if (this.SatelliteLayerBuildings) { this.map.add(this.SatelliteLayerBuildings) } // 3D地图 this.add3DCompass(); // 鼠标工具 this.mouseTool = new AMap.MouseTool(that.map); } gaodeMap.prototype.checkMap = function () { if (!this.map) { notice.error('地图未加载或正在加载,请稍后再试') return true; } } /** * 当你不想每个函数都检查地图是否已加载时,可以使用以下方式执行函数 */ /** * gaodeMap.prototype.ExcuteFunction = function (funcName,...params) { if (that.checkMap()) { return; } this[funcName].apply(this,params); } */ /* * @method * @desc 添加3D地图 */ gaodeMap.prototype.add3DCompass = function () { let that = this; if (that.checkMap()) { return; } AMap.plugin([ 'AMap.ControlBar', ], function () { // 添加 3D 罗盘控制 that.map.addControl(new AMap.ControlBar({ position: { top: '50px', right: '20px' } })); }); } /* * @method * @desc 添加卫星地图 */ gaodeMap.prototype.addSatelliteLayer = function () { if (this.checkMap()) { return; } if (this.SatelliteLayer) { this.map.add(this.SatelliteLayer); } } /* * @method * @desc 移除卫星地图 */ gaodeMap.prototype.removeSatelliteLayer = function () { if (this.checkMap()) { return; } this.map.remove(this.SatelliteLayer); } /* * @method * @desc 添加卫星地图 */ gaodeMap.prototype.addTileLayer = function () { if (this.checkMap()) { return; } this.map.add(this.TileLayer); } /* * @method * @desc 移除卫星地图 */ gaodeMap.prototype.removeTileLayer = function () { if (this.checkMap()) { return; } this.map.remove(this.TileLayer); } /* * @method * @param {object} option * @param {object} option.lnglat 高德经纬度对象或者经纬度数组 * @param {object} option.type 移动方式 * @desc 设置地图中心位置 */ gaodeMap.prototype.setCenter = function (option) { if (this.checkMap()) { return; } if (!option) { return; } if (!option.lnglat) { return; } option.type = option.type || 1; if (option.type == 1) { this.map.setCenter(option.lnglat); } else { this.map.panTo(option.lnglat); } } /* * @method * @desc 标记点集合 */ gaodeMap.prototype.markers = {}; /* * @method * @param {object} option * @param {object} option.lnglat 高德经纬度对象或者经纬度数组 * @param {object} option.size 图片大小,图片地址无时,此项无效 * @param {object} option.imageUrl 图片地址 * @param {object} option.extData 自定义数据 * @param {object} option.click 点的单击事件 * @desc 设置地图中心位置 */ gaodeMap.prototype.addMarker = function (option) { if (this.checkMap()) { return; } var defaultOption = { //lnglat size: [32, 32], imageUrl: undefined }; var tempOpt = $.extend({}, defaultOption, option); var markerOpt = { map: this.map }; // 经纬度 if (!tempOpt.lnglat) { return; } markerOpt.position = tempOpt.lnglat; // 自定义图片 if (tempOpt.imageUrl) { markerOpt.icon = new AMap.Icon({ size: new AMap.Size(tempOpt.size[0], tempOpt.size[1]), image: tempOpt.imageUrl, imageSize: new AMap.Size(tempOpt.size[0], tempOpt.size[1]) }) markerOpt.offset = new AMap.Pixel(-(tempOpt.size[0] / 2), -tempOpt.size[1]) } // 鼠标滑过时的显示 markerOpt.title = tempOpt.title || ''; // 自定义参数 markerOpt.extData = tempOpt.extData; markerOpt.key = tempOpt.key; var marker = new AMap.Marker(markerOpt); if (option.isPanTo) { this.map.panTo(tempOpt.lnglat); } if (!markerOpt.key) { markerOpt.key = this.newGuid(); } this.markers[markerOpt.key] = marker; if (tempOpt.click) { marker.on('click', function (e) { tempOpt.click(e, marker.getExtData()); }) } if (typeof tempOpt.clickAfter === 'function') { tempOpt.clickAfter(tempOpt.extData); } // 文本标注 if (tempOpt.labelText) { this.addMarkerLabel(marker, tempOpt.labelText) } return marker; } gaodeMap.prototype.addMarkerLabel = function (marker, label) { marker.setLabel({ offset: new AMap.Pixel(0, -30), //设置文本标注偏移量 content: '<div class="map-label"><div>' + label + '<div> </div></div></div>', //设置文本标注内容 direction: 'top' //设置文本标注方位 }); } /* * @method * @param {bool} type true:清除点 false:清除地图 * @desc 清除地图上的标记 */ gaodeMap.prototype.clearMarkers = function (type, callback) { if (this.checkMap()) { return; } if (type) { $.each(this.markers, function (key, value) { value.setMap(null); }) } else { this.map.clearMap(); } this.markers = {}; if (this.clusterer) { this.clusterer.setMap(null); this.clusterer = undefined; } if (typeof callback == 'function') { callback() } } /* * @method * @param {bool} key object:marker的指定唯一标识 * @param {bool} isExclude bool:指定删除内容,true:删除不包含key的所有内容,false:删除包含可以的marker * @desc 清除地图上的标记 */ gaodeMap.prototype.clearMarker = function (key, isExclude) { if (this.checkMap()) { return; } if (isExclude == undefined) { isExclude = false; } var that = this; if (!isExclude) { if (key) { if (this.markers[key]) { var marker = this.markers[key]; marker.setMap(null); delete this.markers[key] } } //this.markers = {}; if (this.clusterer) { this.clusterer.setMap(null); this.clusterer = undefined; } } else { $.each(that.markers, function (k, v) { if (k != key) { v.setMap(null); delete that.markers[k] } }) } } /* * @method * @param {bool} key object:marker的指定唯一标识的一部分 * @desc 清除地图上的标记 */ gaodeMap.prototype.clearAssignMarkers = function (key) { if (this.checkMap()) { return; } var that = this var keys = []; $.each(that.markers, function (k, v) { if (k.indexOf(key) > -1) { keys.push(k); v.setMap(null); } }) $.each(keys, function (i, item) { delete that.markers[item]; }) } /* * @method * @param {bool} key object:marker的指定唯一标识 * @desc 根据key获取marker对象 */ gaodeMap.prototype.getMarker = function (key) { if (this.checkMap()) { return; } if (key) { return this.markers[key] } return undefined; } /* * @method * @param {bool} key object:marker的指定唯一标识的一部分 * @desc 根据key获取marker对象集合 */ gaodeMap.prototype.getMarkers = function (key) { if (this.checkMap()) { return; } var mrks = []; $.each(that.markers, function (k, v) { if (k.indexOf(key) > -1) { mrks.push(v); } }) return mrks; } /* * @method * @param {bool} key object:marker的指定唯一标识 * @param {array} size array:图标大小,默认值[60,60] * @desc 根据key设置图标大小 */ gaodeMap.prototype.setMarkerIcon = function (key, size) { if (this.checkMap()) { return; } var marker = this.markers[key] if (marker) { var _size = [60, 60]; if (size) { _size = size; } var icon = marker.getIcon() marker.setIcon(new AMap.Icon({ size: new AMap.Size(_size[0], _size[1]), image: icon.w.image, imageSize: new AMap.Size(_size[0], _size[1]) })) marker.setOffset(new AMap.Pixel(-(_size[0] / 2), -_size[1])) } } /* * @method * @param {bool} key object:marker的指定唯一标识 * @desc 选中时的图标大小 */ gaodeMap.prototype.checkedMarker = function (key) { if (this.checkMap()) { return; } this.setMarkerIcon(key, [45, 45]); } /* * @method * @param {bool} key object:marker的指定唯一标识 * @desc 反选时的图标大小 */ gaodeMap.prototype.uncheckedMarker = function (key) { if (this.checkMap()) { return; } this.setMarkerIcon(key, [32, 32]); } /* * @method * @param {bool} key object:marker的指定唯一标识 * @desc 设置所有图标,按反选时的图标大小设置 */ gaodeMap.prototype.setAllMarkersIcon = function () { if (this.checkMap()) { return; } var that = this; $.each(that.markers, function (k, v) { that.uncheckedMarker(k); }) } /* * @method * @param {bool} key object:marker的指定唯一标识 * @desc 设置所有图标,按反选时的图标大小设置 */ gaodeMap.prototype.setUncheckedMarkersIcon = function (key) { if (this.checkMap()) { return; } var that = this; $.each(that.markers, function (k, v) { if (k.indexOf(key) > -1) { that.uncheckedMarker(k); } }) } /* * @method * @param {bool} key object:marker的指定唯一标识的一部分 * @desc 设置选中的marker的图标大小 */ gaodeMap.prototype.setCheckedMarkersIcon = function (key) { if (this.checkMap()) { return; } var that = this; $.each(that.markers, function (k, v) { if (k.indexOf(key) > -1) { that.checkedMarker(k); } }) } /* * @method * @desc 弹框对象 */ gaodeMap.prototype.infoWindow = undefined; /* * @method * @desc 关闭弹框 */ gaodeMap.prototype.addInfoWindow = function (option) { if (this.checkMap()) { return; } if (!option) { return } var html; if (option.content) { html = $(option.content) } this.infoWindow = new AMap.InfoWindow({ offset: option.offset || new AMap.Pixel(0, -34), isCustom: true,// 自定义窗体 默认false closeWhenClickMap: option.closeWhenClickMap == undefined ? false : option.closeWhenClickMap, // 点击地图关闭信息窗,默认不关闭 content: html.get(0) //使用默认信息窗体框样式,显示信息内容 }); this.infoWindow.open(this.map, option.lnglat); this.bindCloseInfoWindow(html, option); if (typeof option.addFinish === 'function') { option.addFinish(html, option.extData); } } /* * @method * @desc 绑定关闭弹框事件 */ gaodeMap.prototype.bindCloseInfoWindow = function (html, option) { var that = this; html.find('.close-window').on('click', function () { that.infoWindow.close(); if (typeof option.closeAfter === 'function') { option.closeAfter(option.extData); } }) } /* * @method * @desc 绑定关闭弹框事件 */ gaodeMap.prototype.closeInfoWindow = function () { if (this.infoWindow) { this.infoWindow.close(); } } /* * @method * @desc 点聚合对象 */ gaodeMap.prototype.clusterer = undefined; /* * @method * @desc 添加点聚合效果 */ gaodeMap.prototype.addClusterer = function (keys, clickCallBack) { if (this.checkMap()) { return; } var tempMarkers = []; var that = this; for (var key in this.markers) { if (keys) { $.each(keys, function (i, item) { if (key.indexOf(item) > -1) { tempMarkers.push(that.markers[key]); } }) } else { tempMarkers.push(that.markers[key]); } } if (!this.clusterer) { this.clusterer = new AMap.MarkerClusterer(this.map, tempMarkers, { gridSize: 80, maxZoom: 50, zoomOnClick: false }); if (typeof clickCallBack === 'function') { this.clusterer.on('click', function (cluster) { clickCallBack(cluster) }) } } else { this.clusterer.clearMarkers(); this.clusterer.setMarkers(tempMarkers); } } /* * @method * @desc 生成guid */ gaodeMap.prototype.newGuid = function () { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); } /* * @method * @desc 覆盖物数组 */ gaodeMap.prototype.overlay = []; /* * @method * @desc 删除覆盖物 */ gaodeMap.prototype.removeOverlay = function (key) { if (this.checkMap()) { return; } if (key) { if (this.overlay[key]) { var overlay = this.overlay[key]; this.map.remove(overlay); delete this.overlay[key] } } } /* * @method * @desc 添加圆 */ gaodeMap.prototype.addCircle = function (opt) { if (this.checkMap()) { return; } if (!opt.center) { console.error('未提供中心点坐标'); return } if (!opt.radius || opt.radius == 0) { console.error('未提供半径'); return } var _defaultOpt = { //center: coor, //radius: radius, //半径 strokeColor: "#008ad8",//线条颜色 strokeOpacity: 0.4,//透明度 strokeWeight: 3, // 线样式还支持 'dashed' fillColor: '#00b0ff', fillOpacity: 0.4,//填充透明度 bubble: true,//允许冒泡到地图 map: this.map } var circleOpt = $.extend({}, _defaultOpt, opt) var circle = new AMap.Circle(circleOpt) if (typeof circleOpt.click === 'function') { circle.on('click', function (e) { var data = circle.getExtData() circleOpt.click(e, data); }) } if (circleOpt.text) { var center = this.getLonAndLat(circleOpt.center.getLng(), circleOpt.center.getLat(), 180, circleOpt.radius) this.addText({ text: circleOpt.text, offset: new AMap.Pixel(0, 10), coor: new AMap.LngLat(center.lng, center.lat) //circleOpt.center }) } if (!circleOpt.key) { circleOpt.key = this.newGuid(); } this.overlay[circleOpt.key] = circle; } /* * @method * @desc 画圆 */ gaodeMap.prototype.drawCircle = function (callback) { if (this.checkMap()) { return; } let that = this; let option = { strokeColor: "#80d8ff", strokeWeight: 6, strokeOpacity: 0.2, fillColor: '#00b0ff', fillOpacity: 0.4, strokeStyle: 'solid', } that.mouseTool.close(); that.mouseTool = new AMap.MouseTool(that.map); that.map.clearMap(); that.mouseTool.circle(option) // 无法移除 // that.mouseTool.off('draw'); that.mouseTool.on('draw', function (event) { let radius = event.obj.getRadius() let center = event.obj.getCenter() callback && callback(radius, center) // 编辑 that.editCircle({ callback: callback, radius: radius, center: center }); }); } /* * @method * @desc 编辑圆 */ gaodeMap.prototype.editCircle = function (option) { if (this.checkMap()) { return; } let that = this; let editOption = { strokeColor: "#008ad8", strokeWeight: 3, strokeOpacity: 0.4, fillColor: '#00b0ff', fillOpacity: 0.4, strokeStyle: 'solid', center: option.center, radius: option.radius, //半径 borderWeight: 3, strokeDasharray: [10, 10], zIndex: 50, map: that.map } that.map.clearMap(); // 编辑前,先删除图层 let circle = new AMap.Circle(editOption); let circleEditor = new AMap.CircleEditor(that.map, circle); circleEditor.on('adjust', function (e) { option.callback && option.callback(e.radius, option.center) }) circleEditor.on('move', function (e) { option.callback && option.callback(option.radius, e.lnglat) }) circleEditor.open(); //打开圆形编辑器 that.map.setFitView(); } /** * 根据一个经纬度及距离角度,算出另外一个经纬度 * @param {float} lng 经度 113.3960698 * @param {float} lat 纬度 22.941386 * @param {int} brng 方位角 45 ---- 正北方:000°或360° 正东方:090° 正南方:180° 正西方:270° * @param {int} dist 90000距离(米) * * 1、角度转换为弧度公式:弧度=角度×(π ÷度180 ) * 2、弧度转换为角度公式: 角度=弧度×(180÷π) */ gaodeMap.prototype.getLonAndLat = function (lng, lat, brng, dist) { //大地坐标系资料WGS-84 长半径a=6378137 短半径b=6356752.3142 扁率f=1/298.2572236 var a = 6378137; var b = 6356752.3142; var f = 1 / 298.257223563; var lon1 = lng * 1; var lat1 = lat * 1; var s = dist; var alpha1 = brng * (Math.PI / 180)//mapNumberUtil.rad(brng); var sinAlpha1 = Math.sin(alpha1); var cosAlpha1 = Math.cos(alpha1); //var tanU1 = (1 - f) * Math.tan(mapNumberUtil.rad(lat1)); var tanU1 = (1 - f) * Math.tan(lat1 * (Math.PI / 180)); var cosU1 = 1 / Math.sqrt((1 + tanU1 * tanU1)), sinU1 = tanU1 * cosU1; var sigma1 = Math.atan2(tanU1, cosAlpha1); var sinAlpha = cosU1 * sinAlpha1; var cosSqAlpha = 1 - sinAlpha * sinAlpha; var uSq = cosSqAlpha * (a * a - b * b) / (b * b); var A = 1 + uSq / 16384 * (4096 + uSq * (-768 + uSq * (320 - 175 * uSq))); var B = uSq / 1024 * (256 + uSq * (-128 + uSq * (74 - 47 * uSq))); var sigma = s / (b * A), sigmaP = 2 * Math.PI; while (Math.abs(sigma - sigmaP) > 1e-12) { var cos2SigmaM = Math.cos(2 * sigma1 + sigma); var sinSigma = Math.sin(sigma); var cosSigma = Math.cos(sigma); var deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 * (cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM) - B / 6 * cos2SigmaM * (-3 + 4 * sinSigma * sinSigma) * (-3 + 4 * cos2SigmaM * cos2SigmaM))); sigmaP = sigma; sigma = s / (b * A) + deltaSigma; } var tmp = sinU1 * sinSigma - cosU1 * cosSigma * cosAlpha1; var lat2 = Math.atan2(sinU1 * cosSigma + cosU1 * sinSigma * cosAlpha1, (1 - f) * Math.sqrt(sinAlpha * sinAlpha + tmp * tmp)); var lambda = Math.atan2(sinSigma * sinAlpha1, cosU1 * cosSigma - sinU1 * sinSigma * cosAlpha1); var C = f / 16 * cosSqAlpha * (4 + f * (4 - 3 * cosSqAlpha)); var L = lambda - (1 - C) * f * sinAlpha * (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM * cos2SigmaM))); var revAz = Math.atan2(sinAlpha, -tmp); // final bearing var lngLatObj = { lng: lon1 + L * (180 / Math.PI), lat: lat2 * (180 / Math.PI) } return lngLatObj; } /* * @method * @desc 添加多边形 */ gaodeMap.prototype.addPolygon = function (opt) { if (this.checkMap()) { return; } if (!opt.path || opt.path.length < 3) { console.error('未提供坐标') return } var _defaultOpt = { strokeColor: "#008ad8",//线条颜色 strokeOpacity: 0.4,//透明度 strokeWeight: 3, // 线样式还支持 'dashed' fillColor: '#00b0ff', fillOpacity: 0.4,//填充透明度 bubble: true,//允许冒泡到地图 map: this.map }; var polygonOpt = $.extend({}, _defaultOpt, opt); var polygon = new AMap.Polygon(polygonOpt); if (typeof polygonOpt.click === 'function') { polygon.on('click', function (e) { var data = polygon.getExtData() polygonOpt.click(e, data); }) } if (polygonOpt.text) { var point = this.getMinLatPoint(polygonOpt.path) this.addText({ text: polygonOpt.text, offset: new AMap.Pixel(0, 10), coor: point//polygonOpt.path }) } if (!polygonOpt.key) { polygonOpt.key = this.newGuid(); } this.overlay[polygonOpt.key] = polygon; } gaodeMap.prototype.getMinLatPoint = function (points) { var point = {}; $.each(points, function (i, item) { if (item.getLat() < (point.lat || 999)) { point = item; } }) return point; } gaodeMap.prototype.addText = function (opt) { if (this.checkMap()) { return; } if (!opt.text) { console.error('添加文本标记失败,文本标记内容为空') return; } if (!opt.coor) { console.error('添加文本标记失败,文本标记坐标不确定') return; } var lnglat; if (opt.coor.length > 2) { lnglat = this.getCenterPoint(opt.coor); } else { lnglat = opt.coor; } var txt = new AMap.Text({ text: opt.text, offset: opt.offset || new AMap.Pixel(0, 0), map: this.map, position: lnglat }); txt.setStyle({ 'font-size': '10px' }); } /** * 画多边形 */ gaodeMap.prototype.drawPolygon = function (callback) { if (this.checkMap()) { return; } let that = this; let option = { strokeColor: "#008ad8", strokeWeight: 3, strokeOpacity: 0.4, fillColor: '#00b0ff', fillOpacity: 0.4, strokeStyle: 'solid' } that.mouseTool.close(); that.mouseTool = new AMap.MouseTool(that.map); that.map.clearMap(); that.mouseTool.polygon(option) // 无法移除 // that.mouseTool.off('draw'); that.mouseTool.on('draw', function (event) { event.obj.getPath() callback && callback(event.obj.getPath()) that.editPolygon({ paths: event.obj.getPath(), callback }) }); } /** * 编辑多边形 */ gaodeMap.prototype.editPolygon = function (option) { if (this.checkMap()) { return; } let that = this; that.map.clearMap(); let polygon = new AMap.Polygon({ path: option.paths, isOutline: true, strokeColor: "#008ad8", strokeWeight: 3, strokeOpacity: 0.4, fillColor: '#00b0ff', fillOpacity: 0.4, strokeStyle: 'solid', map: that.map }) let polyEditor = new AMap.PolyEditor(that.map, polygon);//创建多边形编辑器 polyEditor.open(); polyEditor.on('adjust', function (e) { option.callback && option.callback(polygon.getPath()) }) polyEditor.open(); //打开圆形编辑器 that.map.setFitView(); } /* * @method * @desc 获取中心坐标 */ gaodeMap.prototype.getCenterPoint = function (coor) { if (this.checkMap()) { return; } if (coor) { var total = coor.length; var lat = 0, lng = 0; $.each(coor, function (i, item) { lat += (item.getLat() || item.lat) * Math.PI / 180; lng += (item.getLng() || item.lng) * Math.PI / 180; }) lat /= total; lng /= total; return new AMap.LngLat(lng * 180 / Math.PI, lat * 180 / Math.PI); } } gaodeMap.prototype.massMarks = undefined; /* * @method * @desc 设置海量点 */ gaodeMap.prototype.setMassMarkers = function (opt) { if (this.checkMap()) { return; } if (!opt) { return; } if (!opt.data) { return; } // 示例数据 // {"lnglat":[116.258446,37.686622],"name":"景县","style":2} this.map.clearMap(); if (!this.massMarks) { this.massMarks = new AMap.MassMarks( opt.data, { //map: this.map, opacity: 0.9, zIndex: 99999, alwaysRender: opt.alwaysRender || false,//是否在地图缩放时重绘 style: [{ anchor: new AMap.Pixel(0, 0), url: '/images/green.png', size: new AMap.Size(20, 20) }, { anchor: new AMap.Pixel(0, 0), url: '/images/red.png', size: new AMap.Size(20, 20) }] }) } else { this.massMarks.setData(opt.data) } this.massMarks.setMap(this.map); var marker = new AMap.Marker({ content: ' ', map: this.map }); this.massMarks.on('mouseover', function (e) { marker.setPosition(e.data.lnglat); marker.setLabel({ content: e.data.name }) }); this.massMarks.on('mouseout', function (e) { marker.setLabel({ content: "" }) }); this.map.setZoom(5); this.map.setCenter([102.342785, 35.312316]) } /* * @method * @desc 清除海量点 */ gaodeMap.prototype.clearMassMarkers = function () { if (this.checkMap()) { return; } if (this.massMarks) { this.massMarks.clear(); } this.map.clearMap(); } /* * @method * @desc 添加行政范围 */ gaodeMap.prototype.addAreaRang = function (opt) { if (this.checkMap()) { return; } var _map = this.map; var that = this; (new AMap.Geocoder()).getAddress(opt.lnglat, function (status, result) { console.log(JSON.stringify(result)) if (status === 'complete' && result.regeocode) { // 获取区域编码 var adcode = result.regeocode.addressComponent.adcode; // 设置显示范围 new AMap.DistrictSearch({ extensions: 'all', subdistrict: 0 }).search(adcode, function (status, result) { // 外多边形坐标数组和内多边形坐标数组 var outer = [ new AMap.LngLat(-360, 90, true), new AMap.LngLat(-360, -90, true), new AMap.LngLat(360, -90, true), new AMap.LngLat(360, 90, true), ]; var holes = result.districtList[0].boundaries var pathArray = [ outer ]; var centerPoint = that.getCenterPoint(holes[0]) pathArray.push.apply(pathArray, holes); var polygon = new AMap.Polygon({ pathL: pathArray, strokeColor: '#000000', strokeWeight: 1, fillColor: '#000000', fillOpacity: 0.9 }); polygon.setPath(pathArray); _map.add(polygon) //_map.panTo(opt.lnglat); _map.panTo(centerPoint) _map.setZoom(opt.zoom || 12); }) } else { console.log('经纬度查询失败') } }); } gaodeMap.prototype.mapClick; /** * 绑定地图点击 * @param {boolean} opt.isclearMap 是否清除地图 * @param {string} opt.key 清除指定key的覆盖物 * @param {Function} opt.callback 点击回调 */ gaodeMap.prototype.bindMapClick = function (opt) { if (this.checkMap()) { return; } let that = this; let _map = this.map; if (!that.mapClick) { that.mapClick = function (e) { if (opt.isclearMap) { if (opt.key) { that.clearMarker(opt.key); } else { that.clearMarkers(); } } let address; (new AMap.Geocoder()).getAddress(e.lnglat, function (status, result) { if (status === 'complete' && result.regeocode) { address = { address: result.regeocode.formattedAddress, //lnglat: e.lnglat lng: e.lnglat.getLng(), lat: e.lnglat.getLat() } if (typeof opt.callback === 'function') { opt.callback(e, address); } } }); } } _map.on('click', that.mapClick); } gaodeMap.prototype.cancleMapClick = function () { if (this.checkMap()) { return; } let _map = this.map; _map.off('click', this.mapClick); //this.map.clearEvents('click'); } /* * @method * @desc 绑定地图搜索 */ gaodeMap.prototype.bindSearch = function (opt) { if (this.checkMap()) { return; } let _map = this.map; if (opt.isclearMap) { this.clearMarkers(); } let auto = new AMap.Autocomplete({ input: opt.inputID || "tipinput" }); let placeSearch = new AMap.PlaceSearch({ map: _map }); AMap.event.addListener(auto, "select", select); function select(e) { //placeSearch.setCity(e.poi.adcode); placeSearch.search(e.poi.name, function (status, result) { // 查询成功时,result即对应匹配的POI信息 let pois = result.poiList.pois; let address; //return false; if (pois.length > 0) { (new AMap.Geocoder()).getAddress(pois[0].location, function (status, result) { if (status === 'complete' && result.regeocode) { address = { address: result.regeocode.formattedAddress, //lnglat: pois[0].location lng: pois[0].location.lng, lat: pois[0].location.lat } if (typeof opt.success === 'function') { opt.success(address); } } }); } }) } } /* * @method * @desc 获取地址 */ gaodeMap.prototype.getAddress = function (lnglat, callback) { if (this.checkMap()) { return; } (new AMap.Geocoder()).getAddress(lnglat, function (status, result) { if (status === 'complete' && result.regeocode) { callback && callback(result.regeocode.formattedAddress); } }) } exports('gdmap', new gaodeMap()); })