微信开发之附近商家地理位置计算和腾讯地图坐标转百度地图坐标的方法
腾讯地图坐标转百度坐标
案例:本次开发的系统是一个商家联盟积分系统。在全国各地都有商家联盟的网点。
要求实现的功能
a.微信粉丝通过微信号就能查看附近的商家
b.我的联盟系统统计在2公里之内的商家网点
c.并标出商家和粉丝位置的距离是多少米。
d.在商家的详细介绍页面设置百度地图接入步行、公交、驾车一键导航功能
那么现在问题来了:
问题1:在做微信O2O开发的过程中,通过微信地理位置功能事件获得的是腾讯地图坐标。而我们的导航地图坐标是百度的地图API接口?
问题2:腾讯的地图坐标和边度的坐标计量方式是不同的计量方式,如何转换?
谷歌地图,高德地图,腾讯地图用的GCJ-02坐标提醒
百度地图用的BD-09坐标体系
问题3:两点坐标的距离如何计算?
程序代码见下,我已经做了函数处理和注释提醒,可以直接拿去用了
01.
/**
02.
* 腾讯地图坐标转百度地图坐标
03.
* @param [String] $lat 腾讯地图坐标的纬度
04.
* @param [String] $lng 腾讯地图坐标的经度
05.
* @return [Array] 返回记录纬度经度的数组
06.
*/
07.
function Convert_GCJ02_To_BD09($lat,$lng){
08.
$x_pi =
3.14159265358979324
*
3000.0
/
180.0
;
09.
$x = $lng;
10.
$y = $lat;
11.
$z =sqrt($x * $x + $y * $y) +
0.00002
* sin($y * $x_pi);
12.
$theta = atan2($y, $x) +
0.000003
* cos($x * $x_pi);
13.
$lng = $z * cos($theta) +
0.0065
;
14.
$lat = $z * sin($theta) +
0.006
;
15.
return
array(
'lng'
=>$lng,
'lat'
=>$lat);
16.
}
17.
18.
19.
//百度地图坐标计算
20.
function rad($d)
21.
{
22.
return
$d *
3.1415926535898
/
180.0
;
23.
}
24.
25.
/**
26.
* 腾讯地图坐标转百度地图坐标
27.
* @param [String] $lat1 A点的纬度
28.
* @param [String] $lng1 A点的经度
29.
* @param [String] $lat2 B点的纬度
30.
* @param [String] $lng2 B点的经度
31.
* @return [String] 两点坐标间的距离,输出单位为米
32.
*/
33.
function GetDistance($lat1, $lng1, $lat2, $lng2)
34.
{
35.
$EARTH_RADIUS =
6378.137
;
//地球的半径
36.
$radLat1 = rad($lat1);
37.
$radLat2 = rad($lat2);
38.
$a = $radLat1 - $radLat2;
39.
$b = rad($lng1) - rad($lng2);
40.
$s =
2
* asin(sqrt(pow(sin($a/
2
),
2
) +
41.
cos($radLat1)*cos($radLat2)*pow(sin($b/
2
),
2
)));
42.
$s = $s *$EARTH_RADIUS;
43.
$s = round($s *
10000
) /
10000
;
44.
$s=$s*
1000
;
45.
return
ceil($s);
46.
}
47.
48.
/**
49.
* 标记大概的距离,做出友好的距离提示
50.
* @param [$number] 距离数量
51.
* @return[String] 距离提示
52.
*/
53.
function mToKm($number){
54.
if
(!is_numeric($number))
return
' '
;
55.
switch
($number){
56.
case
$number>
1800
&&$number<=
2000
:
57.
$v=
'2'
;
58.
break
;
59.
case
$number>
1500
&&$number<=
1800
:
60.
$v=
'1.8'
;
61.
break
;
62.
case
$number>
1200
&&$number<=
1500
:
63.
$v=
'1.5'
;
64.
break
;
65.
case
$number>
1000
&&$number<=
1200
:
66.
$v=
'1.2'
;
67.
break
;
68.
case
$number>
900
&&$number<=
1000
:
69.
$v=
'1'
;
70.
break
;
71.
default
:
72.
$v=ceil($number/
100
)*
100
;
73.
break
;
74.
}
75.
76.
if
($v<
100
){
77.
$v=
'距离我【<font color="#FF4C06"><b>'
.$v.
'</b></font>】千米内。'
;}
78.
else
{
79.
$v=
'距离我【<font color="#FF4C06"><b>'
.$v.
'</b></font>】米内。'
;
80.
}
81.
return
$v;
82.
83.
}
84.
$location1=explode(
','
,
'30.625011,104.072701'
);
//腾讯地图坐标
85.
$location1==Convert_GCJ02_To_BD09($location1[
0
],$location1[
1
]);
//转换腾讯坐标到百度坐标
86.
$location2=explode(
','
,
'104.102209,30.647363'
);
87.
$distance=GetDistance($location2[
0
],$location2[
1
],$location1[
0
],$location1[
1
]);
//得出距离
88.
$distance=mToKm($x);
//对距离个性化转换处理
最终实现的微信地理位置呈现的效果图截图如下
微信窗口中粉丝地理位置和最近的商家位置呈现的距离提示
微信网站中根据公众号粉丝的openid和该粉丝当前的地理位置坐标计算出相应的距离
百度地图导航导商家
我接下来再分享一篇文章,关于微信的地理位置的存储和地理位置和附近商家的调用功能;
1.我就专门来分享关于如何获取改粉丝的当前位置坐标和当前粉丝的用户标示
2.如何把每个粉丝的地理位置信息和粉丝用户信息固话存储
3.如何方便当前持续的地理位置服务和调用;