Dari mana datangnya jari-jari Earth default di ST_Distance_Sphere?

15

MySQL mengatakan dalam dokumen untuk ST_Distance_Sphere

Perhitungan menggunakan bumi bulat dan radius yang dapat dikonfigurasi. Argumen radius opsional harus diberikan dalam meter. Jika dihilangkan, jari-jari standar adalah 6.370.986 meter. Jika argumen radius hadir tetapi tidak positif, ER_WRONG_ARGUMENTSkesalahan terjadi.

PostGIS mengatakan dalam dokumen ST_Distance_Sphere, (meskipun dokumen tidak akurat lagi )

Menggunakan bumi bulat dan radius 6370986 meter.

Dari mana mereka mendapatkan standar 6.370.996 meter dari? WGS84 mengatakan jari-jari poros utama adalah 6.378.137,0 m. PostGIS yang sekarang menggunakan Radius Rata-rata pada dasarnya menggunakan 6371008.

Melihat kodenya

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

itu berarti

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

Versi yang lebih baru jauh lebih efisien, lebih kompleks, dan menggunakan Pro4j tetapi mereka tampaknya melakukan hal yang sama.

Masih dari mana 6370986 berasal?

Evan Carroll
sumber
1
Ini mewakili jari-jari bumi rata-rata, yang seharusnya (2*minorAxis+majorAxis)/3 ... meskipun nilai WGS84 masih beberapa meter lebih besar (6.371.008.771)
JGH
ya, itu pertanyaan mengapa perbedaan.
Evan Carroll
2
Beberapa pengembang mencarinya di internet? Sumber PostGIS dapat melemparkan beberapa cahaya pada itu
Ian Turton
2
@IanTurton Sebagian besar bug dapat direduksi menjadi "beberapa pengembang melakukan sesuatu dan sumber dapat menjelaskannya." Saya berniat melakukan pekerjaan itu, mencari tahu apa yang diperlukan jika tidak ada yang tahu cerita itu. Lihat jawabannya di bawah.
Evan Carroll
1
Mungkin ada kesalahan ketik dan maksudnya 6370996 ... itu sangat dekat dengan jari-jari authalic Clarke 1866.
mkennedy

Jawaban:

21

Ok, ini hilarriuusss . Saya melacak ini. Dalam salinan lama lwgeom/lwgeom_spheroid.cdi PostGIS 1.0.0rc4 Anda dapat melihat ini,

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

Pindah ke dokumen earthdistance, Anda akan menemukan ini:

Perhatikan bahwa tidak seperti bagian modul berbasis kubus, unit tertanam di sini: mengubah earth()fungsi tidak akan memengaruhi hasil operator ini.

Dan nomor terprogram itu: EARTH_RADIUSbisa dilihat di sini

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

Jadi Anda bisa melakukan yang sederhana.

EARTH_RADIUS * MILES_TO_METERS = EARTH_RADIUS_IN_METERS
 3958.747716 * 1609.344        = 6370986.884258304

Dan Anda punya 6370986.884258304. Tentu saja, cukup potong saja dan simpan di longkarna mengapa tidak.

Jadi pada intinya, jari-jari di MySQL diangkat dari malas-salin-pekerjaan dari PostGIS yang mengkonversi radius dalam mil ke meter dari konstanta tidak jelas dari modul PostgreSQL berusia 20 tahun acak .

earth_distanceadalah modul pra-PostGIS oleh Bruce Momjian. Dengan ini saya menyatakan 6370986 Konstanta Bmomjian: perkiraan Bumi yang baik dalam meter untuk memuaskan MySQL. Meskipun mungkin tidak lama.

Evan Carroll
sumber
2
Tapi dari mana datangnya angka yang sangat tepat 3958.747716? Yang paling dekat yang dapat saya temukan adalah 3958.74795, yang merupakan jumlah mil survei AS di 6371 kilometer, tetapi itu masih menyisakan sekitar 37 cm yang tidak terhitung untuk ,,,
hmakholm tersisa pada Monica
1
@HenningMakholm terus berjuang melawan yang baik tidak tahu. ;)
Evan Carroll
2
Temuan yang sangat bagus!
Paul Ramsey