![](/img/trans.png)
[英]How to find records based on given latitude and longitude with given distance in PostgreSQL
[英]how to search all the location for given distance and given latitude and longitude in laravel
这是我的senario:我通过以下方式在mysql数据库中保存了商店详细信息。
shopName,纬度,经度,
现在,如果有人在经度和距离(如5公里)的位置给出了他的位置,我需要在距离他5公里范围内填写所有商店,
在这里用户是中心,半径是5公里,我需要找到该圈内的所有商店,我的应用程序是在laravel 5.1中开发的
我试图遵循这个代码 ,但它不起作用。
谁能帮我。
您可以在模型中添加以下代码
public function ScopeDistance($query,$from_latitude,$from_longitude,$distance)
{
// This will calculate the distance in km
// if you want in miles use 3959 instead of 6371
$raw = \DB::raw('ROUND ( ( 6371 * acos( cos( radians('.$from_latitude.') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('.$from_longitude.') ) + sin( radians('.$from_latitude.') ) * sin( radians( latitude ) ) ) ) ) AS distance');
return $query->select('*')->addSelect($raw)->orderBy( 'distance', 'ASC' )->groupBy('distance')->having('distance', '<=', $distance);
}
你可以用这样的东西
$ads = Ad::with(['user','photos'])->distance($from_latitude,$from_longitude,$distance)->get();
检查一下: 计算给定2点,纬度和经度的距离
对于问题的代码部分,我认为最快的是将计算分成两部分。
首先我们从坐标建立一个5x5km的正方形,然后在laravel中选择whereBetween子句之间的每个商店。
您使用链接中的公式计算精确距离。 基本上它的5 = <sqrt((纬度1纬度2)^ 2 +(经度1 - 经度2)^ 2)
只需“转换”(latitude1-latitude2)和(longitude1-longitude2)到公里:)
微调参数。我已经给出.50但你可以选择更小的值,以减少覆盖范围。
$latitude = \Input::get('latitude');
$longitude = \Input::get('longitude');
$upper_latitude = $latitude + (.50); //Change .50 to small values
$lower_latitude = $latitude - (.50); //Change .50 to small values
$upper_longitude = $longitude + (.50); //Change .50 to small values
$lower_longitude = $longitude - (.50); //Change .50 to small values
$result = \DB::table('table')
->whereBetween('geo_locations.latitude', [$lower_latitude, $upper_latitude])
->whereBetween('geo_locations.logitude', [$lower_longitude, $upper_longitude])
->get();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.