¿De dónde viene el radio predeterminado de la Tierra 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, ER_WRONG_ARGUMENTSse produce un error.

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

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

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

Mirando 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 el 6370986?

Evan Carroll
fuente
1
Representa el radio medio de la Tierra, que debería ser (2*minorAxis+majorAxis)/3 ... aunque ese valor para WGS84 todavía es unos metros más grande (6,371,008.771)
JGH
Sí, esa es la pregunta por qué la discrepancia.
Evan Carroll
2
¿Algún desarrollador lo buscó en la red? La fuente de Postgis puede arrojar algo de luz sobre él
Ian Turton
2
@IanTurton La mayoría de los errores se pueden reducir a "algún desarrollador hizo algo y la fuente puede arrojar luz sobre ello". Tenía la intención de hacer el trabajo, pensando que eso sería lo que se necesitaría si nadie supiera la historia. Vea la respuesta a continuación.
Evan Carroll
1
Tal vez hubo un error tipográfico y significaban 6370996 ... eso está muy cerca del radio autálico de Clarke 1866.
mkennedy

Respuestas:

21

Ok, esto es hilarriuusss . Seguí esto abajo. En una copia anterior de lwgeom/lwgeom_spheroid.cPostGIS 1.0.0rc4 puede ver esto,

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

Pasando a los documentos de earthdistance, encontrarás esto:

Tenga en cuenta que, a diferencia de la parte del módulo basada en cubos, las unidades están cableadas aquí: cambiar la earth()función no afectará los resultados de este operador.

Y ese número cableado: EARTH_RADIUSse puede ver aquí

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

Entonces puedes hacer un simple.

EARTH_RADIUS * MILES_TO_METERS = EARTH_RADIUS_IN_METERS
 3958.747716 * 1609.344        = 6370986.884258304

Y tienes tu 6370986.884258304. Por supuesto, solo trunca eso y guárdalo en un longporque porque no.

Entonces, en esencia, el radio en MySQL se levantó de un trabajo de copia perezosa de PostGIS que convirtió un radio en millas a metros de una constante oscura de un módulo PostgreSQL de 20 años de antigüedad .

earth_distancees un módulo anterior a PostGIS por 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.

Evan Carroll
fuente
2
Pero entonces, ¿de dónde vino esa cifra tan precisa 3958.747716? El más cercano que puedo encontrar es 3958.74795, que es el número de estadounidenses encuesta millas en 6371 kilómetros, pero que las hojas aún unos 37 cm en paradero desconocido ,,,
hmakholm sobra Mónica
1
@HenningMakholm sigue luchando la buena batalla, ni idea. ;)
Evan Carroll
2
Muy buen hallazgo!
Paul Ramsey