准备工作
1、含有城市名称和经纬度的数据表(lat为经度,lng为纬度):
2、百度地图api,用来获取每个城市的经纬度:
http://api.map.baidu.com/geocoder?address=%E9%9D%92%E5%B2%9B&output=json&key=rKNhRRsTd47pjY3VCbvCOHraF0FOft5O
代码实现
实现逻辑:以
济南为起点
,算出济南到每个城市之间的距离,并按照距离从近到远依次排序。
/**
处理排序的逻辑
**/
public function cityorder(){
//找一个排序的起点,为济南
$jinan = db::name("ceshi")
->where("address","济南")
->find();
//查询城市表里不是济南的所有城市
$sql = db::name("ceshi")
->where("address",'neq',"济南")
->select();
//以济南的距离为起点,依次算出从济南到每个城市的距离,并放入数组
for($i = 0; $i< count($sql) ; $i++){
$arr[$i]["space"] = $this->getdistance($jinan["lat"],$jinan["lng"],$sql[$i]["lat"],$sql[$i]["lng"]);
$arr[$i]["name"] = $sql[$i]["address"];
}
//进行冒泡排序
$a = $this->mpSort($arr,"space");
print_r($a);die;
}
/**
php二维数组冒泡排序
**/
function mpSort($arr,$key){
for($i=0;$i<count($arr);$i++){
for($j=$i;$j<count($arr);$j++){
if($arr[$i][$key]>$arr[$j][$key]){
$temp=$arr[$i];
$arr[$i]=$arr[$j];
$arr[$j]=$temp;
}
}
}
return $arr;
}
/**
* 求两个已知经纬度之间的距离,单位为米
*
* @param lng1 $ ,lng2 经度
* @param lat1 $ ,lat2 纬度
* @return float 距离,单位米
* @author www.Alixixi.com
*/
function getdistance($lng1, $lat1, $lng2, $lat2) {
// 将角度转为狐度
$radLat1 = deg2rad($lat1); //deg2rad()函数将角度转换为弧度
$radLat2 = deg2rad($lat2);
$radLng1 = deg2rad($lng1);
$radLng2 = deg2rad($lng2);
$a = $radLat1 - $radLat2;
$b = $radLng1 - $radLng2;
$s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6378.137 * 1000;
return $s;
}
postman打印出来后的效果(space是济南到某个城市之间的距离):
Array
(
[0] => Array
(
[space] => 509381.83926484
[name] => 郑州
)
[1] => Array
(
[space] => 534136.67762135
[name] => 合肥
)
[2] => Array
(
[space] => 622342.83636755
[name] => 南京
)
[3] => Array
(
[space] => 726371.61725314
[name] => 上海
)
[4] => Array
(
[space] => 1264244.2118345
[name] => 福建
)
[5] => Array
(
[space] => 1563068.6975839
[name] => 广东
)
[6] => Array
(
[space] => 2096074.5595435
[name] => 海南
)
[7] => Array
(
[space] => 2523006.4189404
[name] => 拉萨
)
)
从打印效果中来看,确实如此,济南在这些城市的最北边,依次为郑州、合肥、南京:
如果你感觉数据不对,可以使用百度地图等直接搜两个城市之间的距离来进行测试。
该逻辑放到项目中即可使用。