高德地图api @amap/amap-jsapi-loader封装成方法(定位、点标记、路径规划、搜索等) 适用于vue等框架

高德地图api 封装成公共方法用于项目中

目前封装的方法有

  • 定位
  • 点标记
  • 比例尺插件
  • 信息窗体
  • 经纬度附近搜索
  • 关键字搜索
  • 交通路径规划(经纬度或地点名)
  • 步行路径规划(经纬度或地点名)
  • 经纬度获取地址

入参建议改成对象形式,比较灵活

项目结构

高德地图api @amap/amap-jsapi-loader封装成方法(定位、点标记、路径规划、搜索等) 适用于vue等框架_第1张图片

1 主要文件作用
1.1、initMap.js 高德地图api的引入、及注册
import AMapLoader from '@amap/amap-jsapi-loader'
const initMap = async (config) => {
  return new Promise((resolve, reject) => {
    AMapLoader.load({
      "key": config.key,
      "version": "1.4.15",
      "plugins": [
        'AMap.PolygonEditor' // 插件
      ],
      "AMapUI": {
        "version": '1.1',
        "plugins": [],
      },
      "Loca": {
        "version": '1.3.2'
      },
    }).then((AMap) => {
      resolve(AMap)
    }).catch(err => {
      reject(err)
    })
  })
}
export default initMap
1.2 map.js 高德地图api封装方法集合
import initMap from './initMap.js'
export const init = (container, props) => {
  const config = {
    key: '你的key值'
  }
  return new Promise((resolve, reject) => {
    initMap(config).then(AMap => {
      resolve(new AMap.Map(container, { ...props }))
    }).catch(err => {
      reject(err)
    })
  })
}

/**
 * 
 * @method {*} getCurrentPosition 定位
 * @param {*} map 地图实例
 * @param {Function} success 定位成功的回调
 * @param {Function} fail 定位失败的回调
 * @param {Object} otherProps 其他参数,如有需要的话 具体api见https://lbs.amap.com/api/javascript-api/reference/location#m_AMap.Geolocation
 */
export const getCurrentPosition = (map, success, fail, otherProps) => {
  AMap.plugin('AMap.Geolocation', function() {
    var geolocation = new AMap.Geolocation({
      enableHighAccuracy: false,//是否使用高精度定位,默认:true
      timeout: 10000,        
      maximumAge: 0,           
      convert: true,          
      showButton: true,      
      buttonPosition: 'RB',  
      showMarker: true,     
      showCircle: true,   
      panToLocation: true, 
      zoomToAccuracy: false,  
      ...otherProps
    })
    map.addControl(geolocation);
    geolocation.getCurrentPosition()
    AMap.event.addListener(geolocation, 'complete', onComplete)
    AMap.event.addListener(geolocation, 'error', onError)
    function onComplete(data) {
      success(data)
    }
    function onError(err) {
      fail(err)
    }
  })
}

/**
 * @method {*} addMarker 添加点标记
 * @param {*} map 地图实例
 * @param {Array} marker 需要定位的点经纬度集合,结构如 [{ lng: 116.39, lat: 39.9 ,otherProps:{title:'广州'}}]
 * @param {Function} callback 点标记点击事件回调
 * @param {Object} otherProps 定位其他属性,止于marker对象数组里面 具体api见https://lbs.amap.com/api/javascript-api/reference/overlay#marker
 * @returns 点标记集合markers
 */
export const addMarker = (map, marker, callback) => {
  var markers = marker.map(e => {
    var mark = new AMap.Marker({
      position: [e.lng, e.lat],   // 经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9]
      ...e.otherProps
    });
    if (callback) mark.on('click', callback);
    return mark
  })
  map.add(markers);
  return markers
}
/**
 * @method {*} addMarker 移除点标记
 * @param {*} map 地图实例
 * @param {Array} marker 由addMarker返回的点标记集合
 */
export const removeMarker = (map, marker) => {
  map.remove(marker);
}
/**
 * @param {*} map 地图实例
 * @param {Boolean} noScale 不需要比例尺  true表示不需要
 * @param {Boolean} noToolBar 不需要工具栏 true表示不需要
 */
export const initScaleTools = (map, noScale, noToolBar) => {
  if (!noScale) {
    map.plugin(["AMap.Scale"], function() {
      var scale = new AMap.Scale();
      map.addControl(scale);
    });
  }
  if (!noToolBar) {
    map.plugin(["AMap.ToolBar"], function() {
      var tool = new AMap.ToolBar();
      map.addControl(tool);
    });
  }
}
/**
 * 信息窗体
 * @param {*} map 地图实例
 * @param {Array} center 经纬度
 * @param {String} content 信息窗体内容
 */
export const showInfoWindow = (map, center, content) => {
  var infoWindow = new AMap.InfoWindow({
    content: content
  });
  infoWindow.open(map, center);
}
/**
 * 
 * @param {*} map 地图实例
 * @param {Array} center 经纬度
 * @param {Number} radius 取值范围:0-50000 范围
 * @param {Object} otherProps  city 页码等其他参数
 * @param {Function} callback 回调
 * @param {String} keyword 搜索关键字
 * https://lbs.amap.com/api/javascript-api/reference/search#m_AMap.PlaceSearch
 */
export const searchNearBy = (map, center, callback, otherProps, keyword, radius) => {
  map.clearMap()
  AMap.plugin(['AMap.PlaceSearch'], function() {
    var placeSearch = new AMap.PlaceSearch({
      map: map,
      ...otherProps
    })
    placeSearch.searchNearBy(keyword || '', center, radius || 1000, callback)
  })
}

