在开发中可能现在很多都在使用地图定位,而无需在进行复杂的计算距离的方法,因为计算已经被地图给代替了,我们也就不需要再进行坐标到坐标的距离计算了,但是当你只是想使用距离而不想使用地图的时候,你就得进行坐标计算了,这不我在一个项目中就遇到这样的问题,根据手机获取当前地理位置的坐标,然后再与目的地坐标(已知坐标)进行计算,并且得到距离,当然也可以实时更新手机坐标以获得最准确的距离。
下面我们直接看代码吧!
1 |
|
2 | <html> |
3 | <head> |
4 | <meta charset=UTF-8"> |
5 | <title>获取地理信息</title> |
6 | </head> |
7 | |
8 | <body> |
9 | <div>navigator是window环境下的一个属性,包含了当前浏览器的一些信息数据</div> |
10 | <div>geolocation,HTML5的新属性,是navigator对象的一个属性</div> |
11 | <div>getCurrentPosition(getPositionSuccess, getPositionError, position_option)是geolocation下的一个方法,返回当前位置信息</div> |
12 | <!--获取用户当前位置信息--> |
13 | <script type="text/javascript"> |
14 | /* |
15 | navigator.geolocation.watchPosition(getposition); |
16 | 移动端使用,位置改变触发getposition |
17 | */ |
18 | getposition(); |
19 | function getposition(){ //获取位置信息 |
20 | if(navigator.geolocation){ |
21 | /* |
22 | position_option配置navigator.geolocation.getCurrentPosition方法参数 |
23 | */ |
24 | var position_option = { |
25 | enableHighAccuracy: true, //是否使用高精度设备获取值,gps>wifi>ip |
26 | maximumAge: 30000, //表示浏览器重新获取位置信息的时间间隔 |
27 | timeout: 5000 //设定请求超时时间 |
28 | }; |
29 | /* |
30 | 调用navigator.geolocation.getCurrentPosition方法可获取用户当前位置,该方法有三个参数: |
31 | 获取成功后回调函数,并传入一个position值 |
32 | 获取失败后回调函数,并传入error信息 |
33 | 配置项:json格式,enableHighAccuracy,maximumAge,timeout三个参数配置 |
34 | */ |
35 | navigator.geolocation.getCurrentPosition(getPositionSuccess, getPositionError, position_option); |
36 | }else{ |
37 | alert("很抱歉,您的设备不支持地理定位!") |
38 | } |
39 | |
40 | } |
41 | |
42 | /* |
43 | 成功后回调函数getPositionSuccess( position ),position为成功后返回信息对象 |
44 | */ |
45 | |
46 | function getPositionSuccess(position){ |
47 | var lat = position.coords.latitude; //获取纬度 |
48 | var lng = position.coords.longitude; //获取经度 |
49 | /* |
50 | positiion对象比较少用到的属性 |
51 | timestamp返回当前位置创建时间的时间戳 |
52 | |
53 | coords.accuracy 位置精度 |
54 | coords.altitude 海拔,海平面以上以米计 |
55 | coords.altitudeAccuracy 位置的海拔精度 |
56 | coords.heading 方向,从正北开始以度计 |
57 | coords.speed 速度,以米/每秒计 |
58 | */ |
59 | |
60 | alert( "您所在的位置: 纬度" + lat + ",经度" + lng ); |
61 | if(typeof position.address !== "undefined"){ //判断是position对象是否有address属性,有则输出address信息 |
62 | var country = position.address.country; |
63 | var province = position.address.region; |
64 | var city = position.address.city; |
65 | alert(' 您位于 ' + country + province + '省' + city +'市'); |
66 | } |
67 | |
68 | if(lat != '' && lng != ''){ //判断,如果经纬度不等于空则计算两个位置间的距离 |
69 | alert(distance(lat,lng,23.137004,113.301858)+"米"); |
70 | } |
71 | } |
72 | |
73 | /* |
74 | 失败后回调函数getPositionError(error),error为失败后返回信息 |
75 | */ |
76 | function getPositionError(error){ |
77 | /* |
78 | error.message为返回错误信息,建议自定义 |
79 | error.code为返回错误提示码 |
80 | */ |
81 | switch (error.code) { |
82 | case error.TIMEOUT: |
83 | alert("连接超时,请重试"); |
84 | break; |
85 | case error.PERMISSION_DENIED: |
86 | alert("您拒绝了使用位置共享服务,查询已取消"); |
87 | break; |
88 | case error.POSITION_UNAVAILABLE: |
89 | alert("获取位置信息失败"); |
90 | break; |
91 | case error.UNKNOW_ERROR: |
92 | alert("其它错误"); |
93 | break; |
94 | } |
95 | } |
96 | |
97 | function distance(lat,lng,goalLat,goalLng){ //传入位置纬度,经度和目标纬度,经度,返回距离值,单位米,对地理感兴趣的童鞋可以去研究下计算公式 |
98 | var EARTH_RADIUS = 6378.137;//地球赤道半径 |
99 | if(lat != '' && lng != '' && goalLat != '' && goalLng != ''){ |
100 | var radLat1 = rad(goalLat); |
101 | var radLat2 = rad(lat); |
102 | var a = radLat1 - radLat2; |
103 | var b = rad(goalLng) - rad(lng); |
104 | var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2))); |
105 | s = s * EARTH_RADIUS; |
106 | s = Math.round(s * 10000) / 10000; |
107 | return s*1000; |
108 | }else{ |
109 | return 0; |
110 | } |
111 | function rad(d){ |
112 | return d * Math.PI / 180.0; |
113 | } |
114 | } |
115 | </script> |
116 | <!-- |
117 | 获取经纬度查询计算距离存在误差,现测试范围在100米以内,获取目标经纬度建议直接前往目标地点获取目标经纬度 |
118 | 使用地图获取经纬度可使用谷歌全球,经测试与本人机子GPS获取的经纬度误差最小 |
119 | 中国经度范围:73°33′E至135°05′E |
120 | 中国纬度范围:3°51′N至53°33′N |
121 | 计算公式,纬度在前经度在后 |
122 | 百度地图经纬度获取坑,经度放前面,纬度放后面 |
123 | --> |
124 | <!-- |
125 | 经测试发现PC端浏览器无法获取经纬度,原因不明,正努力翻资料中,求解惑 |
126 | --> |
127 | </body> |
128 | </html> |