2014-02-12 5 views
3

все.MySQL Функция для вычисления расстояния Haversine

Я хочу создать функцию mysql, которая вычисляет расстояние haversine между двумя геокодами.

CREATE FUNCTION haversineDistance 
       (
        lat1 VARCHAR(256), 
        long1 VARCHAR(256), 
        lat2 VARCHAR(256), 
        long2 VARCHAR(256) 
       ) 
RETURNS FLOAT DETERMINISTIC 
BEGIN 

     DECLARE radLat1 FLOAT; 
     DECLARE radLong1 FLOAT; 
     DECLARE radLat2 FLOAT; 
     DECLARE radLong2 FLOAT; 
     DECLARE dLat FLOAT; 
     DECLARE dLong FLOAT; 
     DECLARE cordLength FLOAT; 
     DECLARE centralAngle FLOAT; 
     DECLARE distance FLOAT; 

     SET radLat1 = CAST(lat1 AS FLOAT) * PI()/180; 
     SET radLong1 = CAST(long1 AS FLOAT) * PI()/180; 
     SET radLat2 = CAST(lat2 AS FLOAT) * PI()/180; 
     SET radLong2 = CAST(long2 AS FLOAT) * PI()/180; 
     SET dLat = radLat2 - radLat1; 
     SET dLong = radLong2 - radLong2; 
     SET cordLength = POW(SIN(dLat/2),2)+COS(lat1)*COS(lat2)*POW(SIN(dLon/2),2); 
     SET centralAngle = 2 * ATAN2(SQRT(cordLength), SQRT(1-cordLength)); 
     SET distance = 6367 * centralAngle; 

     RETURN distance; 
END 

Но у меня возникла ошибка:

1064 - У вас возникла ошибка в синтаксисе SQL; в руководстве, соответствует версии сервера MySQL для правильного синтаксиса использовать около «» в строке 4

Каждый имеет идея?

Заранее спасибо.

+0

Это поможет нам помочь вам, если мы узнаем, что такое линия 4. –

ответ

2

Хорошо.

Решено.

DELIMITER $$ 
CREATE FUNCTION haversineDistance 
       (
        lat1 VARCHAR(256), 
        long1 VARCHAR(256), 
        lat2 VARCHAR(256), 
        long2 VARCHAR(256)) 
RETURNS FLOAT DETERMINISTIC 
BEGIN 

     DECLARE radLat1 FLOAT; 
     DECLARE radLong1 FLOAT; 
     DECLARE radLat2 FLOAT; 
     DECLARE radLong2 FLOAT; 
     DECLARE dLat FLOAT; 
     DECLARE dLong FLOAT; 
     DECLARE cordLength FLOAT; 
     DECLARE centralAngle FLOAT; 
     DECLARE distance FLOAT; 

     SET radLat1 = CAST(lat1 AS DECIMAL(10,10)) * PI()/180; 
     SET radLong1 = CAST(long1 AS DECIMAL(10,10)) * PI()/180; 
     SET radLat2 = CAST(lat2 AS DECIMAL(10,10)) * PI()/180; 
     SET radLong2 = CAST(long2 AS DECIMAL(10,10)) * PI()/180; 
     SET dLat = radLat2 - radLat1; 
     SET dLong = radLong2 - radLong2; 
     SET cordLength = POW(SIN(dLat/2),2)+COS(lat1)*COS(lat2)*POW(SIN(dLon/2),2); 
     SET centralAngle = 2 * ATAN2(SQRT(cordLength), SQRT(1-cordLength)); 
     SET distance = 6367 * centralAngle; 

     RETURN distance; 
END 
0

Прямо сейчас, вы получаете сообщение об ошибке, из-за символов с запятой, присутствующих в качестве разделителя строк в вашей функции.

Чтобы объяснить его дальше, непосредственно цитируя MySQL documentation

По умолчанию MySQL распознает точку с запятой в качестве разделителя заявление, поэтому вы должны переопределить разделитель временно вызвать MySQL передать все хранится определение программы к серверу.

Это означает, что вы должны временно отменить разделитель по умолчанию для компиляции вашей программы. Enacapsulate ваша программа между

DELIMITER $$ 
    your code for function 
$$ 

, а затем попробовать.

EDIT: Вы можете изменить обратно разделитель, указав разделитель по умолчанию снова

mysql> DELIMITER ; 
+0

Спасибо! Ваше решение устранило мою проблему. – adeltahir

Смежные вопросы