Hoy comencé a jugar con SpatiaLite y ya me topé con un problema.
Para cada ubicación de punto almacenada en tableOne, me gustaría seleccionar un punto más cercano (distancia lineal) de tableTwo.
Hasta ahora se me ocurrió una solución torpe que utiliza VIEW:
CREATE VIEW testview AS
SELECT
A.id ,
B.myValue,
Distance(A.Geometry, B.Geometry) AS distance
FROM tableOne AS A, tableTwo AS B
WHERE distance < 10000
ORDER BY A.Id, distance;
Y entonces:
SELECT * FROM testview
WHERE distance = (SELECT MIN(distance) FROM testview AS t WHERE t.id = testview.id)
Parece hacer el trabajo.
Dos preguntas:
¿Hay alguna manera de realizar dicha consulta sin crear una VISTA?
¿Hay alguna otra forma de optimizar esta consulta para un mejor rendimiento? En un escenario del mundo real, tableOne tendrá cientos de miles de registros, y tableTwo - 1.3 millones.
sql
spatialite
nearest-neighbor
radek
fuente
fuente
Respuestas:
Acabo de probar este SQL y funciona:
Como puede leer aquí "La manera ingenua de llevar a cabo una consulta vecina más cercana es ordenar la tabla de candidatos por distancia desde la geometría de la consulta, y luego tomar el registro con la distancia más pequeña".
Atentamente,
Andrea
fuente
Si no desea calcular las distancias entre todas las combinaciones de puntos, puede usar un índice espacial en una de las tablas:
fuente
f_table_name = 'A'
, ¿necesito reemplazar 'A' con el nombre real de la tabla (tabla uno)? Lo he intentado de cualquier manera y todavía no devuelve nada, ¿por qué podría ser estof_table_name = 'A'
debería serf_table_name = 'tableOne'
. Tenga en cuenta que esta solicitud asume spaceialite> 4.x (SpatialIndex
se utiliza la tabla virtual). ¿Intentó ajustar elsearch_frame
para su caso de uso? En el ejemplo anterior, se supone que los puntos están a una distancia máxima de 10000 metros.Desde la versión 4.4.0, SpatiaLite admite un índice de tabla virtual KNN para los problemas de vecinos más cercanos. Aquí hay una consulta que encuentra la línea más cercana en una tabla de cadenas lineales a cada punto en una tabla de puntos.
fuente
Puede simplificar su consulta de esta manera.
Para una solución más genérica, podría valer la pena intentar convertir esta función de vecino más cercano de PostGIS: http://blog.mackerron.com/2011/03/postgis-nearest-neighbour/
fuente
SQL error: "misuse of aggregate: MIN()"