PostGIS에서 서클을 만드시겠습니까?


22

SRID : 900913의 형상과 함께 PostGIS 1.5.2를 사용하고 있습니다. 반경 600km의 점 목록을 중심으로하여 원을 만들어야합니다. 이 쿼리를 사용하고 있습니다 :

INSERT INTO circles (geom) (
   SELECT ST_Buffer(point, 600000, 'quad_segs=8') 
   FROM points
);

그러나 생성 된 원의 반경은 600 킬로미터가 아닙니다 (반경은이 길이에 가깝지만 정확하게는 아닙니다).

PostGIS에서 서클을 만드는 다른 방법이 있습니까?

참고 : 표시된 정보는 스페인에서 온 것입니다. 올바른 투영은 4326이지만 클라이언트는 Google 래스터를 사용하므로 재 투영을 피하고 성능을 향상시키기 위해 900913에 데이터를 저장합니다.


1
반경이 600km가 아닌지 알아 내기 위해 반경을 어떻게 측정 했습니까?
underdark

1
@underdark 두 도시 사이의 거리를 알고 있으며이 도시의 중심으로 사용하여 생성 된 원은 다른 도시로 확장되지 않습니다. 내가 사용하는 두 도시 사이의 거리를 확인 gmap-pedometer.com
angelcervera


@underdark gmap-pedometer.com에서 SELECT ST_Distance( (select point from points where id = 7), (select point from points where id = 42));100km 이상의 차이를 반환하지만이 길이가 올바른 것으로 가정하면 원 반경이 완벽합니다. 그러나 사람들은 st_distance가 반환 한 거리가 아닌 첫 번째 거리를 반경으로 사용합니다. 첫 번째 거리를 두 번째 거리로 변환 할 수 있습니까?
angelcervera

답변:


15

이 시도:

 SELECT ST_Transform(geometry( 
            ST_Buffer(geography( 
                ST_Transform( point, 4326 )), 
                600000)), 
            900913) FROM points`

이것은 지리로 뒤집힌 다음 내장 SRID 선택을 사용하여 좋은 평면 버퍼가 실행되는 지오메트리로 다시 뒤집어 뒤집습니다. 메르카토르에서의 접근 방식의 문제점은 메르카토르가 거리를 유지하지 못한다는 것입니다. 보다 적절한 지역 투영법을 사용하면 더 나은 결과를 얻을 수 있으며 이는 위의 방법에서 발생합니다.


4

보다 정확한 원을 얻기 위해 quad_seg 값을 늘릴 수 있습니다. 실제 원을 얻으려면 곡선 지오메트리 유형으로 작업해야하지만 소프트웨어가 무엇을 보여줄 수 있는지 모르겠습니다.

srid 90013의 정확도는 전 세계를 덮고있는 투사이기 때문에 매우 나쁩니다.

로컬 투영으로보다 정확한 결과를 얻을 수 있습니다.


@ nicklas-aven 4326이 아닌 900913 프로젝션을 사용하기 때문에 600km 거리에서 100km의 차이가 가능합니까?
angelcervera

1
네 가능합니다. 내가 그 부정확 한 gis.stackexchange.com/questions/3264/…를 믿을 수 없었을 때 Pauls가 그녀를 언급하는지 확인하십시오 . 문제는 4326이 투사되지 않는다는 것입니다.
Nicklas Avén

3

서클을 만드는 위치에 따라 다릅니다. 적도 부근이나 극점에 가깝습니까?

한 번 봐 가지고 이지도를 . Antartica 또는 Greenland가 실제로 그렇게 크다고 생각하십니까? 그게 당신이 사용하는 투사입니다.

프로젝션에 대한USGS 문서 , 특히 아래의 표를 통해 어떤 프로젝션이 무엇에 적합한 지 빠르게 알 수 있습니다.

그리고 결국, 나는 당신의 질문에 마침내 대답해야한다고 생각합니다 :)

Nicklas가 말한 것은 좋은 조언이었습니다. 귀하의 지역에서 더 잘 작동하는 특별한 계획이 있습니까?

그렇지 않으면 새로운 PostGIS Geography 유형 을 볼 수 있습니다 . 그럼에도 불구하고 가장 적합한 답변은 데이터의 위치에 따라 다릅니다.

업데이트 : 이제 귀하의 데이터가 스페인에 있음을 알았으므로 UTM Zone 31N 과 같은 로컬 프로젝션에 저장 하여 해당 작업을 수행 한 다음 Google Web Mercator에 다시 투영하는 것을 보셨습니까?


1
넓은 지역을 다루는지도에 지리 유형을 사용하는 경우 +1 여기서 문제는 postgis에 지리 유형에 대한 기본 버퍼 기능이 없다는 것입니다. 그러나 "최고의 srid"를 위해 내장 된 캐스트가 있으며 버퍼를 구축 한 다음 다시 4326으로 ​​돌아갑니다. 따라서 데이터를 알고 수동으로 srid를 선택하면 더 나은 제어가 가능합니다.
Nicklas Avén

Nicklas, 당신은 캐스팅에 대해 정확하고 로컬 프로젝션에 대해 100 % 동의합니다 (즉, 데이터를 아는 것). 그럼에도 불구하고, 만약 그가 "세계적인"데이터, IMHO를 원한다고 대답한다면, Geography 타입 내부의 캐스팅 로직은 SR이 어떤 특정 거리 작동에 적합한 지 알아내는 데 훨씬 더 나은 일을 할 것입니다. 복잡한 커스텀 로직. 지리학 유형에 대한 또 다른 좋은 점은 현재 많은 연산이 데카르트 수학으로 캐스트되었지만 구 수학을 사용하도록 연산이 계속 업데이트된다는 것입니다.
Ragi Yaser Burhum

2

최신 SQL / MM Part 3 형상 유형 CIRCULARSTRING 및 / 또는 CURVEPOLYGON을 사용할 수 있습니다 .

그러나이 유형에 대한 지원은 내부 기능과 외부 프로그램 모두에 제한되어 있습니다. ST_CurveToLine 을 사용할 수 있습니다 을 하여 시각화 할 수 있습니다.

또한 (GIS 2.0 svn 현재) π의SELECT ST_Area('CURVEPOLYGON(CIRCULARSTRING(2 1, 1 2, 0 1, 1 0, 2 1))'::geometry) 대략적인 근사치입니다 . (에서 3.14033115695475와 3.14159265358979 비교 ).pi()


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.