2010-04-29 17 views
94

के बीच की दूरी प्राप्त करें मैं एक ऐप बनाना चाहता हूं जो जांचता है कि उपयोगकर्ता कहां से निकटतम स्थान है। मैं आसानी से उपयोगकर्ता का स्थान प्राप्त कर सकता हूं और मेरे पास अक्षांश और देशांतर वाले स्थानों की एक सूची है।दो भौगोलिक बिंदुओं

वर्तमान स्थिति के विरुद्ध सूची के निकटतम स्थान को जानने का सबसे अच्छा तरीका क्या होगा।

मुझे Google एपीआई में कुछ भी नहीं मिला।

मुझे चिंता है कि मुझे अपनी गणना का सहारा लेना होगा और गणना करने के लिए गणित करना होगा।

आप क्या सोचते हैं?

चीयर्स और पढ़ने या उत्तर देने के लिए धन्यवाद।

उत्तर

108
Location loc1 = new Location(""); 
loc1.setLatitude(lat1); 
loc1.setLongitude(lon1); 

Location loc2 = new Location(""); 
loc2.setLatitude(lat2); 
loc2.setLongitude(lon2); 

float distanceInMeters = loc1.distanceTo(loc2); 

संदर्भ: http://developer.android.com/reference/android/location/Location.html#distanceTo(android.location.Location)

+1

की तलाश में था, स्थान का उपयोग करने से शायद धीमा। डिस्टेंसबेटवीन() क्योंकि यह स्थान ऑब्जेक्ट्स का उपयोग कर रहा है लेकिन मेरे उद्देश्यों के लिए बहुत अच्छा काम करता है। – ZoltanF

+0

@praveen धन्यवाद आदमी इसका काम करता है .. –

+0

मुझे किस वर्ग को स्थान 'आयात android.location.Location;' या –

117

http://developer.android.com/reference/android/location/Location.html

distanceTo या distanceBetween में देखो। आप एक अक्षांश और देशांतर से एक स्थान वस्तु बना सकते हैं:

Location location = new Location(""); 
location.setLatitude(lat); 
location.setLongitude(lon); 
+32

distanceBetween, एक स्थिर विधि है कि अक्षांश देशांतर अंक के 2 सेट लेता है तो आप भी नहीं है किसी स्थान ऑब्जेक्ट को तुरंत चालू करने की आवश्यकता है =) –

+4

मुझे यकीन है कि उसका मतलब था कि 'दूरी' विधि के लिए। – laph

+0

यह बहुत अच्छा और सुपर सहायक है, लेकिन कन्स्ट्रक्टर में स्ट्रिंग प्रदाता क्या है? –

10

तरीकों आप इस्तेमाल कर सकते हैं की एक जोड़ी, कर रहे हैं लेकिन यह निर्धारित करने के एक सबसे अच्छा हम पहले अगर आप उपयोगकर्ता की ऊंचाई के बारे में पता कर रहे हैं पता करने की जरूरत है, साथ ही साथ अन्य बिंदुओं की ऊंचाई?

सटीकता के स्तर के आधार पर आप के बाद कर रहे हैं, या तो आप Haversine या Vincenty सूत्रों पर गौर कर सकता है ...

इन पृष्ठों विस्तार सूत्रों, और, के लिए कम गणितीय इच्छुक भी कैसे बात का स्पष्टीकरण प्रदान उन्हें स्क्रिप्ट में लागू करने के लिए!

Haversine सूत्र: http://www.movable-type.co.uk/scripts/latlong.html

Vincenty सूत्र: http://www.movable-type.co.uk/scripts/latlong-vincenty.html

आप सूत्रों में अर्थ से किसी के साथ कोई समस्या है, बस टिप्पणी और मैं उन्हें जवाब देने के लिए मेरी पूरी कोशिश करेंगे :)

29

एक अनुमानित समाधान (एक समकक्ष प्रक्षेपण के आधार पर), बहुत तेज़ (इसमें केवल 1 ट्रिगर और 1 वर्ग रूट की आवश्यकता है)।

