versiones guia espaƱol descargar actualizar mysql geolocation geospatial spatial

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