J'essaie d'utiliser la nouvelle fonction de Postgis 2.0 <-> (Geometry Distance Centroid) afin de calculer, pour chaque ligne de ma table (cosn1), la distance au polygone le plus proche de la même classe.
J'essayais d'utiliser le code suivant:
WITH index_query AS (
SELECT g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN
FROM "cosn1" As g1, "cosn1" As g2
WHERE g1.gid <> g2.gid AND g1.class = g2.class
ORDER BY g1.gid, g1.the_geom <-> g2.the_geom)
SELECT DISTINCT ON (ref_gid) ref_gid, ENN
FROM index_query
ORDER BY ref_gid, ENN;
Mais alors je réalise l'avertissement:
Remarque: L'index ne démarre que si l'une des géométries est une constante (pas dans une sous-requête / cte). par exemple 'SRID = 3005; POINT (1011102 450541)' :: geometry au lieu de a.geom
Cela signifie que l'index ne sera pas utilisé du tout, et la requête prendra presque le même temps qu'avant l'utilisation:
SELECT DISTINCT ON(g1.gid) g1.gid As ref_gid, ST_Distance(g1.the_geom,g2.the_geom) As ENN
FROM "cosn1" As g1, "cosn1" As g2
WHERE g1.gid <> g2.gid AND g1.class = g2.class
ORDER BY g1.gid, ST_Distance(g1.the_geom,g2.the_geom)
Quelqu'un peut-il m'indiquer une solution de contournement qui me permet d'améliorer les performances de ma requête?
Merci beaucoup.
nearest-neighbor
postgis-2.0
Alexandre Neto
la source
la source
Réponses:
Le fait de faire des tests sur ma machine sonnait comme si cet opérateur <-> ne fonctionnait pas correctement. Je ne suis pas sûr que ce soit un bug mais il a signalé une distance nulle sur des géométries non superposées. Intrigant non?
Et qu'en est-il des optimisations de requêtes SQL traditionnelles? Depuis ces résultats inattendus avec l'opérateur <-> je le remplace par st_centroid. A obtenu de bien meilleurs résultats en vitesse.
La sémantique de Hope avec st_overlaps reste la même. Au moins c'est ce que j'ai compris de la documentation sur <->
À partir de documents sur Postigs <->
Sur mes données de test avec ~ 5,5k polygones, la vitesse est passée de ~ 1000 secondes à ~ 5 secondes sans indexation spatiale.
Quoi qu'il en soit, pourquoi utiliser DISTINCT ON pour faire un regroupement? Je vois que certaines personnes l'utilisent mais que le groupe n'existe pas pour éliminer les doublons?
Votre requête avec des optimisations SQL standard sans l'erreur st_centroid introduite
Joyeuses fêtes de Noël!
la source