我有$latitude = 29.6815400和$longitude = 64.3647100,现在在MySQL中我想将15个最近的位置放在这些坐标处,并且我打算进行以下查询:
$latitude = 29.6815400
$longitude = 64.3647100
SELECT * FROM places WHERE latitude BETWEEN($latitude - 1, $latitude + 1) AND longitude BETWEEN($longitude - 1, $logintude + 1) LIMIT 15;
您认为这是正确的还是其他建议?
,该怎么办BEETWEEN,因为我想在附近的地方搜索最大50公里的波谷?
BEETWEEN
我忘了说我也可以在运行查询之前使用PHP进行任何操作。
注意: 我不能使用存储过程 。
这里是 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 $latitude2
$longitude2 = $longitude1 + 0.449; //0.449 = 50km/111.321km $latitude2 = $latitude1 + 0.450; // 0.450 = 50km/111km