Begrenzungsrahmen für PostGIS-Tabelle

19

Gibt es eine einfache Möglichkeit, den Begrenzungsrahmen für eine ganze Tabelle in PostGIS abzurufen?

Ulrik
quelle

Antworten:

26

ST_Extent sollte den Trick machen.

ST_Extent - eine Aggregatfunktion, die den Begrenzungsrahmen zurückgibt, der die Geometriezeilen begrenzt.

So angewendet:

SELECT ST_Extent(the_geom) as table_extent FROM your_table;
Underdunkel
quelle
13

Wie @underdark antwortete , erledigt ST_Extent die Aufgabe, aber denken Sie daran, dass es keine Geometrie zurückgibt , sondern eine box2d. Wenn Sie einen Geometrietyp benötigen, sollten Sie so etwas verwenden

SELECT ST_SetSRID(ST_Extent(the_geom), THE_SRID) as table_extent FROM your_table;

Wenn Sie den Begrenzungsrahmen für jede der Zeilen benötigen, können Sie auch ST_Extenteine Fälschung GROUP BY wie die folgende verwenden:

SELECT ST_SetSRID(ST_Extent(the_geom),THE_SRID) as table_extent FROM your_table GROUP BY gid;

Angenommen, gid ist der Primärschlüssel der Tabelle

Aber ST_Envelope wird einen besseren Job machen als @ bugmenot123 in den Kommentaren

SELECT ST_Envelope(geom) FROM your_table ;
Francisco Puga
quelle
1
Wenn Sie für jede Zeile ohne Aggregation einen Begrenzungsrahmen benötigen, verwenden Sie einfach ST_Envelope! Das ist jedoch nicht das, wonach gefragt wurde.
Bugmenot123
1
Sie haben Recht mit st_envelope Ich aktualisiere die Antwort. Über die "nicht gefragt", manchmal ein Versuch, verwandte Antworten zu geben, weil für Menschen, die nicht gut Englisch sprechen (wie ich), ist es schwierig, den richtigen Suchtext zu wählen, um eine Antwort zu finden. Wahrscheinlich bin ich in diese Frage geraten und habe nach einer Antwort für das zweite Thema gesucht.
Francisco Puga
4

Eine andere Möglichkeit ist die Verwendung der ST_EnvelopeFunktion, die eine Geometrie mit SRID zurückgibt.

ST_Envelope - Gibt eine Geometrie zurück, die den Begrenzungsrahmen der angegebenen Geometrie darstellt

zusammen mit der Aggregatfunktion ST_Union, um die Vereinigung aller Geometrien (oder die Vereinigung der jeweiligen Hüllkurven) wie folgt zu erhalten:

SELECT ST_Envelope(ST_Union(geom)) AS table_extent FROM your_table

oder

SELECT ST_Envelope(ST_Union(ST_Envelope(geom))) AS table_extent FROM your_table

Die zweite Option sollte schneller sein, da sie die Vereinigungsoperation vereinfacht, indem die Umschläge der einzelnen Geometrien verwendet werden.

siehe Quelle .

Tinlyx
quelle
1
Der ST_Extent-Ansatz ist um Größenordnungen schneller, da er nur mit Zahlen arbeiten kann und keine komplexen geometrischen Berechnungen durchführen muss. Vermeiden Sie ST_Union, wann immer Sie können.
Bugmenot123
2

Das Nichterzwingen einer räumlichen Aggregation sollte viel schneller erfolgen:

select
  min(ST_XMin(geom)) as l,
  min(ST_YMin(geom)) as b,
  max(ST_XMax(geom)) as r,
  max(ST_YMax(geom)) as t
from x
mika666
quelle
1
ST_Extent muss auch nichts räumliches tun. Es ist 2-3 mal schneller als Ihr Ansatz für meine Daten (~ 400k Polygone). Wahrscheinlich, weil es alles auf einmal erledigen kann, während Ihr Ansatz mehrere Aspekte jedes Geoms betrachten und am Ende aggregieren muss.
Bugmenot123