Woher kommt der Standard-Erdradius in ST_Distance_Sphere?


15

MySQL sagt in den Dokumenten für ST_Distance_Sphere

Berechnungen verwenden eine sphärische Erde und einen konfigurierbaren Radius. Das optionale Radiusargument sollte in Metern angegeben werden. Ohne Angabe beträgt der Standardradius 6.370.986 Meter. Wenn das Argument radius vorhanden, aber nicht positiv ist, tritt ein ER_WRONG_ARGUMENTSFehler auf.

PostGIS sagt in den Dokumenten von ST_Distance_Sphere, (obwohl die Dokumente nicht mehr korrekt sind )

Verwendet eine kugelförmige Erde und einen Radius von 6370986 Metern.

Woher haben sie die voreingestellten 6.370.986 Meter? Laut WGS84 beträgt der Radius der Hauptachse 6.378.137,0 m. PostGIS, das jetzt einen durchschnittlichen Radius verwendet, verwendet im Wesentlichen 6371008.

Betrachtet man den Code

#define WGS84_MAJOR_AXIS 6378137.0
#define WGS84_INVERSE_FLATTENING 298.257223563
#define WGS84_MINOR_AXIS (WGS84_MAJOR_AXIS - WGS84_MAJOR_AXIS / WGS84_INVERSE_FLATTENING)
#define WGS84_RADIUS ((2.0 * WGS84_MAJOR_AXIS + WGS84_MINOR_AXIS ) / 3.0)

das bedeutet

-- SELECT 6378137.0 - 6378137.0 / 298.257223563;
WGS84_MINOR_AXIS = 6356752.314245179498
-- SELECT ( 2.0 * 6378137.0 + ( 6378137.0 - 6378137.0 / 298.257223563) ) / 3.0;
WGS84_RADIUS = 6371008.771415059833

Neuere Versionen sind viel weniger effizient, komplexer und verwenden Pro4j, aber sie scheinen dasselbe zu tun.

Woher kommt noch 6370986?


1
Es stellt den mittleren Erdradius dar, der sein sollte (2*minorAxis+majorAxis)/3 ... obwohl dieser Wert für WGS84 noch einige Meter größer ist (6.371.008.771)
JGH

Ja, das ist die Frage, warum die Diskrepanz.
Evan Carroll

2
Hat es ein Entwickler im Netz nachgeschlagen? Die Postgis-Quelle könnte etwas Licht ins Dunkel bringen
Ian Turton

2
@ IanTurton Die meisten Fehler können auf "Einige Entwickler haben etwas getan und die Quelle beleuchtet es möglicherweise" reduziert werden. Ich wollte die Arbeit machen und dachte mir, dass es das ist, was nötig ist, wenn niemand die Geschichte kennt. Siehe die Antwort unten.
Evan Carroll

1
Vielleicht gab es einen Tippfehler und sie meinten 6370996 ... das ist sehr nah an Clarke 1866 authalic Radius.
Mkennedy

Antworten:


21

Ok, das ist hilarriuusss . Ich habe das aufgespürt. In einer alten Kopie von lwgeom/lwgeom_spheroid.cin PostGIS 1.0.0rc4 können Sie dies sehen,

/*
 * This algorithm was taken from the geo_distance function of the 
 * earthdistance package contributed by Bruno Wolff III.
 * It was altered to accept GEOMETRY objects and return results in
 * meters.
 */
PG_FUNCTION_INFO_V1(LWGEOM_distance_sphere);
Datum LWGEOM_distance_sphere(PG_FUNCTION_ARGS)
{
        const double EARTH_RADIUS = 6370986.884258304;

Wenn Sie zu den Dokumenten von übergehen earthdistance, finden Sie Folgendes:

Beachten Sie, dass im Gegensatz zum würfelbasierten Teil des Moduls die Einheiten hier fest verdrahtet sind: Das Ändern der earth()Funktion hat keine Auswirkungen auf die Ergebnisse dieses Operators.

Und diese fest verdrahtete Nummer: EARTH_RADIUSkann hier gesehen werden

/* Earth's radius is in statute miles. */
static const double EARTH_RADIUS = 3958.747716;

So können Sie ein einfaches tun.

EARTH_RADIUS * MILES_TO_METERS = EARTH_RADIUS_IN_METERS
 3958.747716 * 1609.344        = 6370986.884258304

Und du hast deine 6370986.884258304. Schneiden Sie das natürlich einfach ab und speichern Sie es in a, longweil warum nicht.

Im Grunde genommen wurde der Radius in MySQL von einem Lazy-Copy-Job aus PostGIS entfernt , der einen Radius in Meilen in Meter von einer dunklen Konstante eines zufälligen 20 Jahre alten PostgreSQL-Moduls umwandelte .

earth_distanceist ein Pre-PostGIS-Modul von Bruce Momjian. Ich proklamiere hiermit 6370986 die Bmomjian-Konstante: eine gute Nuff'-Näherung der Erde in Metern, um MySQL zu befriedigen. Aber vielleicht nicht lange.


2
Aber woher kam dann diese sehr genaue Zahl 3958.747716? Der nächstgelegene ich finden kann , ist 3958,74795, die die Anzahl der US ist Umfrage Meilen in 6371 Kilometer, aber die noch Blätter etwa 37 cm nachgewiesenes ,,,
hmakholm über Monica links

1
@HenningMakholm kämpfe weiter im guten Kampf keine Ahnung. ;)
Evan Carroll

2
Sehr schöner Fund!
Paul Ramsey
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.