2009-02-20 13 views
21

मेरे पास एक जीपीएस ट्रैक के साथ GPX file है। अब मैं इस ट्रैक के साथ कवर की गई दूरी की गणना करना चाहता हूं।एक जीपीएक्स फ़ाइल से दूरी की गणना कैसे करें?

इसकी गणना करने का सबसे अच्छा तरीका क्या है?

उत्तर

23

दो बिंदुओं (आपकी जीपीएक्स फ़ाइल में प्रत्येक बिंदु की जोड़ी) के बीच की दूरी की गणना करने का पारंपरिक तरीका हावर्सिन फॉर्मूला के साथ है।

मेरे पास एक SQL सर्वर फ़ंक्शन है जो एल्गोरिदम लागू करता है। यह अन्य भाषाओं में अनुवाद करना आसान होना चाहिए:

create function dbo.udf_Haversine(@lat1 float, @long1 float, 
        @lat2 float, @long2 float) returns float begin 
    declare @dlon float, @dlat float, @rlat1 float, 
       @rlat2 float, @rlong1 float, @rlong2 float, 
       @a float, @c float, @R float, @d float, @DtoR float 

    select @DtoR = 0.017453293 
    select @R = 3959  -- Earth radius 

    select 
     @rlat1 = @lat1 * @DtoR, 
     @rlong1 = @long1 * @DtoR, 
     @rlat2 = @lat2 * @DtoR, 
     @rlong2 = @long2 * @DtoR 

    select 
     @dlon = @rlong1 - @rlong2, 
     @dlat = @rlat1 - @rlat2 

    select @a = power(sin(@dlat/2), 2) + cos(@rlat1) * 
        cos(@rlat2) * power(sin(@dlon/2), 2) 
    select @c = 2 * atn2(sqrt(@a), sqrt([email protected])) 
    select @d = @R * @c 

    return @d 
end 

यह माइल्स में दूरी देता है। किलोमीटर के लिए, पृथ्वी त्रिज्या को इसके किमी के बराबर के साथ बदलें।

Here अधिक गहराई से स्पष्टीकरण है।

संपादित करें: यह फ़ंक्शन एक ज़िप कोड डेटाबेस के साथ त्रिज्या खोज करने के लिए पर्याप्त तेज़ और सटीक है। यह वर्षों के लिए this site पर एक अच्छा काम कर रहा है (लेकिन यह अब नहीं करता है, क्योंकि लिंक अब टूटा हुआ है)।

+0

बहुत बहुत धन्यवाद। मैं इसे जावा में बंद कर दूंगा और इसे यहां पोस्ट करूंगा। @ डीओटीआर का क्या अर्थ है? त्रिज्या से दूरी? – guerda

+1

यही वह कारक है जो डिग्री को रेडियंस, पीआई/180 में परिवर्तित करता है। – cdonner

+0

लिंक के लिए धन्यवाद। मैं जल्द ही अपने जावा संस्करण को पोस्ट करूंगा – guerda

1

Mike Gavaghan has an algorithm अपनी साइट पर दूरी की गणना के लिए। कोड का एक सी # और एक जावा संस्करण भी है।

1

Vincenty formulae का डेल्फी कार्यान्वयन here पाया जा सकता है।

+0

क्या आपके पास इसके लिए एक अपडेट किया गया लिंक है? –

+0

@ एडम कार्टर: मैंने यूआरएल की जांच की है और यह अभी भी ठीक है। – menjaraz

1

यहां एक स्कैला कार्यान्वयन है।

3958.761 मील में mean radius of the Earth है। परिणाम (किमी या कुछ अन्य इकाई) में परिणाम प्राप्त करने के लिए बस इस नंबर को बदलें।

// The Haversine formula 
def haversineDistance(pointA: (Double, Double), pointB: (Double, Double)): Double = { 
    val deltaLat = math.toRadians(pointB._1 - pointA._1) 
    val deltaLong = math.toRadians(pointB._2 - pointA._2) 
    val a = math.pow(math.sin(deltaLat/2), 2) + math.cos(math.toRadians(pointA._1)) * math.cos(math.toRadians(pointB._1)) * math.pow(math.sin(deltaLong/2), 2) 
    val greatCircleDistance = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) 
    3958.761 * greatCircleDistance 
} 

// A sequence of gpx trackpoint lat,long pairs parsed from the track GPX data 
val trkpts: Seq[(Double, Double)] = { 
    val x = scala.xml.XML.loadString(track) 
    (x \\ "trkpt").map(trkpt => ((trkpt \ "@lat").text.toDouble, (trkpt \ "@lon").text.toDouble)) 
} 

// Distance of track in miles using Haversine formula 
val trackDistance: Double = { 
    trkpts match { 
    case head :: tail => tail.foldLeft(head, 0.0)((accum, elem) => (elem, accum._2 + haversineDistance(accum._1, elem)))._2 
    case Nil => 0.0 
    } 
} 
0

यह प्रश्न पुराना है, लेकिन मैं पूर्णता के लिए एक अजगर विकल्प जोड़ना चाहता हूं। GeoPy में great-circle distance और Vincenty distance दोनों हैं।

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