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 (SpatialIndexse utiliza la tabla virtual). ¿Intentó ajustar elsearch_framepara 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()"