Estoy tratando de usar Postgis 2.0 nueva función <-> (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 tratando de 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). por ejemplo, '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 tomará 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)
¿Alguien puede señalarme una solución alternativa que me permita mejorar el rendimiento de mi consulta?
Muchas gracias.
nearest-neighbor
postgis-2.0
Alexandre Neto
fuente
fuente
Respuestas:
Hum haciendo algunas pruebas en mi máquina sonaba como si este operador <-> no funcionara correctamente. No estoy seguro de que sea un error, pero informó una distancia cero en geometrías no superpuestas. ¿No intrigante?
¿Y qué hay de las justas optimizaciones de consultas SQL tradicionales? Desde esos resultados inesperados con el operador <->, lo reemplazo con st_centroid. Obtuve resultados mucho mejores en velocidad.
La semántica de la esperanza con st_overlaps se mantiene igual. Al menos esto fue entendido por la documentación sobre <->
De documentos en Postigs <->
En mis datos de prueba con ~ 5.5k polígonos se aceleró de ~ 1000 segundos a ~ 5 segundos sin indexación espacial.
De todos modos, ¿por qué usar DISTINCT ON para agrupar? ¿Veo a algunas personas usándolo pero no existe el grupo by para eliminar duplicados?
Su consulta con optimizaciones SQL estándar sin el error st_centroid introducido
Felices vacaciones de navidad!
fuente