您好,欢迎光临! 推荐您使用Chrome浏览器访问本站。

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>

您可能也喜欢