地理定位技术

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

生活中常见的定位方式有:GPSIP地址,Wi-fi(多个Wifi接入点进行三角定位),蜂窝电话(基站越多越精确)

浏览器可能首选蜂窝电话三角定位,会得到个大致的位置,然后再用Wi-fiGPS精确定位


一段简单的获取位置经纬度的代码:

先在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 {
		alert("Oops, 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 
方法来获取 
位置情报。 

位置情报保存在回调函数的参数,能获取到经纬度海拔加速度等信息。

详见:http://diveinto.html5doctor.com/geolocation.html

getCurrentPosition方法其实有3个参数,分别为successHandlererrorHandleroptions,后2个是可选的。

第三个参数options

var positionOptions= {
    enableHighAccuracy: false,  //默认不启用高精度
    timeout: Infinity,          //默认Infinity表示浏览器可以用任意时间来得到位置,超时会调用errorHandler回调函数
    maximumAge: 0               //位置的最大年龄,超过这个年龄,浏览器会重新定位,0表示每次调用getCurrentPosition都要重新定位
}

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

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

{maximumAge: 600000}             

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

{timeout : 1000, maximumAge: 600000} 

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

{timeout : 0, maximumAge: Infinity}  

//给我全新的位置,随便浏览器花多长时间都行   

{timeout: Infinity, maximumAge : 0}        


getCurrentPosition方法还有watchPositionclearWatch

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


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

https://developers.google.com/maps/documentation/javascript/reference

常用的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  //地图类型
	};
	var mapDiv = document.getElementById("map");      //页面某div中显示该地图
	map = new google.maps.Map(mapDiv, mapOptions);

	// add the user marker
	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);
	});
}

 效果图: 


点击大头钉会出现信息窗口哦 ^_^


如果要计算两点之间距离的话,考虑到地球表面非平面,因此还需要参考距离计算公式:

http://www.movable-type.co.uk/scripts/latlong.html

常用在导航系统中计算两地距离时


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值