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.