PostGISでポイントのセットの重心を取得する方法は?


15

PostGIS拡張機能を備えたPostgreSQLを使用しています。

the_geomテーブルの列にポイントのセットがありますmyschema.myobjects。このクラスターの重心を取得するために選択ステートメントを作成したいので、次のような選択ステートメントから:

SELECT the_geom FROM myschema.myobjects

次のようなステートメントの正しい構文を見つける必要があります。

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

回答:


20

このような結合関数を使用する必要があります

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

そのため、同じ属性を持つポイントの重心を取得できます。


6

PostGISには、複数のジオメトリを単一のジオメトリに結合して、の入力として使用できる2つの関数がありますST_Centroid

ST_Collect 一連のジオメトリを変更せずに単純に結合します。

代替案はST_Union、複数のジオメトリを「解決」し、冗長なコンポーネントを削除します。これはおそらく、このアプリケーションに必要なものではありません。

違いを確認するには、以下を比較してください。

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

 -- POINT(1 1)

そして

 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)

この場合、ST_Union重複したポイントは削除されますが、ST_Collect保持されます。


4

パフォーマンスを探している場合は、次のクエリを使用します。

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

以下とほぼ同じ出力が得られます。

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

@dbastonの回答と同様ですが、より高速で、それほど多くのメモリを使用しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.