2009-07-10 9 views
5

2 geocodes के बीच की दूरी की गणना के लिए सूत्र क्या है? मैंने इस साइट पर कुछ उत्तरों को देखा है लेकिन वे मूल रूप से SQL सर्वर 08 फ़ंक्शंस पर भरोसा करते हैं, मैं अभी तक 08 पर नहीं हूं। किसी भी सहायता की सराहना की जाएगी।2 geocodes के बीच दूरी

उत्तर

8

पृथ्वी का अनुमान लगाने और Haversine सूत्र का उपयोग करें। आप निम्न URL है, जो आपको अपनी पसंद के भाषा में अनुवाद कर सकते हैं पर एक जावास्क्रिप्ट संस्करण प्राप्त कर सकते हैं: http://escience.anu.edu.au/project/04S2/SE/3DVOT/3DVOT/pHatTrack_Application/Source_code/pHatTrack/Converter.java

-1

पायथागोरियन प्रमेय?

+1

हां, पृथ्वी सपाट नहीं है। –

+0

यह आपके द्वारा उपयोग किए जा रहे प्रक्षेपण पर निर्भर करता है। एक राज्य विमान प्रक्षेपण है जो अपेक्षाकृत कम दूरी पर बहुत सटीक है। एक राज्य विमान प्रक्षेपण के साथ, पायथागोरियन प्रमेय ठीक है। यदि आप अक्षांश/देशांतर निर्देशांक का उपयोग कर रहे हैं, जो पहले से ही कोणों (दूरी नहीं) में व्यक्त किए गए हैं, तो आप पाइथोगोरियन प्रमेय का उपयोग नहीं कर सकते हैं। –

0

आप किसी क्षेत्र पर दो बिंदुओं के बीच ग्रेट सर्किल पथ की लंबाई की तलाश में हैं। Google पर "ग्रेट सर्किल पथ" या "ग्रेट सर्कल दूरी" को देखने का प्रयास करें।

0

क्षमा करें, मुझे नहीं पता कि आप किस देश में हैं। क्या हम ईस्टिंग एंड नॉर्थिंग्स (यूके, ऑर्डेंस सर्वे सिस्टम) या लेट/लांग या कुछ अन्य सिस्टम के बारे में बात कर रहे हैं? यदि हम ईस्टिंग और नॉर्थिंग की बात कर रहे हैं तो आप
वर्ग ((x1-x2)^2 + (y1-y2)^2)
इस तथ्य की अनुमति नहीं देते कि पृथ्वी एक गोलाकार है, लेकिन इसके लिए छोटी दूरी आपको नोटिस नहीं होगी। हम इसे काउंटी के भीतर बिंदुओं के बीच दूरी के लिए काम पर उपयोग करते हैं।
इस बारे में सावधान रहें कि आप कितने ग्रिड संदर्भ का उपयोग करते हैं। मुझे लगता है कि एक 8 आकृति संदर्भ आपको मीटर में दूरी देगा। अगर अगले किसी ने इसे आपूर्ति नहीं की है तो मैं अगले हफ्ते काम पर एक निश्चित उत्तर प्राप्त कर पाऊंगा।

0

यहां दूसरों द्वारा पेश किए गए पायथागोरियन प्रमेय इतनी अच्छी तरह से काम नहीं करता है।

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

distRadians (lat1,lon1) (lat2,lon2) = 
    radius_of_earth * 
    acos (cos lat1 * cos lon1 * cos lat2 * cos lon2 + 
      cos lat1 * sin lon1 * cos lat2 * sin lon2 + 
      sin lat1 * sin lat2) where 
    radius_of_earth = 6378 -- kilometers 


distDegrees a b = distRadians (coord2rad a) (coord2rad b) where 
    deg2rad d = d * pi/180 
    coord2rad (lat,lon) = (deg2rad lat, deg2rad lon) 

distRadians की आवश्यकता है अपने कोण रेडियन में दिया जाता है।

distDegrees एक सहायक कार्य है जो डिग्री में अक्षांश और अक्षांश ले सकता है।

इस सूत्र के व्युत्पन्न के बारे में अधिक जानकारी के लिए this series of posts देखें।

तुम सच में अतिरिक्त परिशुद्धता पृथ्वी संभालने ellipsoidal है द्वारा दी की जरूरत है हैं, तो यह FAQ देखें: http://www.movable-type.co.uk/scripts/gis-faq-5.1.html

