2009-07-10 12 views
9

मैं वर्तमान में सटीक ऊंचाई माप के साथ संयुक्त जीपीएस डेटा से निपट रहा हूं। मैं लगातार दो अंक के बीच की दूरी की गणना करना चाहता हूं। WGS84 ellipsoid का उपयोग करके दो बिंदुओं के बीच दूरी की गणना करने के बारे में जानकारी के बारे में बहुत सारी जानकारी है।भूगर्भीय दूरी की गणना करते समय ऊंचाई में लेना

हालांकि, मैं किसी भी जानकारी है कि ऊंचाई इस दूरी गणना के लिए खाते में परिवर्तन लेता नहीं मिला।

क्या किसी को ऐसी वेबसाइटों, कागजात, किताबों आदि के बारे में पता है जो इस तरह की विधि का वर्णन करते हैं? धन्यवाद

संपादित: SQL सर्वर 2008 भौगोलिक विस्तार भी उपेक्षा ऊंचाई जानकारी जब दूरी की गणना।

+0

मैं WGS84 समीकरणों को देखा नहीं है, तो एक जवाब के रूप में इस लेखन नहीं कर रहा हूँ। उस ने कहा, ऐसा लगता है कि आप अपने माप बिंदु को "नई" सतह बनाने के लिए त्रिज्या या दो को ट्विक करने में सक्षम होना चाहिए। यदि आपकी ऊंचाई माप जीपीएस आधारित है तो यह शायद सबसे अच्छा काम करेगा; यदि यांत्रिक साधनों (उदाहरण के लिए, वायु दाब) पर आधारित है, तो "समुद्र स्तर" मॉडल geoid के साथ बहुत कम संबंध हो सकता है। – kdgregory

+0

क्या आपने कभी इसके लिए एक अच्छा समाधान किया है? – lnafziger

उत्तर

0

मैं सुझाव दूंगा कि WGS84 का उपयोग करने वाली किसी भी दूरी पर आपको काफी बेहतर सटीकता मिलेगी कि ऊंचाई में अंतर कोई फर्क नहीं पड़ता। और किसी भी दूरी पर जहां ऊंचाई में अंतर है, आपको शायद सीधे लाइन अनुमान का उपयोग करना चाहिए।

0

ऐसा करने के लिए आपको पहला मुद्दा यह पता करना है कि ऊंचाई में परिवर्तन को कैसे परिभाषित किया जाए। सामान्य समीकरण काम करते हैं क्योंकि वे दो आयामी सतह पर हैं, हालांकि तीसरा आयाम जोड़ना मतलब है कि छोटी दूरी की सरल परिभाषा अब लागू नहीं होती है, उदाहरण के लिए अब त्रिज्या आयाम 'खेल में' है, आपकी सबसे छोटी दूरी मूल के माध्यम से कटौती कर सकती है दीर्घवृत्ताभ। यह थोड़ा तेज़ और गंदा है, लेकिन आपका सबसे अच्छा समाधान यह मानना ​​है कि अक्षांश परिवर्तन की दर इलिप्सिड पर मूल 2 डी पथ के साथ स्थिर है। फिर आप लंबाई के रूप में 2 डी दूरी की गणना कर सकते हैं, ऊंचाई के परिवर्तन की दर को बाहर कर सकते हैं और फिर त्रिभुज के एक तरफ 2 डी दूरी के साथ लंबाई में वृद्धि की गणना करने के लिए पाइथागोरस का उपयोग कर सकते हैं, और ऊंचाई दूसरी लंबाई है।

6

मैंने निरंतर ऊंचाई के रूप में प्रारंभ और अंत ऊंचाई के औसत का उपयोग करके एक डब्लूजीएस 84 दूरी समारोह लागू किया। यदि आप निश्चित हैं कि आपके पथ के साथ अपेक्षाकृत कम ऊंचाई भिन्नता होगी तो यह स्वीकार्य रूप से अच्छी तरह से काम करता है (त्रुटि आपके दो एलएलए बिंदुओं के ऊंचाई अंतर के सापेक्ष है)।

