PostGIS'de bir dizi noktanın sentroidini nasıl alabilirim?


16

PostGIS uzantılı PostgreSQL kullanıyorum.

the_geomBir tablodan sütununda bir dizi nokta var myschema.myobjects. Bu kümenin centroid'i almak için bir select deyimi oluşturmak istiyorum, bu yüzden böyle bir select deyiminden:

SELECT the_geom FROM myschema.myobjects

Ben gibi bir ifade için doğru sözdizimi bulmak gerekir:

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

Yanıtlar:


21

sendika işlevini şu şekilde kullanmalısınız

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

böylece aynı özniteliğe sahip nokta sentroidi elde edebilirsiniz.


7

PostGIS, çoklu geometrileri giriş olarak kullanabileceğiniz tek bir geometri halinde birleştirmek için iki işleve sahiptir ST_Centroid.

ST_Collect basitçe bir dizi geometriyi değiştirmeden birleştirir.

Alternatif, ST_Unionçoklu geometrileri "çözer" ve yedek bileşenleri kaldırır. Bu muhtemelen bu uygulama için istediğiniz şey değildir.

Farkı görmek için karşılaştırın:

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

 -- POINT(1 1)

ve

 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)

Bu durumda, ST_Unionyinelenen noktayı kaldırırken ST_Collect, korudu.


4

Performans arıyorsanız şu sorguyu kullanın:

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

size aşağıdakilerle hemen hemen aynı çıktıyı verir:

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

@dbaston yanıtında olduğu gibi, ancak daha hızlıdır ve çok fazla bellek kullanmaz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.