ST_Distance_Sphere中的默认地球半径从何而来?


15

MySQL在文档中说 ST_Distance_Sphere

计算使用球形地球和可配置的半径。可选的radius参数应以米为单位。如果省略,则默认半径为6,370,986米。如果存在radius参数,但不是正数,ER_WRONG_ARGUMENTS则会发生错误。

PostGIS在的文档中说ST_Distance_Sphere(尽管这些文档不再准确

使用球形地球,半径为6370986米。

他们从哪里获得默认的6,370,986米? WGS84说长轴半径为6,378,137.0 m。现在使用平均半径的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 ...这与Clarke 1866的真实半径非常接近。
mkennedy

Answers:


21

好的,这是希拉里乌斯。我追踪到了。在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。当然,只需将其截断并将其存储在a中,long因为为什么不这样做。

因此,在本质上,在MySQL的半径从懒惰复制工作从PostGIS的提升转换的半径英里米,从一个不起眼的常数从随机20岁的PostgreSQL模块

earth_distance是Bruce Momjian编写的PostGIS之前的模块。我在此宣布6370986为Bmomjian常数:以米为单位的近似地球,可以满足MySQL的要求。虽然可能不会很久。


2
但是,那个非常精确的数字3958.747716是从哪里来的呢?我能找到的最接近的是3958.74795,它是美国调查的英里数,即6371公里,但仍然有约37厘米的下落不明,,,
hmakholm留在了莫妮卡(Monica),2017年

1
@HenningMakholm继续打好仗,不知道。;)
Evan Carroll

2
很不错的发现!
保罗·拉姆齐
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.