一尘不染

SQL查询,通过给定坐标选择最近的地方

mysql

我有$latitude = 29.6815400$longitude = 64.3647100,现在在MySQL中我想将15个最近的位置放在这些坐标处,并且我打算进行以下查询:

SELECT *
FROM places
WHERE latitude  BETWEEN($latitude  - 1, $latitude  + 1)
AND   longitude BETWEEN($longitude - 1, $logintude + 1)
LIMIT 15;

您认为这是正确的还是其他建议?

,该怎么办BEETWEEN,因为我想在附近的地方搜索最大50公里的波谷?

我忘了说我也可以在运行查询之前使用PHP进行任何操作。

注意: 我不能使用存储过程


阅读 432

收藏
2020-05-17

共1个答案

一尘不染

这里是 PHP 的计算公式之间的距离 两点

function getDistanceBetweenPointsNew($latitude1, $longitude1, $latitude2, $longitude2, $unit = 'Mi') 
{
   $theta = $longitude1 - $longitude2;
   $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2))+
               (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta)));
   $distance = acos($distance); $distance = rad2deg($distance); 
   $distance = $distance * 60 * 1.1515;

   switch($unit) 
   { 
     case 'Mi': break;
     case 'Km' : $distance = $distance * 1.609344; 
   } 
   return (round($distance,2)); 
}

然后添加查询以获取所有距离小于或等于上述记录的记录:

$qry = "SELECT * 
        FROM (SELECT *, (((acos(sin((".$latitude."*pi()/180)) *
        sin((`geo_latitude`*pi()/180))+cos((".$latitude."*pi()/180)) *
        cos((`geo_latitude`*pi()/180)) * cos(((".$longitude."-
        `geo_longitude`)*pi()/180))))*180/pi())*60*1.1515*1.609344) 
        as distance
        FROM `ci_geo`)myTable 
        WHERE distance <= ".$distance." 
        LIMIT 15";

您可以在这里查看类似的计算。

你可以在这里阅读更多

更新:

您必须记住,要计算 经度2经度2, 您需要知道:

每个 纬度 相距69英里(111公里)。
范围从赤道的68.703英里(110.567公里)变化到两极的69.407(111.699公里)(由于地球略呈椭圆形)。这很方便,因为每分钟(1/60度)约为一英里。

的程度 经度 是在最宽的在赤道 69.172英里(111.321)
和在两极逐渐缩小到零。在南北40度之间,经度之间的距离为53英里(85公里)。

因此,$longitude2 $latitude2根据50公里进行计算,则 大约为:

$longitude2 = $longitude1 + 0.449; //0.449 = 50km/111.321km
$latitude2 = $latitude1 + 0.450; // 0.450 = 50km/111km
2020-05-17