mysql(php)根据一个坐标求得与数据库中其他坐标的距离
set @x1=114.172668; set @y1=22.314825; set @dist=100; SELECT X(locgeo_baidu),Y(locgeo_baidu),AsText(locgeo_baidu), ROUND( 6378.138*2*ASIN( SQRT( POW(SIN((@y1*PI()/180-Y(locgeo_baidu)*PI()/180)/2),2) +COS(@y1*PI()/180) *COS(Y(locgeo_baidu)*PI()/180) *POW(SIN((@x1*PI()/180-X(locgeo_baidu)*PI()/180)/2),2) ) )*1000 )AS distance from wfgeoloc where locgeo_baidu!='' having distance<@dist ORDER BY distance asc
参考php:http://www.cnblogs.com/wangqishu/p/3811605.html
/** * calc_map_distance() , 根据地图上的两个点各自的x,y坐标,计算出2点之间的直线距离 * @param array $point_1 第1个点的x,y坐标 array( 101 , 202 ) * @param array $point_2 第2个点的x,y坐标 array( 101 , 202 ) * @param bool $calc_as_string 是否计算为字符串公里距离 , 如果未否返回数字 * @return float | false | string */ public static function calc_map_distance( $point_1=array( ) , $point_2=array( ) , $calc_as_string=true ) { if( empty( $point_1 ) || empty( $point_2 ) ){ return false; } // 经纬度不存在,或者经纬度超过最大范围 +-180 , +-90 ,返回false $p1_x = $point_1[0]; $p1_y = $point_1[1]; $p2_x = $point_2[0]; $p2_y = $point_2[1]; if( $p1_x < -180 || $p1_x > 180 || $p2_x < -180 || $p2_x > 180 || $p1_y < -90 || $p1_y > 90 || $p2_y < -90 || $p2_y > 90 ){ return false; } // 根据2点各自的坐标,计算2点之间直线距离的公式 $distance = round(6378.138*2*asin(sqrt(pow(sin(( $p1_x *pi()/180-$p2_x*pi()/180)/2),2)+cos( $p1_x *pi()/180)*cos($p2_x*pi()/180)* pow(sin(( $p1_y *pi()/180-$p2_y*pi()/180)/2),2)))*1000); // 是否计算为字符串公里距离 if( !$calc_as_string ){ return $distance; } // 如果计算为字符串公里距离 if( $distance / 1000 > 1 ){ $k = (string)round( $distance / 1000 , 1 ); $m = (string)$distance % 1000 ; $distance = "{$k}公里{$m}米"; } else{ $distance = "{$distance}米"; } return $distance; }
更多参考:http://blog.sina.com.cn/s/blog_a48af8c001018q1p.html
</pre> SET @center = GeomFromText('POINT(114.172668 22.314825)'); SET @radius = 30; SET @bbox = CONCAT('POLYGON((', X(@center) - @radius, ' ', Y(@center) - @radius, ',', X(@center) + @radius, ' ', Y(@center) - @radius, ',', X(@center) + @radius, ' ', Y(@center) + @radius, ',', X(@center) - @radius, ' ', Y(@center) + @radius, ',', X(@center) - @radius, ' ', Y(@center) - @radius, '))' ); SELECT AsText(locgeo_baidu), SQRT(POW( ABS( X(locgeo_baidu) - X(@center)), 2) + POW( ABS(Y(locgeo_baidu) - Y(@center)), 2 )) AS distance FROM wfgeoloc WHERE Intersects(locgeo_baidu, GeomFromText(@bbox) ) AND SQRT(POW( ABS( X(locgeo_baidu) - X(@center)), 2) + POW( ABS(Y(locgeo_baidu) - Y(@center)), 2 )) < @radius ORDER BY distance; <pre>