/// <summary> 
    /// Gets the geodesic distance between two pathpoints in the current mode's coordinate system 
    /// </summary> 
    /// <param name="point1">First point</param> 
    /// <param name="point2">Second point</param> 
    /// <param name="mode">Coordinate mode that both points are in</param> 
    /// <returns>Distance between the two points in the current coordinate mode</returns> 
    public static double GetGeodesicDistance(PathPoint point1, PathPoint point2, CoordMode mode) { 
     // calculate proper geodesics for LLA paths 
     if (mode == CoordMode.LLA) { 
      // meeus approximation 
      double f = (point1.Y + point2.Y)/2 * LatLonAltTransformer.DEGTORAD; 
      double g = (point1.Y - point2.Y)/2 * LatLonAltTransformer.DEGTORAD; 
      double l = (point1.X - point2.X)/2 * LatLonAltTransformer.DEGTORAD; 

      double sinG = Math.Sin(g); 
      double sinL = Math.Sin(l); 
      double sinF = Math.Sin(f); 

      double s, c, w, r, d, h1, h2; 
      // not perfect but use the average altitude 
      double a = (LatLonAltTransformer.A + point1.Z + LatLonAltTransformer.A + point2.Z)/2.0; 

      sinG *= sinG; 
      sinL *= sinL; 
      sinF *= sinF; 

      s = sinG * (1 - sinL) + (1 - sinF) * sinL; 
      c = (1 - sinG) * (1 - sinL) + sinF * sinL; 

      w = Math.Atan(Math.Sqrt(s/c)); 
      r = Math.Sqrt(s * c)/w; 
      d = 2 * w * a; 
      h1 = (3 * r - 1)/2/c; 
      h2 = (3 * r + 1)/2/s; 

      return d * (1 + (1/LatLonAltTransformer.RF) * (h1 * sinF * (1 - sinG) - h2 * (1 - sinF) * sinG)); 
     } 

     PathPoint diff = new PathPoint(point2.X - point1.X, point2.Y - point1.Y, point2.Z - point1.Z, 0); 
     return Math.Sqrt(diff.X * diff.X + diff.Y * diff.Y + diff.Z * diff.Z); 
    } 

अभ्यास में हमने पाया है कि ऊंचाई अंतर शायद ही कभी एक बड़े फर्क नहीं पड़ता, हमारे पथ आमतौर पर ऊंचाई 100 मीटर के आदेश पर बदलती के साथ लंबे समय 1-2km रहे हैं:

