Come ottenere il centroide di una serie di punti in PostGIS?


16

Uso PostgreSQL con l'estensione PostGIS.

Ho una serie di punti in the_geomcolonna da una tabella myschema.myobjects. Voglio creare un'istruzione select per ottenere il centroide di questo cluster, quindi da un'istruzione select come questa:

SELECT the_geom FROM myschema.myobjects

Devo trovare la sintassi corretta per un'istruzione come:

SELECT ST_AsText(ST_Centroid( (SELECT the_geom FROM myshema.myobjects) ));

Risposte:


21

devi usare la funzione unione in questo modo

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

così puoi ottenere il centroide del punto con lo stesso attributo.


6

PostGIS ha due funzioni per combinare più geometrie in un'unica geometria che è possibile utilizzare come input ST_Centroid.

ST_Collect combina semplicemente un insieme di geometrie senza modificarle.

L'alternativa ST_Union"dissolverà" più geometrie e rimuoverà i componenti ridondanti. Questo probabilmente non è quello che vuoi per questa applicazione.

Per vedere la differenza, confronta:

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

 -- POINT(1 1)

e

 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 questo caso, ST_Unionha rimosso il punto duplicato, mentre lo ST_Collectha mantenuto.


4

Se cerchi prestazioni, usa questa query:

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

ti dà più o meno lo stesso output di:

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

come nella risposta @dbaston, ma è più veloce e non utilizza tanta memoria.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.