D'où vient le rayon de la Terre par défaut dans ST_Distance_Sphere?


15

MySQL dit dans la documentation de ST_Distance_Sphere

Les calculs utilisent une terre sphérique et un rayon configurable. L'argument facultatif du rayon doit être donné en mètres. S'il est omis, le rayon par défaut est de 6 370 986 mètres. Si l'argument radius est présent mais pas positif, une ER_WRONG_ARGUMENTSerreur se produit.

PostGIS dit dans les documents de ST_Distance_Sphere(bien que les documents ne soient plus précis )

Utilise une terre sphérique et un rayon de 6370986 mètres.

D'où ont-ils obtenu les 6 370 986 mètres par défaut? WGS84 indique que le rayon du grand axe est de 6 378 137,0 m. PostGIS qui utilise désormais un rayon moyen utilise essentiellement 6371008.

En regardant le 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)

cela signifie

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

Les versions plus récentes sont beaucoup moins efficaces, plus complexes et utilisent Pro4j mais elles semblent faire la même chose.

D'où vient toujours le 6370986?


1
Il représente le rayon moyen de la Terre, qui devrait être (2*minorAxis+majorAxis)/3 ... bien que cette valeur pour WGS84 soit encore plus grande de quelques mètres (6,371,008.771)
JGH

oui, c'est la question pourquoi l'écart.
Evan Carroll

2
Un développeur l'a recherché sur le net? La source des postgis pourrait jeter un peu de lumière dessus
Ian Turton

2
@IanTurton La plupart des bogues peuvent être réduits à "certains développeurs ont fait quelque chose et la source peut les éclairer". J'avais l'intention de faire le travail, pensant que ce serait ce qu'il faudrait si personne ne connaissait l'histoire. Voir la réponse ci-dessous.
Evan Carroll

1
Peut-être qu'il y avait une faute de frappe et ils voulaient dire 6370996 ... qui est très proche du rayon authalique de Clarke 1866.
mkennedy

Réponses:


21

Ok, ce sont des hilarriuusss . J'ai retrouvé ça. Dans une ancienne copie de lwgeom/lwgeom_spheroid.cPostGIS 1.0.0rc4, vous pouvez le voir,

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

En passant aux documents de earthdistance, vous trouverez ceci:

Notez que contrairement à la partie cube du module, les unités sont câblées ici: la modification de la earth()fonction n'affectera pas les résultats de cet opérateur.

Et ce numéro câblé: EARTH_RADIUSpeut être vu ici

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

Vous pouvez donc faire un simple.

EARTH_RADIUS * MILES_TO_METERS = EARTH_RADIUS_IN_METERS
 3958.747716 * 1609.344        = 6370986.884258304

Et vous avez votre 6370986.884258304. Bien sûr, il suffit de tronquer cela et de le stocker dans un longcar pourquoi pas.

Donc, en substance, le rayon dans MySQL a été levé à partir d'un travail de copie paresseux de PostGIS qui a converti un rayon en miles en mètres à partir d'une constante obscure d'un module PostgreSQL âgé de 20 ans au hasard .

earth_distanceest un module pré-PostGIS de Bruce Momjian. Par la présente, je proclame 6370986 la constante de Bmomjian: une bonne approximation de la Terre en mètres pour satisfaire MySQL. Mais peut-être pas pour longtemps.


2
Mais d'où vient ce chiffre très précis 3958.747716, alors? Le plus proche que je peux trouver est le 3958.74795, qui est le nombre de milles d' enquête américains sur 6371 kilomètres, mais cela laisse encore environ 37 cm sans compte ,,,
hmakholm est parti de Monica

1
@HenningMakholm continue de lutter contre le bon combat aucune idée. ;)
Evan Carroll

2
Très belle trouvaille!
Paul Ramsey
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.