यहाँ मेरी कोड (सी #) है और हम WGS84 ellipsoid unmodified का उपयोग कर औसत बनाम ~ 5m परिवर्तन के बारे में देखते हैं।

संपादित करें:

यह करने के लिए जोड़ने के लिए, यदि आप बड़े ऊंचाई परिवर्तन की उम्मीद करते हैं, तो आप अपने WGS84 ECEF (पृथ्वी केन्द्रित पृथ्वी निर्धारित) के लिए निर्देशांक परिवर्तित कर सकते हैं और के रूप में के निचले भाग में दिखाया गया है सीधे लाइन पथ का मूल्यांकन मेरी समारोह। ECEF करने के लिए एक बिंदु परिवर्तित करने के लिए सरल है:

/// <summary> 
    /// Converts a point in the format (Lon, Lat, Alt) to ECEF 
    /// </summary> 
    /// <param name="point">Point as (Lon, Lat, Alt)</param> 
    /// <returns>Point in ECEF</returns> 
    public static PathPoint WGS84ToECEF(PathPoint point) { 
     PathPoint outPoint = new PathPoint(0); 

     double lat = point.Y * DEGTORAD; 
     double lon = point.X * DEGTORAD; 
     double e2 = 1.0/RF * (2.0 - 1.0/RF); 
     double sinLat = Math.Sin(lat), cosLat = Math.Cos(lat); 

     double chi = A/Math.Sqrt(1 - e2 * sinLat * sinLat); 
     outPoint.X = (chi + point.Z) * cosLat * Math.Cos(lon); 
     outPoint.Y = (chi + point.Z) * cosLat * Math.Sin(lon); 
     outPoint.Z = (chi * (1 - e2) + point.Z) * sinLat; 

     return outPoint; 
    } 

संपादित करें 2:

मैं अपने कोड में अन्य चर से कुछ के बारे में पूछा गया था:

// RF is the eccentricity of the WGS84 ellipsoid 
public const double RF = 298.257223563; 

// A is the radius of the earth in meters 
public const double A = 6378137.0; 

LatLonAltTransformer एक वर्ग मैं प्रयोग किया जाता है LatLonAlt से कनवर्ट करने के लिए ईसीईएफ निर्देशांक को निर्देशांक और उपरोक्त स्थिरांक परिभाषित करता है।

+0

मुझे नहीं लगता कि प्रश्नकर्ता परिस्थितियों के बारे में पूछ रहा था जहां ऊंचाई प्रभावी रूप से स्थिर है। मुझे लगता है कि बिंदु दो बिंदुओं के बीच महान-सर्कल-शैली दूरी को ढूंढना था जहां ऊंचाई दो बिंदुओं के बीच काफी भिन्न थी। – jprete

+0

शायद मैंने स्पष्ट नहीं किया, लेकिन मेरा समाधान दो बिंदुओं की ऊंचाई का औसत है और निरंतर कॉल करता है। दो अलग-अलग ऊंचाईों का उपयोग करके भूगर्भीय दूरी का मूल्यांकन करना समय लेने वाली और मुश्किल है, खासकर जब अनुमान को बहुत अच्छे परिणाम मिलते हैं। –

+0

मेरा मानना ​​है कि मूल प्रश्नकर्ता ऊंचाई परिवर्तन से उत्पन्न दूरी में मामूली परिवर्तन को पकड़ना चाहता है; यही कारण है कि औसत, या अधिकतम alt, या min alt का उपयोग करना, समाधान नहीं है। स्ट्रेट-लाइन दूरी ऊंचाई-भिन्नता समस्या का समाधान नहीं है, क्योंकि ऐसी सीधी रेखाओं में उपयुक्त चढ़ाई/मूल प्रोफ़ाइल नहीं है जिसे आप कहने की उम्मीद करेंगे "मैंने 60 मील की यात्रा की और उसमें 20000 फीट की ऊंचाई बदल दी पहर"। जैसे यदि आपके अंतिम बिंदु क्षितिज से नीचे है, तो पथ के नीचे सुरंग के लिए पथ की पहली बात है। – jprete

0

स्टार्टर्स के लिए, आपको एक मॉडल की आवश्यकता है जो आपको बताती है कि दोनों बिंदुओं के बीच रेखा पर ऊंचाई कैसे बदलती है। ऐसे मॉडल के बिना, आपके पास दो बिंदुओं के बीच की दूरी की कोई निरंतर परिभाषा नहीं है।

यदि आपके पास एक रैखिक मॉडल था (अंक के बीच की दूरी का 50% यात्रा का मतलब है कि आप ऊंचाई के 50% के माध्यम से ऊपर जाते हैं), तो आप शायद दिखा सकते हैं कि पूरी चीज एक सही त्रिकोण थी; यानी आप कार्य करते हैं कि यह निर्धारित करने के उद्देश्य से कि दुनिया की ऊंचाई कैसे प्रभावित करती है, यह निर्धारित करने के उद्देश्य से दुनिया सपाट है। जमीन के साथ की दूरी आधार है, ऊंचाई परिवर्तन त्रिभुज की ऊंचाई है, और hypotenuse आपकी अनुमानित वास्तविक यात्रा दूरी बिंदु से बिंदु तक है।

यदि आप इसे और परिशोधित करना चाहते हैं, तो आप ध्यान दें कि उपरोक्त मॉडल infinitesimal दूरी के लिए पूरी तरह से अच्छा है, जिसका अर्थ है कि आप वर्तमान ऊंचाई का उपयोग करते हुए दूरी, कैलकुस-शैली के व्यक्तिगत डेल्टा में फिर से सक्रिय हो सकते हैं जमीन की दूरी की गणना करने के लिए और फिर यात्रा के दूरी पर उपशीर्षक-परिवर्तन योगदान की गणना करने के लिए उसी त्रिकोणमितीय अनुपात का उपयोग करना। मैं संभवतः सेगमेंट के 10 से 100 टुकड़ों के साथ() लूप में ऐसा कर सकता हूं, और संभवतः परीक्षण और त्रुटि से वास्तविक मूल्य के ईपीएसलॉन के भीतर आवश्यक टुकड़ों की संख्या पता लगाना चाहिए। इस मॉडल के तहत दो बिंदुओं के बीच वास्तविक दूरी को समझने के लिए लाइन अभिन्न अंग को भी काम करना संभव होगा।

0

आपको बड़ी 2 डी दूरी अलगाव के लिए ऊंचाई की परवाह नहीं है। तो यदि आपको प्राप्त होने वाली दूरी 20 (या शायद 50) किमी कहती है, तो ऊंचाई ऊंचाई के बारे में कौन परवाह करता है (आपकी आवश्यकताओं के मामले पर निर्भर करता है)। 20 किमी के तहत, ऊंचाई अंतर के लिए सरल पायथागोरियन अतिरिक्त में फ़ीड करें। इसे आसानी से फ़ीड करें।

Distance between two geo-points?

संबंधित मुद्दे