Tengo 150 millones de puntos en una tabla de puntos y me gustaría encontrar los pocos puntos que se encuentran fuera de una geometría de polígono dada. Sé que el 99.9% de los puntos están dentro de la geometría del polígono. Estoy interesado en encontrar los pocos puntos que se encuentran fuera del polígono.
Mi mejor consulta actual usando tablas PostGIS indexadas tarda unos 30 minutos en completarse. ¿Hay alguna manera de optimizar la siguiente consulta sabiendo que la mayoría de los puntos están dentro del polígono (borde)?
SELECT COUNT(*)
FROM italy_points pt
JOIN borders poly
ON ST_WITHIN (pt.the_geom, poly.geom)
WHERE poly.iso3 = 'ITA';
El polígono es básicamente la frontera administrativa de Italia. Vértices - 405,000. Partes - 510. El sobre es mucho más grande que el polígono (el polígono cubre el 24% del sobre)
postgis
postgresql
Prithvi
fuente
fuente
GROUP BY
la clave principal de los puntos. (PostgreSQL convenientemente le permite hacer referencia a cualquier columna de laSELECT
cláusula que provenga de una tabla donde se incluye la clave primaria en laGROUP BY
cláusula).ST_Within
ya hace una verificación de cuadro de límite que permite usar el índice. (Casi todas las funciones de PostGIS incluyen esta optimización.) Si aún es lenta, entonces claramente el problema es con la complejidad del polígono.ST_Intersects
, yaST_Within
que no coincidiría de manera confiable con las condiciones de contorno internas.Respuestas:
Use ST_Subdivide para cortar su polígono en polígonos más pequeños, guárdelos en una tabla y cree un índice espacial. Luego haga su consulta sobre los polígonos cuadriculados.
Sin eso, la indexación espacial no proporciona ninguna ventaja en su caso (solo 1 polígono de interés).
fuente