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
कुछ डेवलपर ने इसे नेट पर देखा? PostGIS स्रोत कुछ प्रकाश उस पर फेंक कर सकते हैं
इयान Turton

2
@IanTurton अधिकांश बग्स को "कुछ डेवलपर ने कुछ किया और स्रोत उस पर प्रकाश फेंक सकता है।" मुझे काम करने का इरादा था, यह समझकर कि अगर किसी को कहानी नहीं पता है तो यह क्या होगा। नीचे उत्तर देखें।
इवान कैरोल

1
शायद एक टाइपो था और उनका मतलब था 6370996 ... जो क्लार्क 1866 के ऑटिहेलिक दायरे के बहुत करीब है।
mkennedy

जवाबों:


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। बेशक, बस इसे काट दें और इसे एक स्टोर में स्टोर करें longक्योंकि ऐसा क्यों नहीं है।

इसलिए संक्षेप में, MySQL में त्रिज्या को PostGIS से एक आलसी-कॉपी-जॉब से हटा दिया गया था, जो एक यादृच्छिक 20-वर्षीय पोस्टग्रेक्यूएल मॉड्यूल से एक अस्पष्ट निरंतर से मीटर में एक त्रिज्या को मीटर में परिवर्तित कर दिया था

earth_distanceब्रूस मोम्जियन द्वारा प्री-पोस्टजीआईएस मॉड्यूल है। मैं इसके द्वारा 6370986 Bmomjian कॉन्स्टेंट को घोषित करता हूं: एसक्यूएल को संतुष्ट करने के लिए मीटर में पृथ्वी का एक अच्छा नट 'सन्निकटन। हालांकि शायद लंबे समय तक नहीं।


2
लेकिन यह बहुत सटीक आंकड़ा 3958.747716 कहां से आया, तब? निकटतम मैं पा सकता हूं 3958.74795, जो 6371 किलोमीटर में अमेरिकी सर्वेक्षण मील की संख्या है , लेकिन अभी भी लगभग 37 सेमी के लिए बेहिसाब छोड़ देता है,,
हमखोलम मोनिका

1
@HenningMakholm अच्छी लड़ाई लड़ रहे हैं बिना किसी विचार के। ;)
इवान कैरोल

2
बहुत अच्छा लगा!
पॉल रेम्सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.