Ich habe 150 Millionen Punkte in einer Punktetabelle und möchte die wenigen Punkte finden, die außerhalb einer bestimmten Polygongeometrie liegen. Ich weiß, dass 99,9% der Punkte innerhalb der Polygongeometrie liegen. Ich bin daran interessiert, die wenigen Punkte zu finden, die außerhalb des Polygons liegen.
Meine derzeit beste Abfrage mit indizierten PostGIS-Tabellen dauert etwa 30 Minuten. Gibt es eine Möglichkeit, die folgende Abfrage zu optimieren, wenn Sie wissen, dass sich die meisten Punkte innerhalb des Polygons (Rahmens) befinden?
SELECT COUNT(*)
FROM italy_points pt
JOIN borders poly
ON ST_WITHIN (pt.the_geom, poly.geom)
WHERE poly.iso3 = 'ITA';
Das Polygon ist im Grunde die Admin 0-Grenze Italiens. Eckpunkte - 405.000. Teile - 510. Der Umschlag ist viel größer als das Polygon (das Polygon bedeckt 24% des Umschlags)
postgis
postgresql
Prithvi
quelle
quelle
GROUP BY
den Primärschlüssel der Punkte. (Mit PostgreSQL können Sie bequem auf alle Spalten in derSELECT
Klausel verweisen , die aus einer Tabelle stammen, in der der Primärschlüssel in derGROUP BY
Klausel enthalten ist.)ST_Within
bereits ein Grenzfeld-Check durch, mit dem der Index verwendet werden kann. (Fast alle Funktionen von PostGIS beinhalten diese Optimierung.) Wenn sie immer noch langsam ist, liegt das Problem eindeutig in der Komplexität des Polygons.ST_Intersects
, daST_Within
sie nicht zuverlässig mit internen Randbedingungen übereinstimmt.Antworten:
Verwenden Sie ST_Subdivide , um Ihr Polygon in kleinere Polygone zu schneiden, diese in einer Tabelle zu speichern und einen räumlichen Index zu erstellen. Stellen Sie dann Ihre Abfrage für die gerasterten Polygone.
Ohne dies bietet die räumliche Indizierung in Ihrem Fall keine Vorteile (nur 1 Polygon von Interesse).
quelle