Neo*_*Neo 5 mysql sql geometry distance haversine
我从谷歌地图反向地理编码API获得纬度和经度,然后我需要这样的东西:
mysql_query("SELECT users.*, ".mysql_distance_column($lat,$lng)." FROM users ORDER BY DISTANCE";
function mysql_distance_column($lat=40 , $lng=-73) {
$defaultLatitudeColumn = 'user_lat';
$defaultLongitudeColumn='user_lng';
$defaultColumnName='user_distance';
return "((
(3956 * 2 * ASIN(SQRT( POWER(SIN(({$lat} - abs({$defaultLatitudeColumn}))
* pi()/180 / 2), 2) + COS({$lat} * pi()/180 )
* COS(abs({$defaultLatitudeColumn}) * pi()/180)
* POWER(SIN(({$lng} - {$defaultLongitudeColumn}) * pi()/180 / 2), 2) ))
)) ) as {$defaultColumnName} ";
}
Run Code Online (Sandbox Code Playgroud)
更新 我不能这样工作
delimiter //
CREATE FUNCTION `GeoDistMiles`( lat1 FLOAT (10,6), lon1 FLOAT (10,6), lat2 FLOAT (10,6), lon2 FLOAT (10,6) )
RETURNS FLOAT
DETERMINISTIC
NO SQL
BEGIN
DECLARE pi, q1, q2, q3 FLOAT (10,6);
DECLARE rads FLOAT (10,6) DEFAULT 0;
SET pi = PI();
SET lat1 = lat1 * pi / 180;
SET lon1 = lon1 * pi / 180;
SET lat2 = lat2 * pi / 180;
SET lon2 = lon2 * pi / 180;
SET q1 = COS(lon1-lon2);
SET q2 = COS(lat1-lat2);
SET q3 = COS(lat1+lat2);
SET rads = ACOS( 0.5*((1.0+q1)*q2 - (1.0-q1)*q3) );
RETURN 3963.346 * rads;
END
Run Code Online (Sandbox Code Playgroud)
这是我使用的公式。请记住,地球不是一个完美的球体,因此结果永远不会是完美的。
CREATE DEFINER=`root`@`localhost` 函数 `GeoDistMiles`( lat1 FLOAT, lon1 FLOAT, lat2 FLOAT, lon2 FLOAT ) 返回 float 开始 声明 pi、q1、q2、q3 浮点数; DECLARE rads FLOAT 默认值 0; 设置 pi = PI(); 设置 lat1 = lat1 * pi / 180; 设置 lon1 = lon1 * pi / 180; 设置 lat2 = lat2 * pi / 180; 设置 lon2 = lon2 * pi / 180; SET q1 = COS(lon1-lon2); 设置 q2 = COS(lat1-lat2); 设置 q3 = COS(lat1+lat2); 设置弧度 = ACOS( 0.5*((1.0+q1)*q2 - (1.0-q1)*q3) ); 返回 3963.346 * 弧度; 结尾
| 归档时间: |
|
| 查看次数: |
5745 次 |
| 最近记录: |