/**
 * @param {*} map 地图实例
 * @param {Function} callback 回调函数
 * @param {Object} otherProps 其他属性
 * @param {String} keyword 关键字
 * @author 曾 2021-07-09 [email protected]
 */
export const searchByKeyword = (map, callback, otherProps, keyword) => {
  map.clearMap()
  AMap.plugin(['AMap.PlaceSearch'], function() {
    var placeSearch = new AMap.PlaceSearch({
      map: map,
      ...otherProps,
    })
    placeSearch.search(keyword, callback)
  })
}
/**
 * 
 * @param {*} map 地图实例
 * @param {Number} startLngLat  起点经纬度
 * @param {Number} endLngLat 终点经纬度
 * @param {String} city 城市名 默认广州
 * @param {Function} callback 回调函数
 * @param {String} panel 容器id
 * @param {Boolean} isLngLat 是否经纬度查询,如传false 则为名称查询
 * @param {String} startName 起点名称 
 * @param {String} endName 终点名称 
 * @param {Object}  otherProps 构造函数其他参数,详见https://lbs.amap.com/api/javascript-api/reference/route-search#m_TransferResult
 */
export const transfer = (map, startLngLat, endLngLat, city, callback, panel, isLngLat = true, startName, endName, otherProps) => {
  AMap.plugin('AMap.Transfer', function() {
    var transOptions = {
      map,
      city: city || '广州市',
      panel: panel || 'panel',
      policy: AMap.TransferPolicy.LEAST_TIME,
      ...otherProps
    };
    var transfer = new AMap.Transfer(transOptions);
    if (isLngLat) {
      transfer.search(startLngLat, endLngLat, function(status, result) {
        callback && callback(status, result, transfer)
      })
    } else {
      transfer.search([{ keyword: startName }, { keyword: endName }], function(status, result) {
        callback && callback(status, result, transfer)
      })
    }
  })
}
/**
 * 
 * @param {*} map 地图实例
 * @param {Number} startLngLat 起点经纬度
 * @param {Number} endLngLat 终点经纬度
 * @param {String} city 城市
 * @param {Function} callback 回调函数
 * @param {String} panel 容器id
 * @param {Number} isLngLat 是否经纬度查询 默认是
 * @param {String} startName 当isLngLat传false时,为起点名称
 * @param {String} endName 当isLngLat传false时,为终点名称
 * @param {Object} otherProps 其他属性
 */
export const walking = (map, startLngLat, endLngLat, city, callback, panel, isLngLat = true, startName, endName, otherProps) => {
  AMap.plugin('AMap.Walking', function() {
    var transOptions = {
      map,
      city: city || '广州市',
      panel: panel || 'panel',
      ...otherProps
    };
    var warking = new AMap.Walking(transOptions);
    if (isLngLat) {
      warking.search(startLngLat, endLngLat, function(status, result) {
        callback && callback(status, result, warking)
      })
    } else {
      warking.search([{ keyword: startName }, { keyword: endName }], function(status, result) {
        callback && callback(status, result, warking)
      })
    }
  })
}
// 清除线路图
/**
 * 
 * @param {*} lineStrory AMap.Walking/transfer 创建的实例对象
 */
export const clearLine = (lineStrory) => {
  lineStrory.clear()
}
// 经纬度获取地址
/**
 * 
 * @param {String} LngLat 经纬度
 * @param {Function} callback 回调函数
 * @param {Object} otherProps 其他参数
 */
export const getAddressByLngLat = (LngLat, callback, otherProps) => {
  AMap.plugin('AMap.Geocoder', function() {
    var geocoder = new AMap.Geocoder({
      ...otherProps
    })

    geocoder.getAddress(LngLat, function(status, result) {
      callback(status, result)
    })
  })
}
const mapJS = {
  init,
  getCurrentPosition,
  addMarker,
  addMarker,
  initScaleTools,
  showInfoWindow,
  searchNearBy,
  searchByKeyword,
  transfer,
  walking,
  clearLine,
  getAddressByLngLat
}
export default mapJS
1.3 map.vue 地图实例页面 其他框架自行修改代码
// 方法引入
import { init, getCurrentPosition, addMarker, initScaleTools, removeMarker, transfer, walking, clearLine, searchByKeyword, searchNearBy, getAddressByLngLat } from "@/utils/map.js"
// 使用示例 
 const props = {
        zoom: 15
      }
 init('container', props).then(AMap => {
        _this.map = AMap
        _this.map.on('click', this.clickHandler); // 地图点击事件 可获取经纬度等信息
        getCurrentPosition(_this.map, (res) => {
          console.log(res);
          _this.addressComponent = res.addressComponent
          _this.center = [res.position.lng, res.position.lat]
          addMarker(_this.map, [{ lng: res.position.lng, lat: res.position.lat, otherProps: { title: '广州' } }], this.markerClick)
        }, (err) => {
          console.log(err, '--err');
        }, {})
      }).catch(err => {
        this.$message.error(err);
  })
另附上两个高德url api在这里插入图片描述
// 关键字搜索
window.open(`https://m.amap.com/search/view/keywords=${keywords}`)
// 出行路径规划
window.open(`https://gaode.com/dir?from[name]=起点&from[lnglat]=${'出发经度'},${'出发维度'}&to[name]=终点&to[lnglat]=${目标经度},${目标维度}&policy=1&type=car`)

你可能感兴趣的:(高德地图,vue,js,定位)