✏️
ougege
  • README
  • Docs
    • index
    • Articles
      • AI
        • 体验Chrome AI
        • 体验Cloudflare Workers AI
        • 体验deepseek
      • CSS
        • CSS优化-PurgeCSS
        • 实用效果
        • 开发常用样式
      • Deepin
        • deepin20安装mysql
        • deepin使用tensorflow入门机器学习
        • deepin安装cuda和cuDNN
        • deepin安装lamp
        • deepin安装nvidia驱动
        • deepin安装oh my Zsh
        • deepin安装p7zip
        • deepin换源
        • 安装deepin系统后要做的事
      • Docker
        • CI/CD搭建配置
        • deepin搭建docker环境
        • docker安装和使用gitlab
        • docker搭建nginx+php环境
      • Essay
        • IOS申请邓白氏编码
        • Markdown-Mermaid
        • Markdown Use
        • webview白屏的问题查找和修复
        • 前端开发对接问题和解决办法汇总
        • 国务院机构改革方案
        • 国家级智库
        • 实用网站推荐
        • 常用Markdown数学公式语法
        • 强烈推荐前端要安装的vscode扩展
        • 新建销售计划-页面卡死问题分析
        • 海淘入坑手册
        • 竞品研究
        • 足球知识速成
      • Git
        • GitBook安装和常用命令
        • GitKraken免费版本
        • Git安装和配置
        • Git异常处理
        • Git Worktree使用
        • 前端工程化相关的实用git命令
      • JS
        • ESM模块导出方式对比
        • Emoji多端统一处理
        • JS发布订阅模式
        • JS性能优化
        • JS标准内置对象
        • JS链式调用原理
        • Promise介绍和使用
        • Range的使用
        • Vue+Oauth登录实现
        • Vue实现富文本插入Emoji
        • chrome扩展入门
        • es5新特性
        • es6常用特性
        • es常用片段
        • uniapp使用eslint校验代码
        • 与移动端通信
        • 优秀js库moment
        • 使用vue-socketio
        • 实现一个中间件
        • 小程序webview调试
        • 常用snippets
        • 常用正则
        • 常用的设计模式
        • 微信jssdk封装使用
        • 浏览器宏任务和微任务
        • 浏览器的5种Observer
        • 深入理解赋值、浅拷贝、深拷贝
        • 解析vue指令clickoutside源码
        • 键盘事件与KeyBoardWrapper交互
        • 高德地图常用方法封装
        • 高阶函数片段
      • Network
        • 使用Lighthouse分析前端性能
        • 前后端启用https
        • 宝塔nginx安装ngx_brotli
        • 比较gz与br加载速度
        • 浏览器https提示不安全
        • 浏览器提示HSTS
        • 简单使用tcpdump
        • 静态资源gzip优化
      • Node
        • CommonJS模块导出方式对比
        • Taro command not found 多平台解决方案
        • koa使用和API实现
        • node安装报错Unexpected-token
        • 使用nvm和nrm
        • 使用uniapp给小程序添加云函数
        • 使用verdaccio搭建本地npm仓库
        • 使用vue-cli搭建vue项目
        • 安装Node.js和npm配置
        • 编译成cjs和mjs的思路解析
        • 让你的npmPackage同时支持cjs和mjs
        • 通过GithubAction将内容部署到vps
      • Python
        • Python源管理
        • Python版本管理
        • mitmproxy抓包
        • 微信公众平台开发爬坑经历
      • Shell
        • Ubuntu安装deepin桌面环境
        • Ubuntu安装flatpak软件
        • Ubuntu安装wireshark
        • Ubuntu常见问题汇总
        • dell G3装系统无法识别第二块硬盘
        • linux下virtualbox用gho还原系统
        • mysql常用命令
        • navicat连接一键集成环境的mysql
        • nginx常用命令
        • pm2常用命令
        • virtualbox虚拟机和宿主机互相复制粘贴
        • vps内资源通过mega快传到本地
        • vps报错temporary failure in name resolution
        • vscode修改文件监控数
        • windows+linux双系统引导修复
        • zsh常用插件和命令
        • 一键搭建ChatGPT web版
        • 使用V2ray,CloudFlare Warp解锁GPT
        • 使用vscode进行java开发
        • 利用zx和SSHKey发布代码到服务器
        • 反爬虫一些方案总结和尝试
        • 安装1Panel
        • 安装Bt面板
        • 安装Ubuntu22.04后要做的事
        • 无显示器linux设置默认分辨率
        • 特别实用的shell命令
        • 解决linux安装xmind缺少依赖报错
      • Standards
        • CSS格式化之stylelint
        • CSS规范
        • HTML规范
        • JS规范
        • commit规范
        • 使用husky+commitlint规范代码提交
        • 使用semantic-release自动管理版本号
        • 命名规范
        • 图片规范
        • 版本编号规范
      • Wall
        • 科学上网-Cloudflare-Pages
        • 科学上网-Cloudflare-Warp
        • 科学上网-Geph
        • 科学上网-RackNerd
        • 科学上网-Slicehosting
        • 科学上网-Surfshark
        • 科学上网-Tor
        • 科学上网-XX-NET
        • 科学上网-heroku
        • 科学上网-shadowsock
        • 科学上网-v2ray使用
        • 科学上网-v2ray搭建
        • 科学上网-浏览器代理
        • 科学上网-让终端走代理
      • Windows
        • SourceTree破解免登录(windows版)
        • git bash交互提示符不工作
        • nexus 7 2013 wifi 刷机
        • tree命令生成文件目录
        • 利用charles抓包app
        • 安装Openssl
        • 安装msi文件报错2503和2502
        • 神器vimium使用说明
        • 自用host
        • 解决win10扩展出来的屏幕模糊
        • 解决安装Adobe Air时发生错误
    • Snippets
      • zsh
        • docker
        • extract
        • git-commit
        • git
        • mysql-macports
        • npm
        • nvm
        • pip
        • pm2
        • systemd
        • ubuntu
        • vscode
