php - 为提供的纬度、经度查找最近的司机的程序

标签 php mysql sql stored-procedures geolocation

这是我的 SQLFiddle这是我的程序

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

它应该以纬度、经度作为输入,并返回与给定的纬度和经度最近的 driverid、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

谢谢

最佳答案

我假设您不太关心地球的曲率,所以我将经度和纬度视为正方形网格上的轴。它使使用毕达哥拉斯的计算相当简单。

DELIMITER //

CREATE PROCEDURE `getNearestDriver` (
  IN `inLat` DECIMAL(20,9), IN `inLong` DECIMAL(20,9),
  OUT `outDriverId` INT(11), OUT `outLat` FLOAT, OUT `outLong` FLOAT
)
BEGIN

    SELECT
        `DriverId`, `Lat`, `Long` INTO `outDriverId`, `outLat`, `outLong`
    FROM `driver_latlong`
    # If the difference in lat and long make up two sides of a
    # right angled triangle then the hypotenuse is the distance.
    ORDER BY ( POWER(`inLat` - `Lat`, 2) + POWER(`inLong` - `Long`, 2) )
    LIMIT 1;

END//

DELIMITER ;

SET @myLat = 11;
SET @myLong = 77;
SET @DriverId = 0;
SET @DriverLat = 0;
SET @DriverLong = 0;

CALL getNearestDriver( @myLat, @myLong, @DriverId, @DriverLat, @DriverLong );

SELECT @DriverId, @DriverLat, @DriverLong;

DROP PROCEDURE `getNearestDriver`;

DROP TABLE `driver_latlong`;

关于php - 为提供的纬度、经度查找最近的司机的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28132621/

相关文章:

php - MySQL 查询获取下一条记录,如果存在则为 0

php - 根据数据库中的值自动检查复选框

php - 软件包 libapache2-mod-auth-mysql 不可用

php - 尝试将 CakePHP Find() 转换为 MySql 语句

mysql - 防止恶意sql注入(inject)

mysql - 如何在两列上设置唯一键并在 MySQL 中仍然具有自动递增的主索引?

php - 我怎样才能只允许特权用户使用 php 下载 pdf?

php - 无法在 php 中使用变量 'insert into'

php - MySQL 错误 : Does not allow column name keys. ..有人知道为什么吗?

mysql - 当我尝试将它从 mysql 迁移到 Oracle 时出现 SQL 语句错误