ST_Distance_Sphereのデフォルトの地球半径はどこから来ますか?


15

MySQLのドキュメントでは ST_Distance_Sphere

計算では、球状の地球と構成可能な半径を使用します。オプションの半径引数はメートル単位で指定する必要があります。省略した場合、デフォルトの半径は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
一部の開発者はネット上で調べましたか?postgisのソースは、何らかの光を放つかもしれません
Ian Turton

2
@IanTurtonほとんどのバグは「一部の開発者が何かをしたため、ソースがそれに光を当てる可能性があります」に減らすことができます。誰も話を知らなかった場合にそれが必要になると考えて、私は仕事をするつもりでした。以下の回答をご覧ください。
エヴァンキャロル

1
タイプミスがあったのかもしれませんが、それらは6370996を意味していました...それはClarke 1866の真の半径に非常に近いものです。
mkennedy

回答:


21

OK、これは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_distanceBruce MomjianによるPre-PostGISモジュールです。私はここで6370986をBmomjian定数と宣言します。これは、MySQLを満足させるためのメートル単位の地球の適切な近似です。たぶん長い間ではありませんが。


2
しかし、その非常に正確な数値3958.747716はどこから来たのでしょうか?私は見つけることができる最も近い米国の数である3958.74795、ある調査 ,,, 6371キロでマイルを、しかしため、そのまだ葉約37センチ不明
hmakholmはモニカの上に残って

1
@HenningMakholm良い戦いとは見当違いです。;)
エヴァンキャロル

2
とても素敵な発見!
ポールラムジー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.