2012-07-11 8 views
6

Mi objetivo es utilizar mysql POINT (lat, long) para buscar 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:Distancia espacial de Mysql utilizando POINT - No funciona

Tabla:

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; 

Inserción alguna prueba de los datos:

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'); 

La declaración de 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;  

Tratar de utilizar la función 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 recibiendo es: ERROR 1367 (22007): Ilegal no geométrica 'aswkb (un @ 0)' valor 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 encontrar la manera de solucionarlo. Lo importante es que la función 'distancia' se puede usar dinámicamente.

también he intentado esta solución: Find the distance between two points in MYSQL. (using the Point Datatype)

Esta es mi versión de MySQL mysql Ver 14,14 Distrib 5.5.23, para Linux (x86_64) usando readline 5,1

esperanza de alguien experiencia me puede ayudar. ¡Aclamaciones!

+1

Try 'redonda (glength (LineStringFromWKB (LineString (GeomFromText (astext (a)), GeomFromText (astext (b)))))) ' – acraig5075

+0

@ acraig5075 - Gracias por la sugerencia, terminé con casi el mismo resultado. – OMA

Respuesta

7

así que terminé con esto como consulta para el cálculo de 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; 

estoy multiplicarlo 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.

3

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 llamar

SELECT geoDistance(X(point1), Y(point1), X(spoint2), Y(point2)) 

resultado viene en metros

Cuestiones relacionadas