Warum sind meine Unterteilungen des Ikosaeder-Dreiecks nicht gleichseitig (PostGIS)?

Nov 24 2020

Ich erstelle ein geodätisches Polyeder mit PostGIS. Ich teile die Basis-Ikosaederpunkte (siehe Anhang A) in die erste Ebene der Unterteilungen der Klasse I ein .

Die Einrichtung

Nehmen wir der Einfachheit halber nur das erste Dreieck, das aus diesen Punkten besteht:

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));

Dadurch entsteht das Basis-Ikosaeder-Dreieck

Die Nummern der Dreieckseiten entsprechen den Zeilennummern in der von dieser Abfrage generierten Tabelle

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

Die Punkte sind ungefähr gleich weit entfernt. Es gibt kleine Abweichungen, da die obigen Seed-Daten unter der Annahme einer Kugel und nicht eines Sphäroids generiert worden zu sein scheinen, bei der st_distance zurückkehrt - use_spheroid falsein st_distanceergeben sich viel engere Abstände. Beachten Sie jedoch, dass die Verwendung falsein allen dargestellten Abfragen das unten beschriebene Problem nicht ändert.

Erste Stufe der Unterteilung der Klasse 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

Das Obige erzeugt die Mittelpunkte jedes der Punktpaare auf dem ursprünglichen Dreieck

Und diese haben die folgenden Abstände, die durch diese Abfrage generiert werden

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

Das Problem

Die Abstände der Segmente 7, 8 und 9 (ca. 4000 km) sind viel länger als die Abstände der Segmente 1-6 (ca. 3500 km).

Warum erzeugt dieser Algorithmus nicht etwas, das näher an gleichseitigen Dreiecken liegt? Ist meine Verwendung von st_azimuthund st_projectfalsch? Oder habe ich etwas grundlegendere Mathematik über Projektionen von Punkten auf Kugeln vermisst?

Antworten

3 GevaertJoep Nov 28 2020 at 23:35

Ja, das liegt an den gekachelten Projektionen von Ikosaeder zu Kugel. Ich betrachte diesen Prozess als:

Nehmen Sie ein normales Ikosaeder, alle Ecken liegen auf derselben Kugel, und daher ist der Abstand auch gleich, wenn Sie auf eine Kugel projiziert werden. Wenn wir jedoch unser nicht projiziertes Ikosaeder nehmen und alle Dreiecke unterteilen, befinden sich die erzeugten Punkte nicht auf dieser Kugel. Wenn sich diese nach außen bewegen, sind sie größer als die roten Dreiecke in diesem Bild.

Diese Konstruktionen werden auch in der Architektur verwendet. Unter Verwendung des geodätischen Kuppelrechners (Bild von ihrer Stelle) finden wir für eine Kantenlänge B von 3,5 die entsprechende Länge für A 3,9:

In der Tat war es die Mathematik, die Sie vermisst haben.