前端开发日记一:网页定位两三事

最近开发的项目用要实现在网页上进行定位、以及地址解析的工作,通过查找各方面资料,总算完成了需求。现在将开发过程中用到的方法记录一下,以备后用。


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 οnlοad=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,是HTML5提供的API,已经被主流浏览器支持

提供的函数包括: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> 

2、在获取到了经纬度之后,怎么才能解析出来对应的地址呢
对经纬度进行解析的工作称为 反向地理编码(地址查询)
常见的做法是通过第三方API来解析,比如google map提供的API
http://maps.googleapis.com/maps/api/geocode/json?sensor=false&latlng=40.754224,116.701452&&language=zh-CN
后边有几个参数:
latlng:经纬度,已经用半角逗号链接
sensor:是否是gps传感器,可选true或者false
language:如果不指定语言参数,则返回信息的语言不确定,最好加上。
根据返回的结果就可以获取到城市、行政区、街道等信息了。


用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 οnlοad="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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值