Wie erhält man den Schwerpunkt einer Punktemenge in PostGIS?

15

Ich benutze PostgreSQL mit der PostGIS-Erweiterung.

Ich habe eine Reihe von Punkten in einer the_geomSpalte aus einer Tabelle myschema.myobjects. Ich möchte eine select-Anweisung erstellen, um den Schwerpunkt dieses Clusters zu ermitteln.

SELECT the_geom FROM myschema.myobjects

Ich muss die richtige Syntax für eine Anweisung wie die folgende finden:

SELECT ST_AsText(ST_Centroid( (SELECT the_geom FROM myshema.myobjects) ));
Rémi B.
quelle

Antworten:

20

Sie müssen die Vereinigungsfunktion wie folgt verwenden

SELECT att1, st_centroid(st_union(geom)) as geom
FROM schema.table
GROUP BY att1;

So können Sie den Schwerpunkt eines Punktes erhalten, der das gleiche Attribut hat.

Sergio
quelle
6

PostGIS verfügt über zwei Funktionen zum Kombinieren mehrerer Geometrien zu einer einzigen Geometrie, die Sie als Eingabe für verwenden können ST_Centroid.

ST_Collect Kombiniert einfach eine Reihe von Geometrien, ohne sie zu ändern.

Die Alternative ST_Unionwird mehrere Geometrien "auflösen" und redundante Komponenten entfernen. Dies ist wahrscheinlich nicht das, was Sie für diese Anwendung wollen.

Um den Unterschied zu sehen, vergleichen Sie:

 SELECT ST_AsText(ST_Centroid(ST_Union(geom))) FROM 
 (VALUES ('POINT (0 0)'), ('POINT (2 2)'), ('POINT (2 2)')) sq (geom);

 -- POINT(1 1)

und

 SELECT ST_AsText(ST_Centroid(ST_Collect(geom))) FROM 
 (VALUES ('POINT (0 0)'), ('POINT (2 2)'), ('POINT (2 2)')) sq (geom);

 -- POINT(1.33333333333333 1.33333333333333)

In diesem Fall wurde ST_Unionder duplizierte Punkt entfernt, während er ST_Collectbeibehalten wurde.

dbaston
quelle
3

Wenn Sie nach Leistung suchen, verwenden Sie diese Abfrage:

SELECT avg(ST_X(the_geom)) as lon, avg(ST_Y(the_geom)) as lat FROM table

Sie erhalten mehr oder weniger die gleiche Ausgabe wie:

SELECT ST_AsText(ST_Centroid(ST_Collect(the_geom))) FROM table

Wie in @dbaston, aber schneller und speicherintensiver.

gemo1011
quelle