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_ARGUMENTS
erreur 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?
la source
(2*minorAxis+majorAxis)/3
... bien que cette valeur pour WGS84 soit encore plus grande de quelques mètres (6,371,008.771)Réponses:
Ok, ce sont des hilarriuusss . J'ai retrouvé ça. Dans une ancienne copie de
lwgeom/lwgeom_spheroid.c
PostGIS 1.0.0rc4, vous pouvez le voir,En passant aux documents de
earthdistance
, vous trouverez ceci:Et ce numéro câblé:
EARTH_RADIUS
peut être vu iciVous pouvez donc faire un simple.
Et vous avez votre
6370986.884258304
. Bien sûr, il suffit de tronquer cela et de le stocker dans unlong
car 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_distance
est 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.la source