2013-04-08 8 views
5

के बीच दूरी (x, y) में दूरी की गणना करें, मैं दो जीपीएस पॉइंट्स के बीच की दूरी की गणना करने के लिए एक आसान तरीका ढूंढ रहा हूं, इसलिए मुझे परिणाम मिलते हैं: "आपको एक्स मीटर ऊपर जाना है और y मीटर से बाएं - इसलिए मैं 2 डी-समन्वय प्रणाली के साथ काम कर सकता हूं, जहां मेरी स्थिति (0,0) है और दूसरी स्थिति मेरी स्थिति से मीटर में (x, y) में दूरी दिखा रही है।दो जीपीएस-पॉइंट्स

मेरा विचार haversine सूत्र का उपयोग अंक के बीच दूरी की गणना करने के लिए था। (यह मेरा कर्ण रिटर्न)

इसके अलावा, मैं इस दो अंक के बीच असर की गणना कर रहा हूँ। यह मेरा अल्फा है।

इन दो मूल्यों के साथ, मैं अपनी समस्या को हल करने के लिए मूल त्रिकोणमिति कार्यों का उपयोग करना चाहता था।

तो मैंने गणना करने की कोशिश की: catheti_1 = sin(alpha) * hypotenuse, catheti_2 = cos(alpha) * hypotenuse

शायद मैं कुछ गलत कर रहा हूं, लेकिन इस समय मेरे परिणाम बेकार हैं।

तो मेरा सवाल है: मैं दो जीपीएस अंकों के बीच एक्स और वाई दिशा में दूरी की गणना कैसे कर सकता हूं?

मैं निम्नलिखित प्रक्रिया में अल्फा की गणना कर रहा हूँ:

public static double bearingTo(GPSBean point1, GPSBean point2) { 
    double lat1 = Math.toRadians(point1.latitude); 
    double lat2 = Math.toRadians(point2.latitude); 
    double lon1 = Math.toRadians(point1.longitude); 
    double lon2 = Math.toRadians(point2.longitude); 

    double deltaLong = lon2 - lon1; 

    double y = Math.sin(deltaLong) * Math.cos(lat2); 
    double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) 
      * Math.cos(lat2) * Math.cos(deltaLong); 
    double bearing = Math.atan2(y, x); 

    return (Math.toDegrees(bearing) + 360) % 360; 
} 
+0

आप 'अल्फा' की गणना कैसे कर रहे हैं? – Barranka

+0

मैंने अल्फा के लिए विधि जोड़ दी है;) – Frame91

+0

@ बोरीयन नं। यह डुप्लिकेट नहीं है, क्योंकि मुझे इन दो बिंदुओं के बीच सीधी दूरी की आवश्यकता नहीं है। मैं harversine सूत्र के बारे में जानता हूं, लेकिन मुझे टैक्सीकैब ज्यामिति में "चलना" है;) – Frame91

उत्तर

5

मैं सिर्फ अपने कोड लागू किया, संदर्भ बिंदु के रूप में NYC और बोस्टन की अनुमानित निर्देशांकों का उपयोग कर, और जैसा कि http://www.movable-type.co.uk/scripts/latlong.html में पाया Haversine सूत्र को लागू करने (आप जो दिखाई नहीं दिया):

long1 = -71.02; lat1 = 42.33; 
long2 = -73.94; lat2 = 40.66; 

lat1 *=pi/180; 
lat2 *=pi/180; 
long1*=pi/180; 
long2*=pi/180; 

dlong = (long2 - long1); 
dlat = (lat2 - lat1); 

// Haversine formula: 
R = 6371; 
a = sin(dlat/2)*sin(dlat/2) + cos(lat1)*cos(lat2)*sin(dlong/2)*sin(dlong/2) 
c = 2 * atan2(sqrt(a), sqrt(1-a)); 
d = R * c; 

मुझे इस कोड चलाने के लिए, मैं जो ऊपर साइट से जवाब के साथ सहमत हैं d = 306 मिलता है।

असर के लिए मुझे 52 डिग्री मिलती है - फिर से, साइट के पास क्या मिलता है।

अपने शेष कोड को देखे बिना यह जानना मुश्किल है कि आपका उत्तर अलग क्यों है।

नोट: जब दो अंक एक साथ करीब हैं, तो आप अनुमान के सभी प्रकार बना सकता है, लेकिन इस कोड को अभी भी काम करना चाहिए - सूत्र अच्छा संख्यात्मक स्थिरता है, क्योंकि यह देशांतर, अक्षांश के बीच अंतर का sin (बजाय का उपयोग कर पाप का अंतर)।

परिशिष्ट:

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

+0

हे धन्यवाद। मैंने टाइपो को सही करने के बाद भी इसे स्वयं परीक्षण किया है और मुझे कुछ संभावित मूल्य मिलते हैं। शायद यह सिर्फ टाइपो था;) – Frame91

+0

@richard - गलती को ठीक करने के लिए धन्यवाद! – Floris

+0

आपका स्वागत है, @ फ्लोरिस :-) – Richard

2

उपयोग Haversine सूत्र दो अंक अक्षांश/देशांतर (संख्यात्मक डिग्री में)

से

द्वारा निर्दिष्ट के बीच की दूरी (किमी में) की गणना करने के लिए: Haversine सूत्र - आर डब्ल्यूफार्म से Sinnott,

स्काई और टेलीस्कोप, खंड 68, कोई 2 "Haversine के गुण", 1984

http://www.census.gov/cgi-bin/geo/gisfaq?Q5.1

उदाहरण उपयोग:

result.value = LatLon.distHaversine(lat1.value.parseDeg(), long1.value.parseDeg(), * lat2.value.parseDeg(), long2.value.parseDeg()); 

जावास्क्रिप्ट:

LatLon.distHaversine = function(lat1, lon1, lat2, lon2) { 
    var R = 6371; // earth's mean radius in km 
    var dLat = (lat2-lat1).toRad(); 
    var dLon = (lon2-lon1).toRad(); 
    lat1 = lat1.toRad(), lat2 = lat2.toRad(); 
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(lat1) * Math.cos(lat2) * Math.sin(dLon/2) * Math.sin(dLon/2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c; 

    return d; 
}