versiones español ejemplo descargar definicion datos comandos mysql algorithm geolocation location query-builder

español - Encuentre los puntos más cercanos con MySQL desde la Tabla de puntos



mysql workbench (2)

He encontrado una solución mejor que la solución de @ 1000111.

Hay un tipo de base de datos personalizada en MySQL para este tipo de datos que ofrece un mejor rendimiento.

OpenGIS en MySQL es perfecto para esto.

Las funciones se dan aquí .

Se proporciona una definición ilustrativa en esta pregunta de StackOverflow .

Mi solución es así--

Tabla DB -

CREATE TABLE geoTable ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30) NOT NULL, geoPoint POINT NOT NULL, SPATIAL INDEX(geoPoint) ) ENGINE=MyISAM; INSERT INTO geoTable (name, geoPoint) VALUES ( "A", GeomFromText(''POINT(0.1 -1.01)'') ), ( "B", ST_GeomFromText(''POINT(56.31 2.81)'') ), ( "C", ST_GeomFromText(''POINT(11.1 1.176)'') ), ( "ui", ST_GeomFromText(''POINT(9.1 2.1)'') );

Consulta SQL -

SELECT id, name, X(geoPoint) AS "latitude", Y(geoPoint) AS "longitude", ( GLength( LineStringFromWKB( LineString( geoPoint, GeomFromText(''POINT(51.5177 -0.0968)'') ) ) ) ) AS distance FROM geoTable ORDER BY distance ASC;

Un ejemplo de SQL Fiddle se da aquí .

Ver el tiempo de ejecución

Para 150 entradas, es solo 13ms.

Tengo un esquema DB así (de este tutorial de Google ) -

Entonces los puntos reales en un gráfico para ellos son como esto-

Lo que quiero es encontrar puntos cerca de un punto dado (por punto_id ) punto ordenado por distancia

La ubicación de un punto (x,y) es ( point_x , point_y ) en DB

Quiero resolverlo con MySQL porque mi DB ya está en MySQL.

Actualizar-

Encontrar distancia de 2 puntos es tan fácil como este-

Quiero ordenar la distancia con MySQL.

Re-

Para eliminar las confusiones, quiero los puntos dentro del círculo, más adelante. Pero ahora quiero encontrar solo los puntos ordenados.

Entonces puedes ignorar los círculos.

No tengo ni idea de cómo hacerlo, ¿alguien puede ayudarme?


Pruebe esta consulta por favor [un enfoque directo]:

Supongamos que quiere encontrar los 20 puntos más cercanos del punto con point_id = 5

SET @givent_point_id := 5;

SELECT P1.point_id, P1.point_name, P1.point_x, P1.point_y, (POW(ABS((P2.point_x - P1.point_x)),2) + POW(ABS((P2.point_y - P1.point_y)),2)) AS sqr_distance FROM Point P1, (SELECT point_x,point_y FROM Point WHERE point_id = @givent_point_id) P2 WHERE P1.point_id <> @givent_point_id ORDER BY sqr_distance LIMIT 20;

Demo aquí

Más: Puede echar un vistazo al DATATYPE ESPACIAL DE MySQL .

Los índices espaciales de MySQL usan R-tree como estructura de datos que está especialmente diseñada para los métodos de acceso espacial.

Los árboles-R son estructuras de datos de árbol utilizadas para métodos de acceso espacial, es decir, para indexar información multidimensional, como coordenadas geográficas, rectángulos o polígonos.