本文章是出行助手项目使用高德API的一些经验,见程序代码及注释,
详情请查看高德API
function createTrip() {
// 创建地图实例,创建的同时可以给地图设置中心点、级别、显示模式、自定义样式等属性:
map = new window.AMap.Map('map', { //构造一个地图对象,第一个参数中传入地图容器DIV的ID值,第二个参数是地图初始化参数对象,参数详情参看MapOptions列表。
resizeEnable: true, // 是否监控地图容器尺寸变化
// mapStyle: 'amap://styles/light', // 设置地图的显示样式
zoom: 11, // 初始化地图层级
// viewMode: '3D', // 地图模式
// pitch: 75, // 地图俯仰角度,有效范围 0 度- 83 度
center: [116.402831,39.91582] // 初始地图中心点,故宫
})
// 异步加载多个插件:AMap.plugin的第一个参数使用数组即可同时加载引入多个插件。
// 地图初始化加载的定位只能获取到城市级别信息,如果想获取到具体的位置就要借助浏览器定位。高德JS API提供了AMap.Geolocation插件来实现定位
// 组合了旋转、倾斜、复位、缩放在内的地图控件
map.plugin(['AMap.Geolocation', 'AMap.ControlBar'], function () {
var geolocation = new window.AMap.Geolocation({
enableHighAccuracy: true, // 是否使用高精度定位,默认:true
timeout: 10000, // 超过10秒后停止定位,默认:5s
buttonPosition: 'LT', // 定位按钮的停靠位置
buttonDom: buttonDom, //定位按钮dom节点
buttonOffset: new window.AMap.Pixel(100, 20), // 定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
zoomToAccuracy: true // 定位成功后是否自动调整地图视野到定位点
})
// 定位插件
map.addControl(geolocation)// 在图面添加定位控件,用来获取和展示用户主机所在的经纬度位置
/*获取用户当前的精确位置信息
当回调函数中的status为complete的时候表示定位成功,result为GeolocationResult对象;
当回调函数中的status为error的时候表示定位失败,result为GeolocationError对象; 调用此方法可实现打开页面自动定位,如不调用此方法可实现点击位置触发后定位。
callback的方式和事件监听的方式二者选择一种即可。*/
geolocation.getCurrentPosition(function (status, result) {})
AMap.event.addListener(geolocation, 'complete', localOnComplete) // 返回定位信息
AMap.event.addListener(geolocation, 'error', localOnError) // 返回定位出错信息
// 罗盘插件
map.addControl(new window.AMap.ControlBar())
})
map.on('complete', function () {
// 地图图块加载完成后触发
console.log('地图加载完成')
})
}
geolocationData = []; //是坐标集合,项目中在Vue组件的data中,本博客为代码完整性将其单独拿出。
watchMap();
function watchMap () {
let that = this;
if(navigator.geolocation){
//watchPosition()方法:用于注册监听器,不停的获取和更新用户的地理位置信息,执行间隔时间0ms;当设备地理位置发生改变时,自动调用,会返回一个ID值
// clearWatch(唯一标识)方法:要停止定位时清除watchPosition()。
watchID = navigator.geolocation.watchPosition(
function (position) {
//得到H5经纬度
let gps = [position.coords.longitude, position.coords.latitude]
console.log('实时定位中:'+':gps');
// geolocationData是坐标集合
let p1 = (that.geolocationData.length > 0) ? that.geolocationData[that.geolocationData.length - 1].toString(): ''
let p2 = gps.toString()
if (p1 === p2) {
console.log('定位距离过近')
} else {
// 存放轨迹经纬度坐标,经纬度坐标转换(H5坐标转高德坐标)
window.AMap.convertFrom(gps, 'gps', function (status, result) {
if (result.info === 'ok') { //info 成功状态
// result.locations返回高德坐标集合
let tmpGps = [result.locations[0].Q, result.locations[0].P]
that.geolocationData.push(tmpGps) //将获取到的所有实时位置放入坐标集合,之后绘制路线使用。
// that.mapLoactionDistance(that.geolocationData) //经纬度路程转换为公里数
} else {
console.log('轨迹路径经纬度转换失败')
}
})
}
},
function () {
console.log('实时定位出错,请尝试刷新')
that.mapOnDelete()
}
)
}else{ console.log('不支持GPS定位'); }
}
mapPath () {
let that = this
let lineArr = geolocationData.slice()
//构造一个点标记对象,通过MarkerOptions设置点标记对象的属性
let marker = new AMap.Marker({
map: that.map,
position: lineArr[0], //经纬度对象,也可以是经纬度构成的一维数组[116.39, 39.9],基点位置
icon: 'https://webapi.amap.com/images/car.png',
offset: new window.AMap.Pixel(-26, -13), //相对于基点的偏移位置
autoRotation: true,//是否自动旋转。点标记在使用moveAlong动画时,路径方向若有变化,点标记是否自动调整角度,默认为false。广泛用于自动调节车辆行驶方向。
//IE8以下不支持旋转,autoRotation属性无效
// 旋转的是icon,不是地图
angle: -90
// 点标记的旋转角度,广泛用于改变车辆行驶方向
// 注:angle属性是使用CSS3来实现的,支持IE9及以上版本
})
// 绘制轨迹
// 构造折线对象,通过PolylineOptions指定折线样式
let polyline = new window.AMap.Polyline({ //路线
map: that.map,
path: lineArr,//坐标点
showDir: true,//是否延路径显示白色方向箭头,默认false。Canvas绘制时有效,建议折线宽度大于6时使用;在3D视图下不支持显示方向箭头(自V1.4.0版本参数效果变更)
strokeColor: '#28F', // 线颜色
// strokeOpacity: 1, //线透明度
strokeWeight: 6 // 线宽
// strokeStyle: "solid" //线样式
})
let passedPolyline = new window.AMap.Polyline({ //标记点车走过绘制的线条
map: that.map,
// path: lineArr,
strokeColor: 'red', // 线颜色
// strokeOpacity: 1, //线透明度
strokeWeight: 6 // 线宽
// strokeStyle: "solid" //线样式
})
marker.on('moving', function (e) { //点标记在执行moveTo,moveAlong动画时触发事件
passedPolyline.setPath(e.passedPath)
})
that.map.setFitView()//根据地图上添加的覆盖物分布情况,自动缩放地图到合适的视野级别,参数均可缺省。
// overlayList为覆盖物数组,缺省时为当前地图上添加的所有覆盖物图层,
//immediately代表是否需要动画过程,avoid代表上下左右的像素避让宽度,maxZoom代表fitView之后的最大级别
marker.moveAlong(lineArr, 200) //以指定的速度,点标记沿指定的路径移动。参数path为轨迹路径的经纬度对象的数组;speed为指定速度,单位:千米/小时;
//回调函数f为变化曲线函数,缺省为function(k){return k};参数circlable表明是否循环执行动画,默认为false
}
searchKey (keyword) {
// Toast.loading('正在搜索...')
this.ToastHide('正在搜索...')
let that = this
// AMap.Autocomplete根据输入关键字提示匹配信息,可将Poi类型和城市作为输入提示的限制条件。用户可以通过自定义回调函数取回并显示查询结果。若服务请求失败,系统将返回错误信息。最多支持10条建议,不可翻页。
this.trafficMap.plugin('AMap.Autocomplete', function () {
// 实例化Autocomplete
var autoOptions = {
// city 限定城市,默认全国
city: '全国'
}
// 构造函数,提供输入提示功能
var autoComplete = new window.AMap.Autocomplete(autoOptions)
/* 根据输入关键字提示匹配信息,支持中文、拼音
当status为complete时,result为AutocompleteResult;
当status为error时,result为错误信息info;
当status为no_data时,代表检索返回0结果
*/
autoComplete.search(keyword, function (status, result) {
Toast.hide()
// 搜索成功时,result即是对应的匹配数据
console.log(status, result)
if (status !== 'complete') {
that.searchResult = []
return
}
if (result.info !== 'OK') {
that.searchResult = []
return
}
// searchResult 为存储查询关键字结果的数组
that.searchResult = result.tips
})
})
}