正弦公式 php / mysql

Posted

技术标签:

【中文标题】正弦公式 php / mysql【英文标题】:haversine formula php / mysql 【发布时间】:2013-02-12 18:48:13 【问题描述】:

我正在尝试使用半径搜索获得一个通用的地理点数据库。 我找到了几个关于这个主题的好教程,但最后我失败了。

主要教程在这里:http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates。

基本公式,以 SQL 查询的形式,是

SELECT * FROM Places 
WHERE (Lat => 1.2393 AND Lat <= 1.5532) AND (Lon >= -1.8184 AND Lon <= 0.4221)
AND acos(sin(1.3963) * sin(Lat) + cos(1.3963) * cos(Lat) * cos(Lon - (-0.6981)))
    <= 0.1570;

我已经在一个简单的 php 测试页面中实现了这一点,如下所示:

$R = 6371; // radius of Earth in KM

$lat = '46.98025235521883'; // lat of center point
$lon = '-110.390625'; // longitude of center point
$distance = 1000; // radius in KM of the circle drawn 
$rad = $distance / $R; // angular radius for query 
$query = '';

// rough cut to exclude results that aren't close
$max_lat = $lat + rad2deg($rad/$R);
$min_lat = $lat - rad2deg($rad/$R);
$max_lon = $lon + rad2deg($rad/$R/cos(deg2rad($lat)));
$min_lon = $lon - rad2deg($rad/$R/cos(deg2rad($lat)));
// this part works just fine!
$query .= '(latitude > ' . $min_lat . ' AND latitude < ' . $max_lat . ')';
$query .= ' AND (longitude > ' . $min_lon . ' AND longitude < ' . $max_lon . ')';
// refining query -- this part returns no results
$query .= ' AND acos(sin('.$lat.') * sin(latitude) + cos('.$lat.') * cos(latitude) *
    cos(longitude - ('.$lon.'))) <= '.$rad;

我在这里遗漏了什么吗?我认为我完全遵循了该方法,但我无法让“微调”查询返回任何结果。

【问题讨论】:

你能提供一些预期的输入/输出来修补吗? 【参考方案1】:

不确定,但是:

$R = 6371; // radius of Earth in KM

$lat = '46.98025235521883'; // lat of center point
$lon = '-110.390625'; // longitude of center point
$distance = 1000; // radius in KM of the circle drawn 
$rad = $distance / $R; // angular radius for query 
$query = '';

// rough cut to exclude results that aren't close
$radR = rad2deg($rad/$R);
$max_lat = $lat + radR;
$min_lat = $lat - radR;
$radR = rad2deg($rad/$R/cos(deg2rad($lat)));
$max_lon = $lon + radR;
$min_lon = $lon - radR;
// this part works just fine!
$query .= '(latitude > ' . $min_lat . ' AND latitude < ' . $max_lat . ')';
$query .= ' AND (longitude > ' . $min_lon . ' AND longitude < ' . $max_lon . ')';
// refining query -- this part returns no results
$query .= ' AND acos(sin('.deg2rad($lat).') * sin(radians(latitude)) + cos('.deg2rad($lat).') * cos(radians(latitude)) *
    cos(radians(longitude) - ('.deg2rad($lon).'))) <= '.$rad;

【讨论】:

感谢您的帮助!事实上,在二次搜索中,纬度/经度也必须是弧度。

以上是关于正弦公式 php / mysql的主要内容,如果未能解决你的问题,请参考以下文章

弹跳棒跳的C++正弦波公式

在 Oracle 中查询半正弦公式

MT309正弦的平方差公式

MySQL 大圆距离(Haversine 公式)

初中三角函数的知识点都有哪些,怎么学习

PHP链接MySQL,查询数据库内容,删除数据库内容。。。记住链接公式!!!