这个问题已经在这里有了答案 :
查找两个纬度/经度之间距离的最快方法 (15个答案)
2年前关闭。
我有$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进行任何操作。
注意: 我不能使用存储过程 。
这里是 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
问题内容: 我正在一家电子商店,所以我有3张桌子: 1) 2) 3) 所以我需要使用这种算法打印相关商品:使用标签获取与所选商品最相似的商品。最多的标签是相互的-最合适的项目是 因此,的结果应为:, 对于:, 对于:, 而且我不知道如何通过一个查询按相互标记的数量来排序相似的商品 问题答案: 此查询将返回所有具有最大标签数的物品: 请看这里的小提琴。 否则,这将返回所有项目,即使没有共同标签的项目
问题内容: 这可能比我做的要容易,但是基本上我需要做的是选择列中具有最接近数字的行作为指定值。例如: 数据库中指定列中的3行的值列表:10、15、16 如果我指定我想要最接近14的行,它将选择15的行。 另外,如果有2+行相同的距离,则随机选择其中之一。 问题答案: 一种选择是遵循以下方式: 要选择随机记录,可以将其添加到子句中。这种方法的缺点是您不能从索引中得到任何好处,因为您必须对派生值进行排
问题内容: 我需要实现一个使用第一个查询参数来标识操作的Web服务,即客户端调用将类似于:或。 似乎我无法使用@Path注释来区分方法,因为区别特征在于查询参数。以下示例也引发了异常: 有没有一种方法可以根据查询参数指定要使用的方法?还是我真的必须定义一种方法并在其中检查是否设置了某些查询参数? 问题答案: 我认为Claudio是正确的-您可以使用Jersey,但是您将自己处理查询参数,因为它仅在
问题内容: 我有一个如下查询: 结果如下:中心名称和交换数量 我喜欢从此结果(第二行)中选择最大值,除了排序和选择第一行之外,还有谁能帮助我进行MAX查询。 问题答案: 那应该工作
问题内容: 我试图弄清楚如何编写一个MySQL查询,该查询将返回日期最近的3个事件。 这是我的桌子: 因此,查询结果应为ID的1,2,5,因为它们是与当前日期相比最接近的ID。 编辑: 查询应该只找到将来的事件。 问题答案: 这意味着1天前的事件与将来1天的事件一样接近。如果您只想要尚未发生的事件,请执行
问题内容: 我有一张桌子来存储事件(目前大约有5M,但还会有更多)。每个事件都有我要对此查询关注的两个属性- (纬度和经度对)和。 我的目标是 :对于给定的位置范围(SW / NE纬度/经度对,因此有4个浮点数)将返回落入这些范围之内的前100个事件。 我目前正在使用以下查询: 现在暂时搁置此查询无法处理的日期线回绕问题。 对于较小的位置范围,此方法效果很好,但是每当我尝试使用较大的位置范围时,时