Звідки береться радіус Землі за замовчуванням у ST_Distance_Sphere?


15

MySQL говорить у документах для ST_Distance_Sphere

Розрахунки використовують сферичну землю і настроюваний радіус. Необов’язковий аргумент радіуса слід наводити в метрах. Якщо пропущено, радіус за замовчуванням - 6,370,986 метрів. Якщо аргумент радіуса присутній, але не є позитивним, виникає ER_WRONG_ARGUMENTSпомилка.

PostGIS в документах говорить ST_Distance_Sphere: (хоча документи більше не точні )

Використовує сферичну землю і радіус 6370986 метрів.

Звідки вони взяли за замовчуванням 6,370,986 метрів? WGS84 говорить, що радіус головної осі становить 6,378,137,0 м. PostGIS, який зараз використовує середній радіус, по суті використовує 6371008.

Дивлячись на код

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

це означає

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

Новіші версії набагато менш ефективні, складніші та використовують Pro4j, але, схоже, вони роблять те саме.

Ще звідки береться 6370986?


1
Він позначає середній радіус Землі, який повинен бути (2*minorAxis+majorAxis)/3 ... хоча це значення для WGS84 все ж на кілька метрів більше (6,371,008,771)
JGH

так, це питання, чому розбіжність.
Еван Керролл

2
Якийсь розробник шукав це в мережі? Джерело постгіт може кинути на нього трохи світла
Ян Тертон

2
@IanTurton Більшість помилок можна звести до "якийсь розробник щось робив, і джерело може кидати на нього світло". Я мав намір виконати роботу, вважаючи, що це те, що потрібно, якби ніхто не знав історію. Дивіться відповідь нижче.
Еван Керролл

1
Можливо, був друкарський помилок, і вони мали на увазі 6370996 ... це дуже близько до автентичного радіуса Кларка 1866 року.
mkennedy

Відповіді:


21

Гаразд, це hilarriuusss . Я простежив це. У старій копії lwgeom/lwgeom_spheroid.cPostGIS 1.0.0rc4 ви можете бачити це,

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

Перейшовши до документів earthdistance, ви побачите це:

Зверніть увагу, що на відміну від кубової частини модуля, одиниці тут є провідними: зміна earth()функції не вплине на результати цього оператора.

І той номер з проводками: EARTH_RADIUSможна побачити тут

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

Так ви можете зробити просте.

EARTH_RADIUS * MILES_TO_METERS = EARTH_RADIUS_IN_METERS
 3958.747716 * 1609.344        = 6370986.884258304

І ти маєш своє 6370986.884258304. Звичайно, просто обріжте це і зберігайте його в longтому, що чому б ні.

Отже, по суті, радіус в MySQL був знятий з роботи з лінивою копією від PostGIS, яка перетворила радіус в милях на метри від незрозумілої константи з випадкового 20-річного модуля PostgreSQL .

earth_distance- це модуль перед PostGIS Брюсом Момдзяном. Цим я проголошую 6370986 константу Бмоджіана: гарне наближення Землі в метрах для задоволення MySQL. Хоча, можливо, ненадовго.


2
Але звідки ж тоді взялася ця дуже точна цифра 3958.747716? Найближчий я можу знайти 3958,74795, що число американських оглядових миль в 6371 кілометрів, але це все ще залишає близько 37 см неврахованих ,,,
hmakholm залишилося Моніка

1
@HenningMakholm продовжувати боротися з хорошою боротьбою немає поняття. ;)
Еван Керролл

2
Дуже приємна знахідка!
Пол Рамзі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.