Powered by GitBook
On this page
  • 动态创建高德脚本
  • 封装高德常用的方法
  • 参考

Was this helpful?

  1. Docs
  2. Articles
  3. JS

高德地图常用方法封装

在开发中,经常用到高德地图,于是总结了一些常用的方法进行封装

动态创建高德脚本

创建 createAMap.js

import { config } from '../config'
import Bus from '../eventBus.js'
class CreateAMap {
	constructor() {
		this.init()
	}
	init () {
		window.initAMap = () => {
			Bus.$emit('AMapIsExist', null)
		}
		let plugins = 'AMap.Driving,AMap.Geocoder,AMap.Walking,AMap.Riding,AMap.Transfer,AMap.Geolocation'
		let script = document.createElement('script')
		script.type = 'text/javascript'
		script.async = true
		script.src = `https://webapi.amap.com/maps?v=1.4.15&callback=initAMap&key=${config.amapKey}&plugin=${plugins}`
		// script.onerror = reject
		document.head.appendChild(script)
	}
}
let createAMap = new CreateAMap()
export { createAMap }

在 vue 页面使用

import Bus from '../../common/eventBus.js'
import { createAMap } from '../../common/AMap/create'

// 在mounted里try catch
try {
  if (AMap) {
    this.amapLoad()
  }
} catch {
  Bus.$on('AMapIsExist', this.amapLoad)
}

封装高德常用的方法

amap.js 如下:

/**
 * @Description: 进一步封装高德常用的方法
 * @Author: MuYi086
 * @Email: 1258947325@qq.com
 * @Blog: https://github.com/MuYi086/blog
 */
