รัศมีโลกเริ่มต้นใน 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

ใช่นั่นคือคำถามว่าทำไมความแตกต่าง
Evan Carroll

2
นักพัฒนาบางคนมองหามันในเน็ต? แหล่งข้อมูลโพสต์อาจโยนแสงบางอย่างกับมัน
เอียน Turton

2
@IanTurton ข้อผิดพลาดส่วนใหญ่สามารถลดลงเป็น "นักพัฒนาบางคนทำอะไรบางอย่างและแหล่งที่มาอาจโยนแสงบนมัน" ฉันตั้งใจจะทำงานโดยหาว่าจะเป็นอย่างไรถ้าไม่มีใครรู้เรื่องนี้ ดูคำตอบด้านล่าง
Evan Carroll

1
อาจจะมีการพิมพ์ผิดและพวกเขาหมายถึง 6370996 ... ที่อยู่ใกล้กับรัศมี authalic ของ Clarke 1866
mkennedy

คำตอบ:


21

ตกลงนี้เป็นhilarriuusss ฉันติดตามสิ่งนี้ลง ในสำเนาเก่าของlwgeom/lwgeom_spheroid.cใน PostGIS 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ที่แปลงรัศมีไมล์เมตรจากคงปิดบังจากโมดูล PostgreSQL สุ่ม 20 ปีเก่า

earth_distanceเป็นโมดูล pre-PostGIS โดย Bruce Momjian ฉันขอประกาศค่าคงที่ Bmomjian 6370986: การประมาณที่ดีของโลกในหน่วยเมตรเพื่อตอบสนอง MySQL แม้ว่าอาจจะไม่นาน


2
แต่ตัวเลขที่แม่นยำมาก ๆ มาจากไหนล่ะ 3958.747716 ที่อยู่ใกล้ฉันสามารถหาเป็น 3958.74795 ซึ่งเป็นหมายเลขของสหรัฐสำรวจไมล์ 6371 กิโลเมตร แต่ที่ใบยังคงประมาณ 37 ซม. แปลกสำหรับ ,,,
hmakholm เหลือ Monica

1
@ HenningMakholm ยังคงต่อสู้กับการต่อสู้ที่ดีไม่มีความคิด ;)
Evan Carroll

2
หาดีมาก!
พอลแรมซีย์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.