Я никогда раньше не делал этого и пытаюсь работать через онлайн-руководство, но я не могу найти хороший пример с параметрами.
CREATE PROCEDURE `calcdistance` (
IN ulat varchar,
IN ulon varchar,
IN clat varchar,
IN clon varchar)
BEGIN
Select DEGREES(ACOS(SIN(RADIANS(ulat))
* SIN(RADIANS(clat))
+ COS(RADIANS(ulat))
* COS(RADIANS(clat))
* COS(RADIANS(ulon - ulon))))) * 69.09 AS distance
END
ошибка, которую администратор MySQL дает мне, когда я пытаюсь это сделать:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '  IN ulat varchar,
    IN ulon varchar,
    IN clat varchar,
    IN cl' at line 2 (error 1064)
вы можете попробовать
DELIMITER $$
DROP PROCEDURE IF EXISTS calcdistance$$
CREATE PROCEDURE `calcdistance` (IN ulat VARCHAR(50), IN ulon VARCHAR(50), IN clat VARCHAR(50), IN clon VARCHAR(50))
BEGIN
SELECT
DEGREES(ACOS(SIN(RADIANS(ulat))
* SIN(RADIANS(clat))
+ COS(RADIANS(ulat))
* COS(RADIANS(clat))
* COS(RADIANS(ulon - ulon))))
* 69.09 AS distance;
END$$
DELIMITER ;
В вашем запросе varchar должен быть varchar (255). И я думаю, что хранимая процедура должна закончиться; по умолчанию, если вы не используете DELIMITER.
Расстояние большого круга
Найдите расстояние в километрах между двумя точек на поверхности земли. Это просто проблема хранимые функции. Для приближения первого порядка, игнорировать отклонения земной поверхности от совершенно сферической. Тогда расстояние в радианах дается рядом тригонометрических формулы. ACOS и COS ведут себя разумно:
COS(lat1-lat2)*(1+COS(lon1-lon2)) - COS(lat1+lat2)*(1-COS(lon1-lon2))
rads = ACOS( --------------------------------------------------------------------- )
2
Нам нужно преобразовать градусы широты и долготы в радианы, и мы необходимо знать длину в км одного радиана на поверхности земли, что составляет 6378,388. Функция:
set log_bin_trust_function_creators=TRUE;
DROP FUNCTION IF EXISTS GeoDistKM;
DELIMITER |
CREATE FUNCTION GeoDistKM( lat1 FLOAT, lon1 FLOAT, lat2 FLOAT, lon2 FLOAT ) RETURNS float
BEGIN
DECLARE pi, q1, q2, q3 FLOAT;
DECLARE rads FLOAT DEFAULT 0;
SET pi = PI();
SET lat1 = lat1 * pi / 180;
SET lon1 = lon1 * pi / 180;
SET lat2 = lat2 * pi / 180;
SET lon2 = lon2 * pi / 180;
SET q1 = COS(lon1-lon2);
SET q2 = COS(lat1-lat2);
SET q3 = COS(lat1+lat2);
SET rads = ACOS( 0.5*((1.0+q1)*q2 - (1.0-q1)*q3) );
RETURN 6378.388 * rads;
END;
|
DELIMITER ;
-- toronto to montreal (505km):
select geodistkm(43.6667,-79.4167,45.5000,-73.5833);
+----------------------------------------------+
| geodistkm(43.6667,-79.4167,45.5000,-73.5833) |
+----------------------------------------------+
| 505.38836669921875 |
+----------------------------------------------+
(Настройка
log_bin_trust_function_creators
является наиболее удобным способом которые применяются с 5.0.6.)
SELECT DEGREES(ACOS(SIN(RADIANS(ulat)) * SIN(RADIANS(clat)) + COS(RADIANS(ulat)) * COS(RADIANS(clat)) * COS(RADIANS(ulon - ulon))))) * 69.09 AS distance