J'ai 150 millions de points dans une table de points et je voudrais trouver les quelques points situés en dehors d'une géométrie polygonale donnée. Je sais que 99,9% des points sont dans la géométrie du polygone. Je suis intéressé à trouver les quelques points qui se trouvent en dehors du polygone.
Ma meilleure requête actuelle utilisant des tables PostGIS indexées prend environ 30 minutes. Existe-t-il un moyen d'optimiser la requête suivante en sachant que la plupart des points se trouvent dans le polygone (bordure)?
SELECT COUNT(*)
FROM italy_points pt
JOIN borders poly
ON ST_WITHIN (pt.the_geom, poly.geom)
WHERE poly.iso3 = 'ITA';
Le polygone est essentiellement la frontière administrative de l'Italie. Sommets - 405 000. Pièces - 510. L'enveloppe est beaucoup plus grande que le polygone (le polygone couvre 24% de l'enveloppe)
postgis
postgresql
Prithvi
la source
la source
GROUP BY
la clé primaire des points. (PostgreSQL vous permet de référencer commodément toutes les colonnes de laSELECT
clause qui proviennent d'une table où la clé primaire est incluse dans laGROUP BY
clause.)ST_Within
déjà une vérification de la zone de délimitation qui permet d'utiliser l'index. (Presque toutes les fonctions de PostGIS incluent cette optimisation.) S'il est encore lent, le problème est clairement lié à la complexité du polygone.ST_Intersects
, carST_Within
elle ne correspondrait pas de manière fiable aux conditions aux limites internes.Réponses:
Utilisez ST_Subdivide pour couper votre polygone en petits polygones, enregistrez-les dans une table et créez un index spatial. Faites ensuite votre requête sur les polygones maillés.
Sans cela, l'indexation spatiale ne présente aucun avantage dans votre cas (seulement 1 polygone d'intérêt).
la source