Da dove viene il raggio terrestre predefinito in ST_Distance_Sphere?


15

MySQL dice nei documenti per ST_Distance_Sphere

I calcoli utilizzano una terra sferica e un raggio configurabile. L'argomento facoltativo del raggio dovrebbe essere espresso in metri. Se omesso, il raggio predefinito è 6.370.986 metri. Se l'argomento raggio è presente ma non positivo, si ER_WRONG_ARGUMENTSverifica un errore.

PostGIS dice nei documenti di ST_Distance_Sphere(anche se i documenti non sono più precisi )

Utilizza una terra sferica e un raggio di 6370986 metri.

Da dove hanno preso i 6.370.986 metri di default? WGS84 afferma che il raggio dell'asse maggiore è 6.378.137,0 m. PostGIS che ora utilizza un raggio medio utilizza essenzialmente 6371008.

Guardando il codice

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

questo significa

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

Le versioni più recenti sono molto meno efficienti, più complesse e usano Pro4j ma sembrano fare la stessa cosa.

Da dove viene 6370986?


1
Rappresenta il raggio terrestre medio, che dovrebbe essere (2*minorAxis+majorAxis)/3 ... sebbene quel valore per WGS84 sia ancora di qualche metro più grande (6.371.008.771)
— JGH

sì, questa è la domanda sul perché la discrepanza.
— Evan Carroll,

2
Qualche sviluppatore l'ha cercato in rete? La fonte postgis potrebbe far luce su di essa
— Ian Turton

2
@IanTurton La maggior parte dei bug può essere ridotta a "alcuni sviluppatori hanno fatto qualcosa e la fonte potrebbe far luce su di essa". Ho intenzione di fare il lavoro, immaginando che sarebbe quello che ci vorrebbe se nessuno conoscesse la storia. Vedi la risposta sotto.
— Evan Carroll,

1
Forse c'era un refuso e intendevano 6370996 ... molto vicino al raggio autico di Clarke del 1866.
— mkennedy,

Risposte:


21

Ok, questo è hilarriuusss . L'ho rintracciato. In una vecchia copia di lwgeom/lwgeom_spheroid.cPostGIS 1.0.0rc4 puoi vedere questo,

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

Passando ai documenti di earthdistance, troverai questo:

Si noti che, diversamente dalla parte del modulo basata su cubi, le unità sono cablate qui: la modifica della earth()funzione non influirà sui risultati di questo operatore.

E quel numero cablato: EARTH_RADIUSpuò essere visto qui

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

Quindi puoi fare un semplice.

EARTH_RADIUS * MILES_TO_METERS = EARTH_RADIUS_IN_METERS
 3958.747716 * 1609.344        = 6370986.884258304

E tu hai il tuo 6370986.884258304. Naturalmente, basta troncarlo e archiviarlo in un longperché perché no.

Quindi, in sostanza, il raggio di MySQL è stato sollevato da un lavoro pigro di PostGIS che ha convertito un raggio in miglia in metri da un'oscura costante da un modulo PostgreSQL di 20 anni casuale .

earth_distanceè un modulo pre-PostGIS di Bruce Momjian. Con la presente proclamo 6370986 la costante di Bmomjian: una buona approssimazione della Terra in metri per soddisfare MySQL. Anche se forse non per molto.


2
Ma da dove proveniva quella cifra molto precisa 3958.747716, allora? Il più vicino che posso trovare è 3.958,74,795 mila, che è il numero di americani di indagine miglia a 6371 chilometri, ma che lascia ancora circa 37 centimetri dispersi ,,,
— hmakholm rimasto Monica

1
@HenningMakholm continua a combattere la buona battaglia non ne ho idea. ;)
— Evan Carroll,

2
Molto bella scoperta!
— Paul Ramsey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.