计算两个经纬度之间的距离
PHP计算:
#lng为经度,lat为纬度,一定不要弄错了哦 function distance($lat1, $lng1, $lat2, $lng2){ 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(($lng1-$lng2)*PI()/180/2) *SIN(($lng1-$lng2)*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(($lng1-$lng2)*PI()/180/2) *SIN(($lng1-$lng2)*PI()/180/2))))*6378140; }
mysql计算:
set @lng1=116.3899; set @lat1=39.91578; set @lng2=116.3904; set @lat2=39.91576; select (2*ATAN2(SQRT(SIN((@lat1-@lat2)*PI()/180/2) *SIN((@lat1-@lat2)*PI()/180/2)+ COS(@lat2*PI()/180)*COS(@lat1*PI()/180) *SIN((@lng1-@lng2)*PI()/180/2) *SIN((@lng1-@lng2)*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((@lng1-@lng2)*PI()/180/2) *SIN((@lng1-@lng2)*PI()/180/2))))*6378140;
google给的解决方案(基于公里km)
SELECT geo_id, `name`,( 6371 * acos ( cos ( radians(33.958887) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(118.302416) ) + sin ( radians(33.958887) ) * sin( radians( lat ) ) ) ) AS distance FROM geo HAVING distance < 20 ORDER BY distance LIMIT 0 , 20;
javascript方案:
function getDisance(lat1, lng1, lat2, lng2) { // lat为纬度, lng为经度, 一定不要弄错 function toRad(d) { return d * Math.PI / 180; } 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; } alert( getDisance(39.91917,116.3896,39.91726,116.3940) );