2011-03-22 11 views
5

से शुरू करें मेरे पास GPS (lon_base, lat_base) से स्थान है। मेरे पास स्थानों की एक सूची है (lon1, lat1 | lon2, lat2 | lon3, lat3 ...) यह सूची बहुत लंबी है और दुनिया भर में है।लोन लैट पॉइंट्स की सॉर्ट सूची, निकटतम

मेरे प्रश्न हैं: 1. मैं केवल उस सूची से कैसे प्राप्त करूं जो लोन \ लैट है जो मेरे lon_base \ lat_base से 1 मील है? 2. मैं उन्हें सबसे नज़दीकी से सबसे दूर कैसे क्रमबद्ध करूं?

अग्रिम धन्यवाद!

उत्तर

3

आप को परिभाषित करना चाहते:

LonLat myHouse = /* whatever */ ; 
Comparable comp = new Comparable() { 
    LonLat a; 
    int compareTo (Object b) { 
     int aDist = calcDistance(a, myHouse) ; 
     int bDist = calcDistance(b, myHouse) ; 
     return aDist - bDist; 
    } 
}; 
myLonLatList.sort(lonLatList, comp); 

जहां calcDistance() बस दो अंक के बीच की दूरी की गणना करता है। अगर आप एंड्रॉइड पर हैं, तो मुझे लगता है कि Google मानचित्र में उनके एपीआई में कहीं भी कोई फ़ंक्शन है जो आपके लिए यह करेगा।

संपादित: आप अपने calcDistance() समारोह ChrisJ के distance समारोह की तरह देखना चाहता हूँ।

-tjw

+0

इस कोड में "ए" मान क्या है। यदि आप नमूना कोड प्रदान करते हैं तो यह मेरे लिए बहुत उपयोगी है। – pandu

1

आप followig सन्निकटन उपयोग कर सकते हैं अपने आधार से दूरी की गणना करने के लिए (के बाद से 1 मील पृथ्वी की त्रिज्या से बहुत छोटा है):

dx = cos(phi_base) * (theta - theta_base) 
dy = phi - phi_base 

dist = sqrt(dx*dx+dy*dy) 

साथ: phi = अक्षांश और देशांतर theta =

परिणाम 0 समुद्री30 मील की इकाइयों में है यदि theta और phi डिग्री में दिए गए हैं। परिणाम उन बिंदुओं के लिए काफी गलत होंगे जिनके अक्षांश में आपके आधार अक्षांश से बहुत अलग है, लेकिन इससे कोई फर्क नहीं पड़ता कि आप जानना चाहते हैं कि आपके आधार से कौन सा अंक लगभग 1 मील है।

अधिकांश प्रोग्रामिंग भाषाओं के लिए आपको phi_base को रेडियंस (पीआई/180 द्वारा गुणा करके) को cos() के लिए उपयोग करने के लिए कनवर्ट करना होगा।

(ध्यान दें: आप विशेष देखभाल करने के लिए करता है, तो अपने आधार देशांतर बहुत 180 डिग्री या -180 ° के करीब है, लेकिन शायद उस मामले :-)

उपयोग करने के लिए महत्वपूर्ण छँटाई के रूप में गणना दूरी नहीं है अपने अंक क्रमबद्ध करें।

आप होने के लिए है, तो अधिक सटीक (जैसे यदि आप सभी बिंदुओं कि अपने घर से लगभग 2000 मील की दूरी पर हैं जानना चाहता हूँ), की तुलना में आप एक क्षेत्र पर दो अंक की सही दूरी की गणना करने के लिए Great Circle Distance के लिए सूत्र का उपयोग करना चाहिए। अपनी खुद की Comparator कि सामान्य रूप में, कुछ इस तरह दिखता

6

आप great circle distance का उपयोग दो अंक जिसका आप अक्षांश-देशांतर निर्देशांक जानना के बीच की दूरी की गणना करने के कर सकते हैं। formulae कोड के लिए काफी आसान कर रहे हैं:

static double distance(double fromLat, double fromLon, double toLat, double toLon) { 
    double radius = 6378137; // approximate Earth radius, *in meters* 
    double deltaLat = toLat - fromLat; 
    double deltaLon = toLon - fromLon; 
    double angle = 2 * Math.asin(Math.sqrt(
     Math.pow(Math.sin(deltaLat/2), 2) + 
     Math.cos(fromLat) * Math.cos(toLat) * 
     Math.pow(Math.sin(deltaLon/2), 2))); 
    return radius * angle; 
} 
0

इस link मैं काम कर विधि के अनुसार किया। उपरोक्त उत्तर गलत था, क्योंकि यह लैट/एलएनजी डिग्री को रेडियंस में परिवर्तित नहीं करता है।

private double getDistance(double fromLat, double fromLon, double toLat, double toLon){ 
     double radius = 6371; // Earth radius in km 
     double deltaLat = Math.toRadians(toLat - fromLat); 
     double deltaLon = Math.toRadians(toLon - fromLon); 
     double lat1 = Math.toRadians(fromLat); 
     double lat2 = Math.toRadians(toLat); 
     double aVal = Math.sin(deltaLat/2) * Math.sin(deltaLat/2) + 
      Math.sin(deltaLon/2) * Math.sin(deltaLon/2) * Math.cos(lat1) * Math.cos(lat2); 
     double cVal = 2*Math.atan2(Math.sqrt(aVal), Math.sqrt(1-aVal)); 

     double distance = radius*cVal; 
     Log.d("distance","radius * angle = " +distance); 
     return distance; 
    } 
8
public static List<Location> sortLocations(List<Location> locations, final double myLatitude,final double myLongitude) { 
    Comparator comp = new Comparator<Location>() { 
     @Override 
     public int compare(Location o, Location o2) { 
      float[] result1 = new float[3]; 
      android.location.Location.distanceBetween(myLatitude, myLongitude, o.Lat, o.Long, result1); 
      Float distance1 = result1[0]; 

      float[] result2 = new float[3]; 
      android.location.Location.distanceBetween(myLatitude, myLongitude, o2.Lat, o2.Long, result2); 
      Float distance2 = result2[0]; 

      return distance1.compareTo(distance2); 
     } 
    }; 


    Collections.sort(locations, comp); 
    return locations; 
} 

कहाँ स्थानों की सूची अपने स्वयं के स्थान वर्ग, नहीं android.location.Location युक्त एक सूची है।

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