¿De dónde proviene el radio de la Tierra predeterminado en ST_Distance_Sphere?

15

MySQL dice en los documentos para ST_Distance_Sphere

  

Los cálculos utilizan una tierra esférica y un radio configurable. El argumento del radio opcional debe darse en metros. Si se omite, el radio predeterminado es de 6.370.986 metros. Si el argumento del radio está presente pero no es positivo, se produce un error ER_WRONG_ARGUMENTS .

PostGIS dice en los documentos de ST_Distance_Sphere , (aunque los documentos ya no son precisos )

  

Utiliza una tierra esférica y un radio de 6370986 metros.

¿De dónde obtuvieron los 6,370,986 metros predeterminados? WGS84 dice que el radio del eje mayor es 6,378,137.0 m. PostGIS, que ahora usa un radio promedio, utiliza esencialmente 6371008.

Buscando en el código

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

eso 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

Las versiones más nuevas son mucho menos eficientes, más complejas, y usan Pro4j pero parecen hacer lo mismo.

¿De dónde viene 6370986?

    
pregunta Evan Carroll 20.11.2017 - 18:20

1 respuesta

21

Ok, esto es hilarriuusss . He rastreado esto. En una copia antigua de lwgeom/lwgeom_spheroid.c , encontrará esto :

  

Tenga en cuenta que a diferencia de la parte del módulo basada en cubo, las unidades están cableadas aquí: el cambio de la función earthdistance no afectará los resultados de este operador.

Y ese número alámbrico: % cuenta de impuestos / a>

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

Para que puedas hacer un sencillo.

EARTH_RADIUS * MILES_TO_METERS = EARTH_RADIUS_IN_METERS
 3958.747716 * 1609.344        = 6370986.884258304

Y tienes tu earth() . Por supuesto, solo trunca eso y guárdalo en un EARTH_RADIUS porque por qué no.

Así que, en esencia, el radio en MySQL fue que módulo aleatorio PostgreSQL de 20 años .

6370986.884258304 es un módulo pre-PostGIS de Bruce Momjian. Por la presente proclamo 6370986 la constante de Bmomjian: una buena aproximación de la Tierra en metros para satisfacer MySQL. Aunque tal vez no por mucho tiempo.

    
respondido por el Evan Carroll 20.11.2017 - 19:34

Lea otras preguntas en las etiquetas