如何计算纬度和经度指定的两点之间的距离?
为了澄清,我想要以公里为单位的距离; 这些要点使用WGS84系统,我想了解可用方法的相对准确性.
我目前有一个大约有10k行的数据库.所有这些都具有基于邮政编码中心的经度/纬度.我发现了一个我正在尝试扩展的查询,但总而言之,它在某一点上运行良好.但是,在我下面的例子中,我试图找到半径25英里范围内的东西,这在大多数情况下似乎都有效.我的大多数结果确实在25英里标准范围内屈服,但是我得到了一些从远离86英里到800英里的任何东西.
示例:这是我的中心纬度/经度:37.2790669,-121.874722 =加利福尼亚州圣何塞我得到的结果如:33.016928,-116.846046 =加利福尼亚州圣地亚哥,离圣何塞约355英里.
我当前的查询如下:
SELECT *,(((acos(sin(($lat*pi()/180)) * sin((`latitude`*pi()/180))+cos(($lat*pi()/180))
* cos((`latitude`*pi()/180)) * cos((($lon - `longitude`)*pi()/180))))*180/pi())*60*1.1515)
AS `distance` FROM `geo_locations` HAVING `distance` <= 25 ORDER BY `distance` ASC"
Run Code Online (Sandbox Code Playgroud) 我正在开发一个laravel应用程序,我需要找到所有在用户坐标的某个半径范围内的产品.产品与用户有一对多的关系,因此用户可以拥有多种产品.
我发现,半正式公式可以计算出两点之间的距离,但我似乎无法使它起作用.
我的控制器中有以下查询:
$latitude = 51.0258761;
$longitude = 4.4775362;
$radius = 20000;
$products = Product::with('user')
->selectRaw("*,
( 6371 * acos( cos( radians(" . $latitude . ") ) *
cos( radians(user.latitude) ) *
cos( radians(user.longitude) - radians(" . $longitude . ") ) +
sin( radians(" . $latitude . ") ) *
sin( radians(user.latitude) ) ) )
AS distance")
->having("distance", "<", $radius)
->orderBy("distance")
->get();
Run Code Online (Sandbox Code Playgroud)
我将半径设置为20000用于测试目的,看起来所有产品的距离都是5687,..问题似乎是产品的纬度和经度存储在User表中,但我不确定我如何在我的查询中访问这些.我已经尝试过user.latitude和'user-> latitude',但似乎没有任何效果.
这是我的模特:
产品型号
namespace App;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected …Run Code Online (Sandbox Code Playgroud)