1. 地理位置API介绍
地位位置(Geolocation) API是HTML5引入的一个非常诱人的API,它在移动web应用的开发中非常有价值。只需要几行很简单的代码即可实现获取用户的地位位置。目前浏览器对其支持情况如下图:
HTML5的地理位置API依次通过以下几个方式获取位置信息:1. IP地址,2. GPS定位,3. MAC地址,4. GSM基站网络,5. 用户定义的地址位置。如下图所示,优先级为逆时钟方向。
2. 使用地理位置API
地位位置(Geolocation) API使用非常方便,一个典型的判断浏览器是否支持HTML5 Geolocation API的函数:
01 |
function updateLocation(position) { |
03 |
var latitude = position.coords.latitude; |
05 |
var longitude = position.coords.longitude; |
08 |
if (!latitude || !longitude) { |
10 |
document.getElementById( "status" ).innerHTML = "HTML5 Geolocation is supported in your browser, but location is currently not available." ; |
17 |
document.getElementById( "latitude" ).innerHTML = latitude; |
19 |
document.getElementById( "longitude" ).innerHTML = longitude; |
在这段代码中,使用
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
这两个变量来保存经度和纬度,并将其返回给HTML代码,本例的其余代码如下所示:
05 |
<meta charset= "utf-8" > |
07 |
<title>HTML5 Geolocation</title> |
09 |
<link rel= "stylesheet" href= "styles.css" > |
14 |
<body onload= "loadDemo()" > |
17 |
<h1>HTML5 Geolocation Example</h1> |
22 |
<p id= "status" >HTML5 Geolocation is <strong>not</strong> supported in your browser.</p> |
27 |
<h2>Current Position:</h2> |
33 |
<th width= "40" scope= "col" ><h5 align= "left" >Lat.</h5></th> |
35 |
<td width= "114" id= "latitude" >?</td> |
41 |
<td><h5>Long.</h5></td> |
43 |
<td id= "longitude" >?</td> |
49 |
<td><h5>Time</h5></td> |
51 |
<td id= "longitude2" >11:00:00 a.m.</td> |
58 |
<p align= "center" class = "style2" >Copyright (c) 2010</p> |
61 |
<script type= "text/javascript" > |
66 |
if (navigator.geolocation) { |
68 |
document.getElementById( "status" ).innerHTML = "HTML5 Geolocation is supported in your browser." ; |
70 |
navigator.geolocation.getCurrentPosition(updateLocation); |
其运行结果如下图:
同样可以将经度纬度赋值给相应google map的api,得出下图所示的结果:
3.地理位置API获取流程
相信很多人会问地位位置(Geolocation) API使用的确非常方便,但是也太危险了,用户如何知道哪个应用程序在获取我的位置信息呢?用户如何进行权限设置呢。
图中标出的1, 2, 3 ,4 分别表示:
1. 表明一个用户试图打开一个调用地理位置信息的应用程序
2. 正常情况下,应用程序通过地位位置函数获取位置信息就可以了,但是浏览器会在这个地方将其中断,并请求用户授权,如果通过,则调用该函数,否则返回permission denied。
3. 浏览器根据上文所述的优先级依次获取设备相关信息,如果IP 地址,GPS信息等等,这是浏览器内部的行为。
4. 浏览器将坐标信息发送给外部的可信任的位置服务提供商哪里,如google map,位置服务提供商返回该位置的具体信息。
4. 地理位置API 例子
这是一个稍微复杂一点的例子,这个例子主要实现一个实时HTML5定位系统,主要代码如下:
001 |
<script type= "text/javascript" > |
004 |
var totalDistance = 0.0; |
011 |
Number.prototype.toRadians = function() { |
013 |
return this * Math.PI / 180; |
018 |
function distance(latitude1, longitude1, latitude2, longitude2) { |
020 |
// R is the radius of the earth in kilometers |
025 |
var deltaLatitude = (latitude2-latitude1).toRadians(); |
027 |
var deltaLongitude = (longitude2-longitude1).toRadians(); |
029 |
latitude1 = latitude1.toRadians(), latitude2 = latitude2.toRadians(); |
032 |
var a = Math. sin (deltaLatitude/2) * |
034 |
Math. sin (deltaLatitude/2) + |
036 |
Math. cos (latitude1) * |
038 |
Math. cos (latitude2) * |
040 |
Math. sin (deltaLongitude/2) * |
042 |
Math. sin (deltaLongitude/2); |
045 |
var c = 2 * Math. atan2 (Math. sqrt (a), |
056 |
function updateStatus(message) { |
058 |
document.getElementById( "status" ).innerHTML = message; |
063 |
function loadDemo() { |
065 |
if (navigator.geolocation) { |
067 |
updateStatus( "HTML5 Geolocation is supported in your browser." ); |
069 |
navigator.geolocation.watchPosition(updateLocation, |
080 |
function updateLocation(position) { |
082 |
var latitude = position.coords.latitude; |
084 |
var longitude = position.coords.longitude; |
086 |
var accuracy = position.coords.accuracy; |
088 |
var timestamp = position.timestamp; |
091 |
document.getElementById( "latitude" ).innerHTML = latitude; |
093 |
document.getElementById( "longitude" ).innerHTML = longitude; |
095 |
document.getElementById( "accuracy" ).innerHTML = accuracy; |
097 |
document.getElementById( "timestamp" ).innerHTML = timestamp; |
100 |
// sanity test... don't calculate distance if accuracy |
104 |
if (accuracy >= 500) { |
106 |
updateStatus( "Need more accurate values to calculate distance." ); |
113 |
// calculate distance |
116 |
if ((lastLat != null) && (lastLong != null)) { |
118 |
var currentDistance = distance(latitude, longitude, lastLat, lastLong); |
120 |
document.getElementById( "currDist" ).innerHTML = |
122 |
"Current distance traveled: " + currentDistance.toFixed(4) + " km" ; |
125 |
totalDistance += currentDistance; |
128 |
document.getElementById( "totalDist" ).innerHTML = |
130 |
"Total distance traveled: " + currentDistance.toFixed(4) + " km" ; |
137 |
lastLong = longitude; |
140 |
updateStatus( "Location successfully updated." ); |
145 |
function handleLocationError(error) { |
153 |
updateStatus( "There was an error while retrieving your location: " + error.message); |
159 |
updateStatus( "The user prevented this page from retrieving a location." ); |
165 |
updateStatus( "The browser was unable to determine your location: " + error.message); |
171 |
updateStatus( "The browser timed out before retrieving the location." ); |