MySQL пространственное расстояние с использованием точки - не работает
моя цель-использовать MySQL POINT (lat,long) для поиска близлежащих объектов в базе данных. Я пытаюсь сделать что-то вроде в нижней части этого урока http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL . Вот что у меня есть:
стол:
CREATE TABLE mark (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) DEFAULT NULL,
loc POINT NOT NULL,
SPATIAL KEY loc (loc)
) ENGINE=MyISAM;
вставка некоторых тестовых данных:
INSERT INTO mark (loc,name) VALUES (POINT(59.388433,10.415039), 'Somewhere 1');
INSERT INTO mark (loc,name) VALUES (POINT(63.41972,10.39856), 'Somewhere 2');
объявление функции расстояния:
DELIMITER $$
CREATE FUNCTION `distance`
(a POINT, b POINT)
RETURNS double DETERMINISTIC
BEGIN
RETURN
round(glength(linestringfromwkb(linestring(asbinary(a),
asbinary(b)))));
END $$
DELIMITER;
попытка использовать функцию для поиска бывший.:
SELECT name, distance(mark.loc, GeomFromText( ' POINT(31.5 42.2) ' )) AS cdist
FROM mark
ORDER BY
cdist limit 10;
или:
SELECT DISTINCT
dest.name,
distance(orig.loc, dest.loc) as sdistance
FROM
mark orig,
mark dest
having sdistance < 10
ORDER BY
sdistance limit 10;
проблема, которую я получаю: ошибка 1367 (22007): незаконное негеометрическое значение " aswkb (a@0)", найденное во время синтаксического анализа, или Ошибка 1416 (22003): не удается получить объект геометрии из данных, отправленных в поле геометрии
Я не могу понять, как это решить. Важно то, что функция "расстояние" может использоваться динамически.
Я также пробовал это решение:найти расстояние между двумя точки в MYSQL. (используя тип данных Point)
Это моя версия mysql mysql Ver 14.14 Distrib 5.5.23, для Linux (x86_64) с помощью readline 5.1
надеюсь, кто-то опыт может мне помочь. Ура!
2 ответов
поэтому я закончил с этим как запрос для вычисления расстояния, пример:
SELECT glength(LineStringFromWKB(LineString(GeomFromText(astext(PointFromWKB(POINT(63.424818,10.402457)))),GeomFromText(astext(PointFromWKB(POINT(663.422238,10.398996)))))))*100
AS distance;
Я умножив его на 100, чтобы получить приближение в километрах. Результат не точный, но "ок". Если кто-то знает лучший способ, не стесняйтесь комментировать.
определите пользовательскую функцию
CREATE DEFINER=`test`@`%` FUNCTION `geoDistance`(`lon1` DOUBLE, `lat1` DOUBLE, `lon2` DOUBLE, `lat2` DOUBLE)
RETURNS double
LANGUAGE SQL
DETERMINISTIC
NO SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE v DOUBLE;
SELECT cos(radians(lat1))
* cos(radians(lat2))
* cos(radians(lon2) - radians(lon1))
+ sin(radians(lat1))
* sin(radians(lat2)) INTO v;
RETURN IF(v > 1, 0, 6371000 * acos(v));
END
затем вызов
SELECT geoDistance(X(point1), Y(point1), X(spoint2), Y(point2))
результат приходит в