PostGIS에서 포인트의 중심을 얻는 방법?


16

PostGIS 확장과 함께 PostgreSQL을 사용합니다.

the_geom테이블의 열에 포인트 세트가 myschema.myobjects있습니다. 이 클러스터의 중심을 얻기 위해 select 문을 만들고 싶습니다.

SELECT the_geom FROM myschema.myobjects

다음과 같은 문장에 대한 올바른 구문을 찾아야합니다.

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

답변:


21

이런 식으로 유니온 함수를 사용해야합니다

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

속성이 같은 중심점을 얻을 수 있습니다.


6

PostGIS에는 여러 형상을 단일 형상으로 결합하여 입력으로 사용할 수있는 두 가지 기능이 있습니다 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.