计算MySQL

时间:2017-08-10 04:08:43

标签: mysql stored-procedures geolocation haversine

这可能看起来很常见。 我有兴趣找到所有的zipcodes和表格行中给出的zipcodes的距离,并将它们显示为一个表格。我尝试为此编写过程SQL但是我失败了。直到现在我只能将lat / long的单个zipcode硬编码到arcsine公式以获得相邻的拉链,我想检索表格中的所有拉链以及所有相邻的拉链和距离。

我发现难以遍历所有的zipcode并访问各自的Lat / Lng值

表的架构是

enter image description here

我的代码是:

CREATE PROCEDURE cursor_row()
BEGIN
DECLARE zip INT ;
DECLARE lat FLOAT ;
DECLARE lng FLOAT;

DECLARE zip_cursor CURSOR FOR 
    SELECT Zip_Code , lat_radians, lng_radians 
    FROM ZipLatLngRadians;

DECLARE CONTINUE handler FOR NOT found SET done=1;

SET done = 0 ;

OPEN zip_cursor;

zip_loop: LOOP
    FETCH zip_cursor INTO zip , lat , lng;
    IF done = 1 then leave zip_loop;

    ELSE CALL zip_procedure(zip,lat,lng)

    END IF;

END LOOP zip_loop;
CLOSE zip_cursor
DEALLOCATE zip_cursor
END ;
DELIMITER //
  

我不知道在两个程序中我实际上做错了什么

我需要在cursor_row()过程中调用zip_nearby()过程。因此cursor_row()可以循环遍历表的每一行并将zipcode,lat,long传递给zip_nearby()作为参数和zip_nearby()将给出其参数的结果,如下面在黑色背景图像中所示。

DELIMITER //

CREATE PROCEDURE zip_nearby (IN p_lat1 double,IN p_long1 double,IN p_radius 
double) 

BEGIN 
    SELECT (2*3956*ASIN( (SQRT( POWER(SIN(((lat_radians-p_lat1))/2),2) + 
       COS(p_lat1) * COS(lat_radians) * POWER(SIN(((abs(lng_radians)-
       p_long1))/2),2) )) ) ) AS dist, Zip_Code FROM ZipLatLngRadians 
    WHERE (2*3956*ASIN( (SQRT( POWER(SIN(((lat_radians-p_lat1))/2),2) + 
       COS(p_lat1) * COS(lat_radians) * POWER(SIN(((abs(lng_radians)-
       p_long1))/2),2) )) ) ) < p_radius ORDER BY dist; 
END
// 

DELIMITER ;

enter image description here

这是我通过在最左边的列中硬编码1个zip来获得的结果 我想找到最左边一列中的所有拉链和所有拉链 邻近的拉链和它们的距离

0 个答案:

没有答案