Problema del vecino más cercano en Postgis 2.0 usando el índice GIST (- función)

25

Estoy intentando usar la nueva función de Postgis 2.0 < - > (Geometry Distance Centroid) para calcular, para cada fila de mi tabla (cosn1), la distancia al polígono más cercano de la misma clase.

Estaba intentando usar el siguiente código:

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;

Pero luego me doy cuenta de la advertencia:

  

Nota: el índice solo se activa si una de las geometrías es una constante (no en una subconsulta / cte). p.ej. 'SRID = 3005; POINT (1011102 450541)' :: geometría en lugar de a.geom

Lo que significa que el índice no se usará en absoluto, y la consulta tardará casi el mismo tiempo que antes de usar:

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)

¿Puede alguien indicarme una solución que me permita mejorar el rendimiento de mi consulta?

Muchas gracias.

    
pregunta Alexandre Neto 30.04.2012 - 18:46

1 respuesta

2

Hum haciendo algunas pruebas en mi máquina sonaba como este operador < - > no está funcionando correctamente. No estoy seguro de que se trate de un error, pero notificó una distancia cero en geometrías no superpuestas. Intriging no?

Bueno, ¿qué hay de las justas optimizaciones de consultas SQL tradicionales? Desde esos resultados inesperados con < - > Operador lo sustituyo por st_centroid. Obtuvo resultados mucho mejores en velocidad.

La semántica de esperanza con st_overlaps se mantiene igual. Al menos esto fue lo que entendí de la documentación sobre < - >

De los documentos en Postigs < - >

  

Para otros tipos de geometría, la distancia entre el punto flotante   Se devuelven los centroides del cuadro delimitador.

En mis datos de prueba con ~ 5.5k, los polígonos aumentaron de ~ 1000 segundos a ~ 5 segundos sin indexación espacial.

De todos modos, ¿por qué usar DISTINCT ON para hacer la agrupación? ¿Veo que algunas personas lo usan pero no existe el grupo por el que se eliminan los duplicados?

Su consulta con optimizaciones de SQL estándar sin el error st_centroid introducido

select g1.gid, min( 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
  AND g1.the_geom && g2.the_geom
GROUP BY
  g1.gid

¡Feliz Navidad!

    
respondido por el cavila 24.12.2012 - 16:16

Lea otras preguntas en las etiquetas