ST_Distance_Sphere'deki varsayılan Dünya yarıçapı nereden geliyor?


15

MySQL, ST_Distance_Sphere

Hesaplamalar küresel bir toprak ve yapılandırılabilir bir yarıçap kullanır. İsteğe bağlı yarıçap argümanı metre cinsinden verilmelidir. Atlanırsa, varsayılan yarıçap 6.370.986 metredir. Yarıçap bağımsız değişkeni varsa ancak pozitif değilse, bir ER_WRONG_ARGUMENTShata oluşur.

PostGIS , dokümanlarda diyor ST_Distance_Sphere(ancak dokümanlar artık doğru değil )

Küresel bir dünya ve 6370986 metrelik yarıçapı kullanır.

Varsayılan 6.370.986 metreyi nereden aldılar? WGS84 , ana eksen yarıçapının 6.378.137,0 m olduğunu söylüyor. Artık Ortalama Yarıçap kullanan PostGIS, temel olarak 6371008 kullanır.

Looking kodu

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

bunun anlamı

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

Daha yeni sürümler çok daha az verimli, daha karmaşık ve Pro4j kullanıyor ancak aynı şeyi yapıyor gibi görünüyor.

Hala 6370986 nereden geliyor?


1
WGS84 için bu değer hala birkaç metre daha büyük olsa da (6.371.008.771) (2*minorAxis+majorAxis)/3
JGH

evet, bu neden tutarsızlık.
Evan Carroll

2
Bazı geliştirici net baktı? Postgis kaynağı üzerine biraz ışık tutabilir
Ian Turton

2
@IanTurton Çoğu hata "bazı geliştiriciler bir şey yaptı ve kaynak üzerine ışık verebilir" olarak azaltılabilir. İşi yapmayı amaçladım, kimse hikayeyi bilmiyorsa ne olacağını anladım. Aşağıdaki cevaba bakınız.
Evan Carroll

1
Belki bir yazım hatası vardı ve bunlar 6370996 demekti ... Bu Clarke 1866'nın otoriter yarıçapına çok yakındı.
mkennedy

Yanıtlar:


21

Tamam, bu hilarriuusss . Bunu takip ettim. lwgeom/lwgeom_spheroid.cPostGIS 1.0.0rc4'ün eski bir kopyasında bunu görebilirsiniz,

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

Dokümanlarına geçtiğinizde earthdistanceşunları bulacaksınız:

Modülün küp tabanlı kısmından farklı olarak, üniteler burada kablolanmıştır: earth()fonksiyonun değiştirilmesi bu operatörün sonuçlarını etkilemeyecektir.

Ve bu kablolu numara: EARTH_RADIUSburada görülebilir

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

Böylece basit bir şey yapabilirsiniz.

EARTH_RADIUS * MILES_TO_METERS = EARTH_RADIUS_IN_METERS
 3958.747716 * 1609.344        = 6370986.884258304

Ve sende var 6370986.884258304. Tabii ki, sadece kesin ve bir longneden saklayın .

Yani özünde, MySQL yarıçapı edildi PostGIS bir tembel kopye işten kaldırdı metre mil çapındaki dönüştürülen bir gelen bilinmeyen bir katsayısına sahiptir rasgele 20 yaşındaki PostgreSQL modülü .

earth_distanceBruce Momjian tarafından üretilen bir PostGIS öncesi modüldür. Burada 6370986'yı Bmomjian Sabiti olarak ilan ediyorum: MySQL'i tatmin etmek için Dünya'nın metre cinsinden iyi bir nuff yaklaşımı. Yine de uzun süre olmasa da.


2
Ama o zaman bu kesin rakam 3958.747716 nereden geldi? Bulabileceğim en yakın ABD sayısını ise 3.958,74795 olduğu anket ,,, 6371 kilometre mil, ama için yine de yaprakları 37 hakkında cm'lik akıbeti
hmakholm Monica arta kalan

1
@HenningMakholm iyi kavga hiçbir fikrim yok mücadele. ;)
Evan Carroll

2
Çok güzel bulmak!
Paul Ramsey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.