这个是我在佳缘的时候写的, 已经很久了, 当时是为了根据经纬度计算附近的人,
可见当时思想就已经很超前了...
不过现在有了更多的可选项了, 例如 geohash, 存储 geo 的服务, mogodb, 等等
不过这个还是有一定的参考意义的.
看看我 12 年写的文章:
现在这个移动终端的天下,
自然而然就有了根据经纬度来计算方向和距离的需求,
LBS 就产生了,
可是怎么计算呢 ?
网上有很多计算距离的, 今天我就来个加强版, 计算距离和方向.
- // 根据经纬度计算距离和方向
- function getRadian($d) {
- return $d * M_PI / 180;
- }
- function getDistance($lat1, $lng1, $lat2, $lng2) {
- $lat1 = getRadian($lat1);
- $lat2 = getRadian($lat2);
- $a = $lat1 - $lat2;
- $b = getRadian($lng1) - getRadian($lng2);
- $v = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($b / 2), 2)));
- $v = round(EARTH_RADIUS * $v * 10000) / 10000;
- return $v;
- }
- // 根据经纬度计算方向
- function getDirection($lat1, $lng1, $lat2, $lng2) {
- $k1 = $lng2 - $lng1;
- $k2 = $lat2 - $lat1;
- if (0 == $k1) {
- if ($k2 > 0) {
- $str = "聊友在您的正北方";
- } else if ($k2 < 0) {
- $str = "聊友在您的正南方";
- } else if ($k2 == 0) {
- $str = "聊友正在您的附近";
- }
- } else if (0 == $k2) {
- if ($k1 > 0) {
- $str = "聊友在您的正东方";
- } else if ($k1 < 0) {
- $str = "聊友在您的正西方";
- }
- } else {
- $k = $k2 / $k1;
- if ($k2 > 0) {
- if ($k1 > 0) {
- $angle = 180 * atan($k) / M_PI;
- $str = "聊友在您的东偏北 $angle 度方向";
- } else if ($k1 < 0) {
- $angle = 180 * atan( - $k) / M_PI;
- $str = "聊友在您的西偏北 $angle 度方向";
- }
- } else if ($k2 < 0) {
- if ($k1 < 0) {
- $angle = 180 * atan($k) / M_PI;
- $str = "聊友在您的西偏南 $angle 度方向";
- } else if ($k1 > 0) {
- $angle = 180 * atan($k) / M_PI;
- $str = "聊友在您的东偏南 $angle 度方向";
- }
- }
- }
- return $str;
- }
来源: https://www.qcloud.com/developer/article/1339750