class AMAP {
  constructor () {
    this.init()
  }
  init () {
		// 绑定div对象
		let containerId = 'gd-container'
		// 获取最新map对象
		this.newMap = (center) => {
			if (center) {
				return new AMap.Map(containerId, {
					resizeEnable: true,
					center: center, // 地图中心点
					zoom: 13
				})				
			} else {
				return new AMap.Map(containerId, {
					resizeEnable: true,
					zoom: 13
				})	
			}
    }
		/**
		 * 定位
		 * params: {success: '成功回调', fail: '失败回调'}
		 */
		this.location = (success, fail) => {
			var map = this.newMap()
			var geolocation = AMap.Geolocation({	
				enableHighAccuracy: true,//是否使用高精度定位,默认:true
				timeout: 200,          //超过10秒后停止定位,默认:无穷大
				maximumAge: 0,           //定位结果缓存0毫秒,默认:0
				convert: true,           //自动偏移坐标,偏移后的坐标为高德坐标,默认:true
				showButton: true,        //显示定位按钮,默认:true
				buttonPosition: 'RB',    //定位按钮停靠位置,默认:'LB',左下角
				buttonOffset: new AMap.Pixel(10, 120),//定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
				showMarker: true,        //定位成功后在定位到的位置显示点标记,默认:true
				showCircle: true,        //定位成功后用圆圈表示定位精度范围,默认:true
				panToLocation: true,     //定位成功后将定位到的位置作为地图中心点,默认:true
				zoomToAccuracy: true      //定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
			})
			map.addControl(geolocation)
			geolocation.getCurrentPosition(function(status, result){
				if (status == 'complete'){
					success(result)
				} else {
					fail(result)
				}
			})
		}
		/**
		 * 路径导航:汽车
		 * params: {center: '中心坐标', startLngLat: '开始坐标', endLngLat: '结束坐标', success: '成功回调', fail: '失败回调'}
		 */
		this.carPathNavigation = (center, startLngLat, endLngLat, success, fail) => {
			var map = this.newMap(center)
			var driving = new AMap.Driving({
				map: map
			})
			driving.search(new AMap.LngLat(startLngLat[0], startLngLat[1]), new AMap.LngLat(endLngLat[0], endLngLat[1]), function(status, result) {
				// result 即是对应的驾车导航信息,相关数据结构文档请参考  https://lbs.amap.com/api/javascript-api/reference/route-search#m_DrivingResult
				if (status === 'complete') {
					success(result)
				} else {
					fail(result)
				}
			})
		}
		/**
		 * 路径导航:步行
		 * params: {center: '中心坐标', startLngLat: '开始坐标', endLngLat: '结束坐标', success: '成功回调', fail: '失败回调'}
		 */
		this.walkPathNavigation = (center, startLngLat, endLngLat, success, fail) => {
			var map = this.newMap(center)
			var walking = new AMap.Walking({
				map: map
			})
			walking.search(startLngLat, endLngLat, function(status, result) {
				if (status === 'complete') {
					success(result)
				} else {
					fail(result)
				}
			})
		}
		/**
		 * 路径导航:骑行
		 * params: {center: '中心坐标', startLngLat: '开始坐标', endLngLat: '结束坐标', success: '成功回调', fail: '失败回调'}
		 */
		this.bikePathNavigation = (center, startLngLat, endLngLat, success, fail) => {
			var map = this.newMap(center)
			var riding = new AMap.Riding({
				map: map
			})
			riding.search(startLngLat, endLngLat, function(status, result) {
				if (status === 'complete') {
					success(result)
				} else {
					fail(result)
				}
			})
		}
		/**
		 * 路径导航:公交
		 * params: {center: '中心坐标', startLngLat: '开始坐标', endLngLat: '结束坐标', success: '成功回调', fail: '失败回调'}
		 */
		this.bikePathNavigation = (center, startLngLat, endLngLat, success, fail) => {
			this.parseCoordinate(center, (res) => {
				// 坐标解析出城市
				let city = res.regeocode.addressComponent.city
				var map = this.newMap(center)
				var transOptions = {
					map: map,
					city: city,
					policy: AMap.TransferPolicy.LEAST_TIME
				}
				transfer.search(new AMap.LngLat(startLngLat[0], startLngLat[1]), new AMap.LngLat(endLngLat[0], endLngLat[1]), function(status, result) {
					if (status === 'complete') {
						success(result)
					} else {
						fail(result)
					}
				})
			}, (err) => {
				console.log(err)
			})
		}
		/**
		 * 坐标=>地址
		 * params: {center: '中心坐标', success: '成功回调', fail: '失败回调'}
		 */
		this.parseCoordinate = (center, success, fail) => {
			var geocoder = new AMap.Geocoder({
				city: "010", //城市设为北京,默认:“全国”
				radius: 1000 //范围,默认:500
			})
			geocoder.getAddress(center, function(status, result) {
				if (status === 'complete' && result.regeocode) {
					success(result)
				} else{
					fail(result)
				}
			})
		}
		/**
		 * 地址=>坐标
		 * params: {address: '地址', success: '成功回调', fail: '失败回调'}
		 */
		this.parseAddress = (address, success, fail) => {
			var geocoder = new AMap.Geocoder({
				// city: "010", //城市设为北京,默认:“全国”
			})
			geocoder.getLocation(address, function(status, result) {
				if (status === 'complete' && result.geocodes.length) {
					// var lnglat = result.geocodes[0].location
					success(result)
				} else{
					fail(result)
					// log.error('根据地址查询位置失败')
				}
			})
		}
		/**
		 * 自定义信息窗体
		 * params: {lnglats: 坐标数组, success: '成功回调', fail: '失败回调'}
		 */
		this.renderInfoWindow = (lnglats) => {
			let map = this.newMap()
			var infoWindow = new AMap.InfoWindow({offset: new AMap.Pixel(0, -30)})
			for (var i = 0, marker; i < lnglats.length; i++) {
				var marker = new AMap.Marker({
					position: lnglats[i],
					map: map
				})
				marker.content = '我是第' + (i + 1) + '个Marker'
				marker.on('click', markerClick)
				marker.emit('click', {target: marker})
			}
			function markerClick(e) {
				infoWindow.setContent(e.target.content)
				infoWindow.open(map, e.target.getPosition())
			}
			map.setFitView()
		}
		/**
		 * 自定义marker
		 * params: {lnglats: 坐标数组, type: 'clockPoint或luckyBall', contentArr: 'marker内容'}
		 */
		this.modifyMarker = (center, lnglats, type = 'clockPoint', contentArr, success) => {
			let map = this.newMap(center)
			let markers = []
			let index = 0
			for (let i = 0; i < lnglats.length; i++) {
				let marker =  new AMap.Marker({
					position: lnglats[i],
					content: contentArr[i],
					// 以 icon 的 [center bottom] 为原点
					offset: new AMap.Pixel(-13, -30)
				})
				// 如果type是缘分球
				if (type === 'luckyBall') {
					if (i < lnglats.length - 1) {
						marker.on('click', function () {
							// 导航时传出当前坐标
							success(lnglats[i], 'pathTrans')
						})					
					}
				} else { // 如果type是打卡点
					if (i < lnglats.length - 1) {
						marker.on('click', function () {
							success(lnglats[i], 'detail')
						})					
					}
					if (i === lnglats.length - 1) {
						marker.on('click', function () {
							// 导航时传出当前坐标
							success(lnglats[i - 1], 'pathTrans')
						})					
					}					
				}
				markers.push(marker)
			}
			map.add(markers)
			map.setFitView()
		}
		/**
		 * 自定义路径导航
		 * params: {lnglats: 坐标数组, content: 'marker内容'}
		 */
		this.modifyPathTo = (center, startLngLat, endLngLat, success, fail) => {
			var map = this.newMap(center)
			var drivingOption = {
				policy: AMap.DrivingPolicy.LEAST_TIME, // 其它policy参数请参考 https://lbs.amap.com/api/javascript-api/reference/route-search#m_DrivingPolicy
				ferry: 1, // 是否可以使用轮渡
				// province: '京', // 车牌省份的汉字缩写  
			}
			// 构造路线导航类
			var driving = new AMap.Driving(drivingOption)
			// 根据起终点经纬度规划驾车导航路线
			driving.search(new AMap.LngLat(startLngLat[0], startLngLat[1]), new AMap.LngLat(endLngLat[0], endLngLat[1]), function(status, result, map) {
				// result即是对应的驾车导航信息,相关数据结构文档请参考 https://lbs.amap.com/api/javascript-api/reference/route-search#m_DrivingResult
				if (status === 'complete') {
					if (result.routes && result.routes.length) {
						// 绘制第一条路线,也可以按需求绘制其它几条路线
						success(result.routes[0], map)
					}
				} else {
					fail(result)
				}
			})
		}
		/**
		 * 自定义窗体锚点
		 * params: {map: '当前map对象', center: '中心坐标', anchor: '展示位置:', content: '展示内容'}
		 * anchor: 左上'top-left'; 上中'top-center'; 右上'top-right'; 左中'middle-left'; 中'center'; 右中'middle-right'; 左下'bottom-left'; 下中'bottom-center'; 右下'bottom-right';
		 */
		this.modifyWindowMsg = (map, center, anchor, content) => {
			// let map = this.newMap(center)
			let infoWindow = new AMap.InfoWindow({
        anchor: anchor,
        content: content
			})
			infoWindow.open(map, center)
		}
	}
}

let amap = new AMAP()
export { amap }

amap 挂在 util 对象下,方便调用

import { amap } from './amap.js'

module.exports = {
  amap: amap
}

参考

Previous键盘事件与KeyBoardWrapper交互Next高阶函数片段

Last updated 11 months ago

Was this helpful?

快速上手