百度地图两点之间距离【传送门】 PHP版本
<?php
/**
* 计算两点之间直线距离
* @param float $lon1 经度
* @param float $lat1 维度
* @param float $lon2 经度
* @param float $lat2 维度
* @return float 浮点数
*/
function distance($lon1, $lat1, $lon2, $lat2){
return (2*ATAN2(SQRT(SIN(($lat1-$lat2)*PI()/180/2)
*SIN(($lat1-$lat2)*PI()/180/2)+
COS($lat2*PI()/180)*COS($lat1*PI()/180)
*SIN(($lon1-$lon2)*PI()/180/2)
*SIN(($lon1-$lon2)*PI()/180/2)),
SQRT(1-SIN(($lat1-$lat2)*PI()/180/2)
*SIN(($lat1-$lat2)*PI()/180/2)
+COS($lat2*PI()/180)*COS($lat1*PI()/180)
*SIN(($lon1-$lon2)*PI()/180/2)
*SIN(($lon1-$lon2)*PI()/180/2))))*6378140;
}
echo distance(116.3896,39.91917,116.3940,39.91726);
?>
JS版本
function toRad(d) { return d * Math.PI / 180; }
function getDisance(lat1, lng1, lat2, lng2) {
var dis = 0;
var radLat1 = toRad(lat1);
var radLat2 = toRad(lat2);
var deltaLat = radLat1 - radLat2;
var deltaLng = toRad(lng1) - toRad(lng2);
var dis = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(deltaLng / 2), 2)));
return dis * 6378137;
}
console.log( getDisance(39.91917,116.3896,39.91726,116.3940) );
MySQL版本 #其中39.91578为用户维度 116.3899为用户经度
#表结构如下
CREATE TABLE `map` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`lat` decimal(12,6) NOT NULL,
`lng` decimal(12,6) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
SELECT id,lat,lng,((
2*ATAN2(SQRT(SIN((39.91578-lat)*PI()/180/2)
*SIN((39.91578-lat)*PI()/180/2)+
COS(lat*PI()/180)*COS(39.91578*PI()/180)
*SIN((116.3899-lng)*PI()/180/2)
*SIN((116.3899-lng)*PI()/180/2)),
SQRT(1-SIN((39.91578-lat)*PI()/180/2)
*SIN((39.91578-lat)*PI()/180/2)
+COS(lat*PI()/180)*COS(39.91578*PI()/180)
*SIN((116.3899-lng)*PI()/180/2)
*SIN((116.3899-lng)*PI()/180/2))))*6378140) as len FROM `map` order by len asc ;