Skąd pochodzi domyślny promień Ziemi w ST_Distance_Sphere?

15

MySQL mówi w dokumentacji dla ST_Distance_Sphere

Obliczenia wykorzystują kulistą ziemię i konfigurowalny promień. Opcjonalny argument promienia powinien być podany w metrach. Jeśli zostanie pominięty, domyślny promień wynosi 6370986 metrów. Jeśli argument promienia jest obecny, ale nie dodatni, ER_WRONG_ARGUMENTSpojawia się błąd.

PostGIS mówi w dokumentach ST_Distance_Sphere(choć dokumenty nie są już dokładne )

Wykorzystuje sferyczną ziemię i promień 6370986 metrów.

Skąd wzięli domyślnie 6370986 metrów? WGS84 twierdzi, że promień osi głównej wynosi 6,378,137,0 m. PostGIS, który teraz używa średniego promienia, zasadniczo używa 6371008.

Patrząc na kod

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

to znaczy

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

Nowsze wersje są znacznie mniej wydajne, bardziej złożone i używają Pro4j, ale wydają się robić to samo.

Nadal skąd pochodzi 6370986?

Evan Carroll
źródło
1
Reprezentuje średni promień ziemi, który powinien wynosić (2*minorAxis+majorAxis)/3 ... chociaż ta wartość dla WGS84 jest wciąż kilka metrów większa (6 371 008,771)
JGH
tak, to pytanie, dlaczego ta rozbieżność.
Evan Carroll,
2
Jakiś programista sprawdził to w sieci? Źródło postgis może rzucić na to trochę światła
Ian Turton
2
@IanTurton Większość błędów można zredukować do „jakiś programista coś zrobił, a źródło może rzucić na to światło”. Zamierzałem wykonać tę pracę, sądząc, że tak by było, gdyby nikt nie znał historii. Zobacz odpowiedź poniżej.
Evan Carroll,
1
Może była tam literówka i oznaczały 6370996 ... to bardzo blisko promienia autologicznego Clarke 1866.
mkennedy

Odpowiedzi:

21

Ok, to jest hilarriuusss . Wyśledziłem to. W starej kopii lwgeom/lwgeom_spheroid.cPostGIS 1.0.0rc4 możesz to zobaczyć,

/*
 * 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;

Przechodząc do dokumentów earthdistance, znajdziesz to:

Zauważ, że w przeciwieństwie do części modułu opartej na kostkach, jednostki są tutaj podłączone: zmiana earth()funkcji nie wpłynie na wyniki tego operatora.

I ten numer na stałe: EARTH_RADIUSmożna go zobaczyć tutaj

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

Możesz zrobić prosty.

EARTH_RADIUS * MILES_TO_METERS = EARTH_RADIUS_IN_METERS
 3958.747716 * 1609.344        = 6370986.884258304

I masz swoje 6370986.884258304. Oczywiście, po prostu skróć to i przechowuj w, longponieważ dlaczego nie.

Zasadniczo promień w MySQL został usunięty z leniwego zadania kopiowania z PostGIS, które przekształciło promień w milach na metry z niejasnej stałej z losowego 20-letniego modułu PostgreSQL .

earth_distancejest modułem pre-PostGIS autorstwa Bruce'a Momjiana. Ogłaszam 6370986 stałą Bmomjiana: dobre przybliżenie Ziemi w metrach dla zadowolenia MySQL. Chociaż może nie na długo.

Evan Carroll
źródło
2
Ale skąd zatem wzięła się ta bardzo dokładna liczba 3958,747716? Najbliższe, jakie mogę znaleźć, to 3958,74795, co jest liczbą amerykańskich mil pomiarowych na 6371 kilometrów, ale to wciąż pozostawia około 37 cm nieuwzględnionych dla ,,,
hmakholm pozostał Monica
1
@HenningMakholm kontynuuje dobrą walkę, nie mam pojęcia. ;)
Evan Carroll,
2
Bardzo fajne znalezisko!
Paul Ramsey