查找提供的纬度和经度的最近距离记录的程序[重复]

Posted

技术标签:

【中文标题】查找提供的纬度和经度的最近距离记录的程序[重复]【英文标题】:Procedure for finding nearest distance record for the supplied Latitude and Longitude [duplicate] 【发布时间】:2015-01-23 14:45:00 【问题描述】:

这是我的SQLFiddle,这是我的程序

我想把这个程序改写成简单的操作。

它应该将输入作为 Lat、Lng 并返回与给定 Lat 和 Long 相关的最近的驱动程序 ID、lat、long(按 desc 排序并取第一条记录)。它包含一些我不需要的其他表格。

(问题是我无法找到哪个字段是必需的,哪个不是)

DELIMITER //
CREATE  PROCEDURE `driver_latlong`(IN `lat` DECIMAL(20,9), IN `lng` DECIMAL(20,9))
BEGIN
SET @sql = CONCAT('SELECT sd.DriverId, sd.Lat, sd.Long,  sd1.RadiusOfService, @dist:= ( 6371 * acos( cos( radians(',lat,') ) * cos( radians( sd.Lat ) ) * cos( radians( sd.Long ) - radians(',lng,') ) + sin( radians(',lat,') ) * sin( radians( sd.Lat ) ) ) ) AS distance 
        , Case When @dist <= 1 Then sd1.DeliveryFeeOne When @dist<= 2 Then sd1.DeliveryFeeTwo When @dist<= 3 Then sd1.DeliveryFeeThree Else sd1.DeliveryFeeMore End as deliveryfee
        , Case When @dist <= 1 Then sd1.DeliveryTimeOne When @dist<= 2 Then sd1.DeliveryTimeTwo When @dist<= 3 Then sd1.DeliveryTimeThree Else sd1.DeliveryTimeMore End as deliverytime
        , sd.ShopName, sd.Address, sd.LogoFile FROM driver_latlong sd LEFT JOIN  WHERE sd.Status = \'1\' and sd.Lat != 0 and sd.Long != 0 AND ( 6371 * acos( cos( radians(',lat,') ) * cos( radians( sd.Lat ) ) * cos( radians( sd.Long ) - radians(',lng,') ) + sin( radians(',lat,') ) * sin( radians( sd.Lat ) ) ) ) <= sd1.RadiusOfService  ORDER BY distance ASC;');                
                PREPARE stmt FROM @sql;
                EXECUTE stmt;
                DEALLOCATE PREPARE stmt;
    END //
    DELIMITER ;

注意:其实我是从以前的项目中得到这个程序的,所以不需要其他表,我们引用的表是 driver_latlong

【问题讨论】:

如果您可以确定 5km of Lat 和 5km of Long 等于您可以尝试查询数据库以获取介于 Current Lat - 5km 和 Current Lat + 5km(以及 Long)之间的值,这可能会大大减少您的结果集,但您仍然需要针对结果运行 distancecalc()。 我不明白你的问题。你得到距离作为回报。所以这个例子:echo distancecalc('11.0183', '76.9625', '11.0183', '76.9725'); 向您显示 '1.0913992930028' 的结果。那么现在有什么问题呢? 获取距离不是我的目标,我需要从表中获取与最小距离匹配的记录 【参考方案1】:

使用下面的查询来获取结果并使用您的硬编码值代替 $lat 和 $lon

 SELECT ((ACOS(SIN($lat * PI() / 180) * SIN(lat * PI() / 180) + COS($lat * PI() / 180) * COS(lat * PI() / 180) * COS(($lon – lon) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS `distance` FROM `members` HAVING `distance`<5

【讨论】:

谢谢,请问如何用最少的方法获得最少的记录 你能具体解释一下你想要什么吗? 您的查询给了我距离,但我想获取与提供的前 2 个参数距离最小的记录 您可以使用 order by 和距离(ASC 或 DESC)并获取您想要的任何记录

以上是关于查找提供的纬度和经度的最近距离记录的程序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

用于查找使用纬度和经度之间的距离的Sql返回错误的距离

使用经度和纬度查找给定距离内的所有附近客户

计算给定2点,纬度和经度的距离[重复]

在mysql中使用纬度和经度查找两点之间的距离

给定初始纬度 lng,距离和方位角,在 php 中查找纬度经度点

2个城市之间的经度和纬度距离等式是啥[重复]