2

यह ग # में यह तुम्हारे लिए क्या करेंगे।

public enum DistanceType { Miles, Kilometers }; 

public struct Position 
{ 
    public double Latitude; 
    public double Longitude; 
} 

class Haversine 
{ 

    public double Distance(Position pos1, Position pos2, DistanceType type) 
    { 
     double preDlat = pos2.Latitude - pos1.Latitude; 
     double preDlon = pos2.Longitude - pos1.Longitude; 
     double R = (type == DistanceType.Miles) ? 3960 : 6371; 
     double dLat = this.toRadian(preDlat); 
     double dLon = this.toRadian(preDlon); 
     double a = Math.Sin(dLat/2) * Math.Sin(dLat/2) + 
     Math.Cos(this.toRadian(pos1.Latitude)) * Math.Cos(this.toRadian(pos2.Latitude)) * 
     Math.Sin(dLon/2) * Math.Sin(dLon/2); 
     double c = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a))); 
     double d = R * c; 
     return d; 
    } 

    private double toRadian(double val) 
    { 
     return (Math.PI/180) * val; 
    } 

तब मुख्य कोड में इन का उपयोग करने की:

Position pos1 = new Position(); 
        pos1.Latitude = Convert.ToDouble(hotelx.latitude); 
        pos1.Longitude = Convert.ToDouble(hotelx.longitude); 
        Position pos2 = new Position(); 
        pos2.Latitude = Convert.ToDouble(lat); 
        pos2.Longitude = Convert.ToDouble(lng); 
        Haversine calc = new Haversine(); 

        double result = calc.Distance(pos1, pos2, DistanceType.Miles); 
2

तो

  • क्या आप जानते 2 अंक "नहीं हैं कि

    नाम स्थान के भीतर इन डाल एक दूसरे से बहुत दूर "

  • और आप "उचित रूप से छोटे" त्रुटि को सहन करते हैं।

फिर, विचार है कि पृथ्वी 2 अंक के बीच चौड़ी होती है:

  • अक्षांश दिशा में दूरी अंतर EarthRadius * latitude difference
  • देशांतर दिशा में दूरी अंतर EarthRadius * longitude difference * cos(latitude) है। हम cos(lat) से गुणा करते हैं क्योंकि अक्षांश में परिवर्तन होने पर रेखांश डिग्री समान किमी दूरी नहीं बनाती है। P1 और P2 हैं करीब है, क्योंकि (latP1) cos (latP2)
  • फिर pythagore

जावास्क्रिप्ट में से करीब है:

function ClosePointsDistance(latP1, lngP1, latP2, lngP2) { 
    var d2r = Math.PI/180, 
    R=6371; // Earth Radius in km 
    latP1 *= d2r; lngP1 *= d2r; latP2 *= d2r; lngP2 *= d2r; // convert to radians 
    dlat = latP2 - latP1, 
    dlng = (lngP2 - lngP1) * Math.cos(latP1); 
    return R * Math.sqrt(dlat*dlat + dlng*dlng); 
} 

मैं पेरिस और ऑरलियन्स (फ्रांस) के बीच यह परीक्षण किया: फॉर्मूला 110.9 किमी पाता है जबकि (सटीक) हावर्सिन फॉर्मूला 111.0 किमी पाता है।

!!! मेरिडियन 0 के आसपास स्थितियों से सावधान रहें (आप इसे स्थानांतरित कर सकते हैं): यदि पी 1 एलएनजी 35 9 पर है और पी 2 एलएनजी 0 पर है, तो समारोह उन्हें असामान्य रूप से दूर करेगा !!!

1

यदि आप SQL सर्वर का उपयोग कर रहे हैं तो ऐसा करने का एक तरीका यहां दिया गया है।

CREATE function dist (@Lat1 varchar(50), @Lng1 varchar(50),@Lat2 varchar(50), @Lng2 varchar(50)) 
returns float 
as 
begin 

declare @p1 geography 
declare @p2 geography 

set @p1 = geography::STGeomFromText('POINT('+ @Lng1+' '+ @Lat1 +')', 4326) 
set @p2 = geography::STGeomFromText('POINT('+ @Lng2+' '+ @Lat2 +')', 4326) 

return @p1.STDistance(@p2) 
end