Warum sind meine Unterteilungen des Ikosaeder-Dreiecks nicht gleichseitig (PostGIS)?
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
false
in st_distance
ergeben sich viel engere Abstände. Beachten Sie jedoch, dass die Verwendung false
in 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_azimuth
und st_project
falsch? Oder habe ich etwas grundlegendere Mathematik über Projektionen von Punkten auf Kugeln vermisst?
Antworten
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.