यह अनुमान प्रासंगिक है यदि आपके अंक बहुत दूर नहीं हैं। वास्तविक हावर्सिन दूरी की तुलना में यह हमेशा से अधिक अनुमान लगाएगा। उदाहरण के लिए यह को 0.05382% से अधिक वास्तविक दूरी पर जोड़ देगा यदि आपके दो बिंदु के बीच डेल्टा अक्षांश या देशांतर 4 दशमलव डिग्री से अधिक नहीं है।

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

// Approximate Equirectangular -- works if (lat1,lon1) ~ (lat2,lon2) 
int R = 6371; // km 
double x = (lon2 - lon1) * Math.cos((lat1 + lat2)/2); 
double y = (lat2 - lat1); 
double distance = Math.sqrt(x * x + y * y) * R; 

आप का अनुकूलन इस आगे या तो द्वारा कर सकते हैं:

  1. वर्गमूल निकाला जा रहा है अगर आप बस एक और करने के लिए दूरी की तुलना (उस मामले में दोनों वर्ग दूरी की तुलना);
  2. कोसाइन फैक्टरिंग आउट करें यदि आप एक मास्टर पॉइंट से कई अन्य लोगों की दूरी की गणना करते हैं (उस स्थिति में आप मास्टर पॉइंट पर केंद्रित समेकित प्रक्षेपण करते हैं, तो आप सभी तुलनाओं के लिए एक बार कोसाइन की गणना कर सकते हैं)।

अधिक जानकारी के लिए देखें: http://www.movable-type.co.uk/scripts/latlong.html

एक अच्छा संदर्भ में कई भाषाओं में Haversine सूत्र के कार्यान्वयन है: http://www.codecodex.com/wiki/Calculate_Distance_Between_Two_Points_on_a_Globe

+0

महान आदमी thanx हो सकता है। लेकिन अगर मुझे परिधि में एक स्थान के आस-पास स्थानों का एक सेट प्राप्त करने की आवश्यकता है, तो क्या मुझे खोजी गई एक के खिलाफ प्रत्येक स्थान की जांच करने के लिए थोड़ी देर लूप का उपयोग करना चाहिए और केवल परिधि में रहने वाले लोगों को रखना चाहिए? – themis

+0

आप कर सकते हैं, लेकिन यह 'ओ (एन) 'में एक क्रूर बल दृष्टिकोण है। 'ओ (1)' समाधान के लिए, सटीक समाधान की गणना करने से पहले संभावित मैचों को ट्रिम करने के लिए 2 डी स्थानिक इंडेक्स का उपयोग करें। हम इस सवाल का दायरा छोड़ रहे हैं :) –

+0

यह अच्छा संभव अनुकूलन का एक बहुत अच्छा लपेटन है .. thx! वास्तव में जो मैं –

3

वहाँ दो तरीके हैं LatLng के बीच दूरी पाने के लिए।

public static void distanceBetween (double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results) 

See this

और दूसरा

public float distanceTo (Location dest) के रूप में प्रवीण ने जवाब दे दिया।

0

बस, निम्न विधि का उपयोग यह अक्षां और लंबे समय से गुजरती हैं और मीटर में दूरी मिलती है:

private static double distance_in_meter(final double lat1, final double lon1, final double lat2, final double lon2) { 
    double R = 6371000f; // Radius of the earth in m 
    double dLat = (lat1 - lat2) * Math.PI/180f; 
    double dLon = (lon1 - lon2) * Math.PI/180f; 
    double a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
      Math.cos(latlong1.latitude * Math.PI/180f) * Math.cos(latlong2.latitude * Math.PI/180f) * 
        Math.sin(dLon/2) * Math.sin(dLon/2); 
    double c = 2f * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    double d = R * c; 
    return d; 
} 
+1

latlong1 और latlong2 परिभाषित नहीं किया गया है – Boy

+0

latlong1 और latlong2 क्या है? –

0
private float getDistance(double lat1, double lon1, double lat2, double lon2) { 
     float[] distance = new float[2]; 
     Location.distanceBetween(lat1, lon1, lat2, lon2, distance); 
     return distance[0]; 
    } 
संबंधित मुद्दे