HTML5 Geolocation地理定位

30 Aug

如今地理定位技术已经随处可见了,发微博都能显示当前位置更别提汽车导航了。本篇就简介一下HTML5中的地理定位技术。

生活中常见的定位方式有:GPS,IP地址,Wi-fi(多个Wifi接入点进行三角定位),蜂窝电话(基站越多越精确)。浏览器可能首选蜂窝电话三角定位,会得到个大致的位置,然后再用Wi-fi或GPS精确定位。一段简单的获取位置经纬度的代码:

先在HTML端导入Google API:

<script src="http://maps.google.com/maps/api/js?sensor=false"></script>

然后在JavaScript端添加以下代码:

window.onload = function() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(
            displayLocation,     //获取位置信息成功后的回调函数
            displayError);       //获取位置信息失败后的回调函数
    }
    else {
        console.log("no geolocation support");
    }
}
  
function displayLocation(position) {
    var latitude = position.coords.latitude;  
    var longitude = position.coords.longitude;
    ...  //处理获取到的经纬度,如显示到页面上
}
  
function displayError(error) {
    var errorTypes = {
        0: "Unknown error",
        1: "Permission denied",
        2: "Position is not available",
        3: "Request timeout"
    };
    var errorMessage = errorTypes[error.code];
    if (error.code == 0 || error.code == 2) {
        errorMessage = errorMessage + " " + error.message;
    }
    var div = document.getElementById("location"); //页面上显示错误信息
    div.innerHTML = errorMessage;
}

如上述代码,位置信息保存在BOM对象navigator.geolocation中,通过getCurrentPosition方法来获取位置情报。位置情报保存在回调函数的参数中,能获取到经纬度海拔加速度等信息。详见HTML5Doctor

getCurrentPosition方法其实有3个参数,分别为successHandler,errorHandler,options,后2个是可选的。第三个参数options:

var positionOptions= {
    //默认不启用高精度
    enableHighAccuracy: false,

    //默认Infinity表示浏览器可以用任意时间来得到位置,超时会调用errorHandler
    timeout: Infinity,

    //位置的最大年龄,超过这个年龄,浏览器会重新定位
    //0表示每次调用getCurrentPosition都要重新定位
    maximumAge: 0
}

因此可以有以下几种常见的排列组合:

//如果浏览器有一个年龄小于10分钟的缓存位置,就用这个。如无给我新位置
{maximumAge: 600000}

//如果浏览器有一个年龄小于10分钟的缓存位置,就用这个。如无,在1秒内给我新位置
{timeout : 1000, maximumAge: 600000}

//给我缓存位置,无论年龄多大。如果没缓存就调用错误处理函数。总之不要给我新位置,我会离线使用
{timeout : 0, maximumAge: Infinity}

//给我全新的位置,随便浏览器花多长时间都行
{timeout: Infinity, maximumAge : 0}

除getCurrentPosition方法外还有watchPosition,clearWatch。

watchPosition方法和getCurrentPosition方法很像,但行为稍有不同,每次你位置变化时它会重复调用你的successHandle回调函数,直到你调用clearWatch为止。

获得了经纬度之后,可以调用Google API(如下)显示地图

常用的API:

地图:google.maps.Map

经纬度:google.maps.LatLng

大头钉:google.maps.Marker

信息窗:google.maps.InfoWindow

一段显示地图的JavaScript代码:

//将上面获取到的经纬度信息作为参数传入该自定义函数中
showMap(position.coords);
  
function showMap(coords) {
    var googleLatAndLong = new google.maps.LatLng(coords.latitude, coords.longitude);
    var mapOptions = {
        zoom: 10,                                 //缩放比例尺
        center: googleLatAndLong,                 //中心点(设为当前经纬度)
        mapTypeId: google.maps.MapTypeId.ROADMAP  //地图类型
    };

    //页面某div中显示该地图
    var mapDiv = document.getElementById("map");
    map = new google.maps.Map(mapDiv, mapOptions);
  
    var title = "Your Location";
    var content = "You are here: " + coords.latitude + ", " + coords.longitude;

    //加上大头钉
    addMarker(map, googleLatAndLong, title, content);
}

//自定义显示大头钉函数
function addMarker(map, latlong, title, content) {
    var markerOptions = {
        position: latlong,
        map: map,
        title: title,
        clickable: true
    };
    var marker = new google.maps.Marker(markerOptions);

    var infoWindowOptions = {
        content: content,
        position: latlong
    };

    //信息窗
    var infoWindow = new google.maps.InfoWindow(infoWindowOptions);

    //点击大头钉后显示信息窗
    google.maps.event.addListener(marker, 'click', function() {
        infoWindow.open(map);
    });
}

效果图:
点击大头钉会出现信息窗口哦 ^_^

geolocation

如果要计算两点之间距离的话,考虑到地球表面非平面,因此还需要参考距离计算公式,参考这里,常用在导航系统中计算两地距离时。

Leave a Reply

Your email address will not be published. Required fields are marked *