정 이십 면체 삼각형 세분화가 정 변형 (PostGIS)이 아닌 이유는 무엇입니까?

Nov 24 2020

PostGIS를 사용하여 측지 다면체 를 만들고 있습니다. 나는 기본 정 이십 면체 점 (부록 A 참조)클래스 I 세분 의 첫 번째 수준으로 나누고 있습니다.

설정

간단하게하기 위해 다음 점으로 구성된 첫 번째 삼각형 만 살펴 보겠습니다.

CREATE TABLE pix (
    id bigserial
  , name text
  , geog geography(POINT,4326) -- use WGS84
);

insert into pix values (DEFAULT, 'China', st_point(122.3, 39.1));
insert into pix values (DEFAULT, 'Norway', st_point(10.53619898, 64.7));
insert into pix values (DEFAULT, 'Arabian sea', st_point(58.15770555, 10.44734504));

기본 정 이십 면체 삼각형을 만듭니다.

삼각형 변의 수는이 쿼리에서 생성 된 테이블에 표시된 행 번호에 해당합니다.

select p1.name
  , p2.name
  , st_distance(p1.geog, p2.geog) as dist
from pix p1
  cross join pix p2
where p1.id < p2.id

포인트는 대략 등거리에 있습니다. -이 위의 씨앗 데이터가이 ST_Distance가 반환 구, 회전 타원체하지를 가정하여 생성 된 것으로 보이기 때문에 작은 차이는 다음 use_spheroid falsest_distance훨씬 더 가까이 거리를 산출 할 것이다, 그러나 사용주의 false모든 제시된 쿼리해도 문제가 변경되지 않습니다 아래에 설명.

클래스 I 세분의 첫 번째 수준

insert into pix (name, geog)
select p1.name || '-' || p2.name
  , st_project(p1.geog, st_distance(p1.geog, p2.geog) / 2, st_azimuth(p1.geog, p2.geog)) as geog
from pix p1
  cross join pix p2
where p1.id < p2.id

위는 원래 삼각형에있는 각 점 쌍의 중간 점을 생성합니다.

그리고 이것들은 다음과 같은 거리를 가지고 있습니다.

select p1.name
  , p2.name
  , st_distance(p1.geog, p2.geog) as dist
from pix p1
  cross join pix p2
where p1.id < p2.id
  and p2.id > 3
order by dist

문제

구간 7, 8, 9 (약 4000km)의 거리는 구간 1 ~ 6 (약 3500km)의 거리보다 훨씬 깁니다.

이 알고리즘은 왜 등형 삼각형에 더 가까운 것을 생성하지 않습니까? 내 사용 st_azimuthst_project잘못입니까? 아니면 구에 점을 투영하는 것에 대한 더 기본적인 수학을 놓쳤습니까?

답변

3 GevaertJoep Nov 28 2020 at 23:35

예, 이것은 타일 된 정 이십 면체 대 구 투영 때문입니다. 이 과정을 다음과 같이 생각합니다.

일반 정 이십 면체를 취하면 모든 모서리가 동일한 구에 있으므로 구에 투영 할 때 거리도 동일합니다. 그러나 투영되지 않은 정 이십 면체를 사용하여 모든 삼각형을 세분화하면 생성 된 점이 해당 구에 있지 않습니다. 이것이 바깥쪽으로 이동하면이 이미지의 빨간색 삼각형처럼 더 커집니다.

또한 이러한 구조는 건축에 사용됩니다. Geodesic 돔 계산기를 사용하여 (그 사이트의 이미지) 가장자리 길이 B가 3.5이고 A에 해당하는 길이는 3.9입니다.

그래서 실제로 당신이 놓친 것은 수학이었습니다.