最近开发的项目用要实现在网页上进行定位、以及地址解析的工作,通过查找各方面资料,总算完成了需求。现在将开发过程中用到的方法记录一下,以备后用。
1、页面如何定位?
页面定位的途径有很多,常用的包括:利用IP定位,利用GPS定位
ip定位:利用开放的接口通过ip来进行定位,定位的准确性比较低。这里给一个例子,利用的是第三方接口进行ip解析。
<html> <head> <title>xxxxx</title> <meta http-equiv="content-type" content="text/html; charset=gb2312"> <script type="text/javascript" src="http://www.ip-look-up.com/Services/ipInfo.js"></script> </head> <body onload=aa();> <SCRIPT LANGUAGE="JavaScript"> function aa(){ document.getElementById("lat").value = ipLocation.latitude; document.getElementById("long").value = ipLocation.longitude; document.getElementById("city").value = ipLocation.address.city; document.getElementById("long").value = ipLocation.longitude; document.getElementById("code").value = ipLocation.address.country_code; document.getElementById("region").value = ipLocation.address.region; document.getElementById("country").value = ipLocation.address.country; } </SCRIPT> 经度:<input type="text" id="lat"><br/> 纬度:<input type="text" id="long"><br/> 城市:<input type="text" id="city"><br/> 国家代码:<input type="text" id="code"><br/> 城市所属地区:<input type="text" id="region"><br/> 国家:<input type="text" id="country"><br/> </body> </html>
提供的函数包括:geolocation.getCurrentPosition,查看当前位置;geolocation.watchPosition,不断的读取位置信息。两个function的paramas是相同的,都是成功调用success,失败调用error(https://developer.mozilla.org/en-US/docs/WebAPI/Using_geolocation)。
使用之前要先检查浏览器是否支持
<script type="text/javascript"> if(navigator.geolocation){ navigator.geolocation.getCurrentPosition(getPositionSuccess, getPositionError); }else{ alert("您的浏览器不支持Geolocation!"); } </script>
<script type="text/javascript"> function getPositionSuccess(position){ var lat = position.coords.latitude; var lng = position.coords.longitude; document.write("所在位置: 经度(" + lat + "),纬度(" + lng + ")"); if(typeof position.address !== "undefined"){ var country = position.address.country; var province = position.address.region; var city = position.address.city; document.write("<br />"); document.write("您位于" + country + province + city); } } function getPositionError(error){ switch(error.code){ case error.TIMEOUT: alert("连接超时,请重试"); break; case error.PERMISSION_DENIED: alert("您拒绝了使用位置共享服务,查询已取消"); break; case error.POSITION_UNAVAILABLE: alert("非常抱歉,我们暂时无法为您所在的星球提供位置服务"); break; } } </script>
用baidu提供的API也可以实现,但是貌似要麻烦一些,具体可以参考这里
最后附一个完整定位的例子
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <title>navigator定位测试</title> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js" type="text/javascript"></script> <script type="text/javascript"> function detectLocation(){ if(navigator.geolocation){ navigator.geolocation.getCurrentPosition(getPositionSuccess, getPositionError); }else{ alert("您的浏览器不支持Geolocation!"); } } function getPositionSuccess(position){ var lat = position.coords.latitude; var lng = position.coords.longitude; $('#latitude').val(lat); $('#longitude').val(lng); $.ajax({ type:'get', url:'http://maps.googleapis.com/maps/api/geocode/json', data:'latlng='+lat+','+lng+'&sensor=true&language=zh-CN', dataType:'json', success:function(msg){ if(msg.status=='OK'){ for(var i=0;i<msg.results[0].address_components.length;i++){ if(msg.results[0].address_components[i].types[0]=='route'){ $('#route').val(msg.results[0].address_components[i].long_name); }else if(msg.results[0].address_components[i].types[0]=='sublocality'){ $('#sublocality').val(msg.results[0].address_components[i].long_name); }else if(msg.results[0].address_components[i].types[0]=='locality'){ $('#locality').val(msg.results[0].address_components[i].long_name); }else if(msg.results[0].address_components[i].types[0]=='administrative_area_level_1'){ $('#administrative_area_level_1').val(msg.results[0].address_components[i].long_name); }else if(msg.results[0].address_components[i].types[0]=='country'){ $('#country').val(msg.results[0].address_components[i].long_name); } } }else{ alert(msg.status); } } }) } function getPositionError(error){ switch(error.code){ case error.TIMEOUT: alert("连接超时,请重试"); break; case error.PERMISSION_DENIED: alert("您拒绝了使用位置共享服务,查询已取消"); break; case error.POSITION_UNAVAILABLE: alert("非常抱歉,我们暂时无法为您所在的星球提供位置服务"); break; } } </script> </head> <body onload="detectLocation()"> 维度:<input type="text" id="latitude" /><br /> 经度:<input type="text" id="longitude" /><br /> 国家:<input type="text" id="country" /><br /> 省份:<input type="text" id="administrative_area_level_1" /><br /> 城市:<input type="text" id="locality" /><br /> 县/区:<input type="text" id="sublocality" /><br /> 路:<input type="text" id="route" /> </body> </html>