mysql - guia - qgis manual
Distancia espacial Mysql usando POINT-No funciona (2)
Mi objetivo es utilizar mysql POINT (lat, long) para encontrar entidades cercanas en la base de datos. Estoy tratando de hacer algo como en la parte inferior de este tutorial http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL . Esto es lo que tengo:
Mesa:
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;
Insertar algunos datos de prueba:
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'');
Declarando la función de distancia:
DELIMITER $$
CREATE FUNCTION `distance`
(a POINT, b POINT)
RETURNS double DETERMINISTIC
BEGIN
RETURN
round(glength(linestringfromwkb(linestring(asbinary(a),
asbinary(b)))));
END $$
DELIMITER;
Intentando usar la función para buscar ex .:
SELECT name, distance(mark.loc, GeomFromText( '' POINT(31.5 42.2) '' )) AS cdist
FROM mark
ORDER BY
cdist limit 10;
o:
SELECT DISTINCT
dest.name,
distance(orig.loc, dest.loc) as sdistance
FROM
mark orig,
mark dest
having sdistance < 10
ORDER BY
sdistance limit 10;
El problema que estoy obteniendo es: ERROR 1367 (22007): valor ''aswkb (a @ 0)'' no geométrico ilegal encontrado durante el análisis, o ERROR 1416 (22003): No se puede obtener el objeto de geometría de los datos que envía al campo GEOMETRÍA
Parece que no puedo entender cómo resolver esto. Lo importante es que la función ''distancia'' se puede usar dinámicamente.
También probé esta solución: encuentra la distancia entre dos puntos en MYSQL. (usando el tipo de datos Point)
Esta es mi versión mysql mysql Ver 14.14 Distrib 5.5.23, para Linux (x86_64) usando readline 5.1
Espero que la experiencia de alguien me pueda ayudar. ¡Aclamaciones!
Así que terminé con esto como una consulta para calcular la distancia, un ejemplo:
SELECT glength(LineStringFromWKB(LineString(GeomFromText(astext(PointFromWKB(POINT(63.424818,10.402457)))),GeomFromText(astext(PointFromWKB(POINT(663.422238,10.398996)))))))*100
AS distance;
Lo estoy multiplicando por 100 para obtener una aproximación en kilómetros. El resultado no es exacto, sino "bien". Si alguien conoce una mejor manera, no dude en comentar.
definir una función personalizada
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
luego llame
SELECT geoDistance(X(point1), Y(point1), X(spoint2), Y(point2))
el resultado viene en metros