Ich habe eine Tabelle mit Polygonen (Zensusblockgruppen) in Postgres. Ich möchte jede Blockgruppe mit der Stadt (einer anderen Polygontabelle) versehen, in der sie sich hauptsächlich befindet. Ist das möglich? Ich denke, ich müsste im Wesentlichen Folgendes erstellen:
select b.*,t.name
from blockgroups b, towns t
where (st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) > .5
aber diese Abfrage dauert ewig (ich habe ungefähr 5.000 Blockgruppen und 375 Städte ...). Irgendwelche Vorschläge, wie diese Abfrage funktioniert, wenn sie falsch ist oder schneller, wenn sie korrekt ist?
postgis
postgresql
Eirvin
quelle
quelle
Antworten:
Die Art und Weise, wie Sie es tun, wird funktionieren, aber es wird zu viel Zeit in Anspruch nehmen, da postgis versucht, die Geometrie der Schnittpunkte jeder Kombination aus "Blockgruppe und Stadt" zu erstellen, selbst wenn sie sich nicht einmal berühren.
Fügen Sie Ihrer WHERE-Klausel eine weitere Bedingungsüberprüfung hinzu, um zu überprüfen, ob die beiden Geometrien sich überschneiden, und setzen Sie sie vor die vorhandene:
Wenn Sie in SQL eine Liste von Bedingungen in der WHERE-Klausel haben, werden diese in der Reihenfolge getestet, in der sie geschrieben werden. Wenn in einem der frühen Vorgänge ein FALSE zurückgegeben wird, überspringt die Abfrage nur die Prüfung der anderen Bedingungen, da das Ergebnis immer FALSE ist.Stellen Sie außerdem sicher, dass Sie über räumliche Indizes für blockgroups.wkb_geometry und towns.wkb_geometry verfügen.
quelle
ST_Intersects
ist hier der richtige Weg, aber der Planer kann die Bedingungen in der Reihenfolge ausführen, in der sie geschrieben wurden, oder auch nicht. Weitere Informationen hierzu finden Sie in den Postgres- Dokumenten .ST_Intersects
UndST_Intersection
ich habe die gleichen Kosten für meine Installation (100). Um ehrlich zu sein, bin ich mir nicht sicher, was der Planer tut, aber es scheint hier immer das Richtige zu tun.Wenn sich einige Ihrer Zensuseinheiten über drei Ihrer Städte erstrecken (und Sie daher nicht mehr als 50% Stürze in einer Stadt garantieren können), können Sie dies zu Alexandres sehr nützlicher Antwort hinzufügen:
Dies schützt grundsätzlich vor folgender Situation - in der die Bereiche in Blau verschwinden würden:
quelle
Mit st_intersects und && können Sie Folgendes verwenden: Calcolo_perc_intersez_postgis
quelle