最近在做一个基于MineMap的地图类小项目,
这里就一个当前位置定位功能做一下记录。
MineMap在网上的技术文章不是很多,遇到一些问题也没办法参考别人的经验,官方文档里面,它没有百度地图,高德地图,腾讯地图那么成熟,一些api没有提供,只能靠自己去写或者其他方案代替。
1.开始是期望借助浏览器自身提供的geolocation
HTML5 Geolocation(地理定位)HTML5 Geolocation(地理定位)用于定位用户的位置。定位用户的位置HTML5 Geolocation API 用于获得用户的地理位置。鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的。浏览器支持Internet Explorer 9+, Firefox, Chrome, Safari 和 Opera 支持Geolocation(地理定位).注意: Geolocation(地理定位)对于拥有 GPS 的设备,比如 iPhone,地理定位更加精确。
这里是代码部分:
//判断浏览器是否支持geolocation
if(navigator.geolocation){
// getCurrentPosition支持三个参数
// getSuccess是执行成功的回调函数
// getError是失败的回调函数
// getOptions是一个对象,用于设置getCurrentPosition的参数
// 后两个不是必要参数
var getOptions = {
//是否使用高精度设备,如GPS。默认是true
enableHighAccuracy:true,
//超时时间,单位毫秒,默认为0
timeout:5000,
//使用设置时间内的缓存数据,单位毫秒
//默认为0,即始终请求新数据
//如设为Infinity,则始终使用缓存数据
maximumAge:0
};
navigator.geolocation.getCurrentPosition(getSuccess, getError, getOptions);
//成功回调
function getSuccess(position){
// getCurrentPosition执行成功后,会把getSuccess传一个position对象
// position有两个属性,coords和timeStamp
// timeStamp表示地理数据创建的时间??????
// coords是一个对象,包含了地理位置数据
console.log(position.timeStamp);
// 估算的纬度
console.log(position.coords.latitude);
// 估算的经度
console.log(position.coords.longitude);
// 估算的高度 (以米为单位的海拔值)
console.log(position.coords.altitude);
// 所得经度和纬度的估算精度,以米为单位
console.log(position.coords.accuracy);
// 所得高度的估算精度,以米为单位
console.log(position.coords.altitudeAccuracy);
// 宿主设备的当前移动方向,以度为单位,相对于正北方向顺时针方向计算
console.log(position.coords.heading);
// 设备的当前对地速度,以米/秒为单位
console.log(position.coords.speed);
// 除上述结果外,Firefox还提供了另外一个属性address
if(position.address){
//通过address,可以获得国家、省份、城市
console.log(position.address.country);
console.log(position.address.province);
console.log(position.address.city);
}
}
//失败回调
function getError(error){
// 执行失败的回调函数,会接受一个error对象作为参数
// error拥有一个code属性和三个常量属性TIMEOUT、PERMISSION_DENIED、POSITION_UNAVAILABLE
// 执行失败时,code属性会指向三个常量中的一个,从而指明错误原因
switch(error.code){
case error.TIMEOUT:
console.log('超时');
break;
case error.PERMISSION_DENIED:
console.log('用户拒绝提供地理位置');
break;
case error.POSITION_UNAVAILABLE:
console.log('地理位置不可用');
break;
default:
break;
}
}
// watchPosition方法一样可以设置三个参数
// 使用方法和getCurrentPosition方法一致,只是执行效果不同。
// getCurrentPosition只执行一次
// watchPosition只要设备位置发生变化,就会执行
var watcher_id = navigator.geolocation.watchPosition(getSuccess, getError, getOptions);
//clearwatch用于终止watchPosition方法
clearWatch(watcher_id);
}
在实际运行时,chrome浏览器返回失败,超时等问题,导致无法成功定位,就算增加超时时长也无法解决。
查阅资料后,有观点说将项目升级成https协议,在换成https后仍然失败。
2.由于MineMap官方并没有提供定位的api,曲线救国采取了腾讯地图的成熟api。众所周知,定位的核心就是获取当前位置的经纬度,MineMap没有办法只好求助他人,获取了需要的结果,在利用MineMap的跳转map.flyTo(),实现一个“伪定位”。
这里是代码部分:
var geolocation = new qq.maps.Geolocation("DLVBZ-7BM3K-SMPJU-A42NB-7N4AZ-RSF62", "szcx");
var options = {timeout: 8000};
geolocation.getLocation(showPosition, showErr, options);
function showPosition(position) {
console.log("定位成功")
var lat = position.lat;
var lng = position.lng;
map.flyTo({
center: [lng, lat],
zoom: 11
});
};
function showErr() {
layer.msg('定位失败!')
}