J'ai commencé à jouer avec SpatiaLite aujourd'hui et j'ai déjà rencontré un problème.
Pour chaque emplacement de point stocké dans tableOne, je voudrais sélectionner un point (distance linéaire) le plus proche de tableTwo.
Jusqu'à présent, j'ai trouvé une solution maladroite qui utilise 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;
Et alors:
SELECT * FROM testview
WHERE distance = (SELECT MIN(distance) FROM testview AS t WHERE t.id = testview.id)
semble faire le travail.
Deux questions:
Existe-t-il un moyen d'effectuer une telle requête sans créer de VUE?
Existe-t-il un autre moyen d'optimiser cette requête pour de meilleures performances? Dans un scénario réel, tableOne aura des enregistrements de plusieurs centaines de milliers de couples, et tableTwo - 1,3 million.
Réponses:
Je viens de tester ce SQL et ça marche:
Comme vous pouvez le lire ici "La façon naïve d'effectuer une requête de voisin le plus proche est d'ordonner la table candidate par distance de la géométrie de la requête, puis de prendre l'enregistrement avec la plus petite distance".
Meilleures salutations,
Andrea
la source
Si vous ne souhaitez pas calculer les distances entre toutes les combinaisons de points, vous pouvez utiliser un index spatial sur l'une des tables:
la source
f_table_name = 'A'
, dois-je remplacer «A» par le nom réel de la table (table un)? J'ai essayé de toute façon et cela ne retourne toujours rien, pourquoi cela pourrait-il êtref_table_name = 'A'
devrait l'êtref_table_name = 'tableOne'
. Notez que cette demande suppose une spatialite> 4.x (SpatialIndex
une table virtuelle est utilisée). Avez-vous essayé d'ajuster lesearch_frame
pour votre cas d'utilisation? Dans l'exemple ci-dessus, les points sont supposés être à une distance maximale de 10000 mètres.Depuis la version 4.4.0, SpatiaLite prend en charge un index de table virtuelle KNN pour les problèmes de voisin le plus proche. Voici une requête qui recherche la ligne la plus proche dans une table de chaîne de lignes de chaque point d'une table de points.
la source
Vous pouvez simplifier votre requête comme ceci.
Pour une solution plus générique, il pourrait être utile d'essayer de convertir cette fonction PostGIS Nearest Neighbour: http://blog.mackerron.com/2011/03/postgis-nearest-neighbour/
la source
SQL error: "misuse of aggregate: MIN()"