2012-05-21 22 views
5

पर पाइथन में शहरों के बीच दूरी की गणना करें और आसपास के शहरों को ढूंढें मेरे पास एक शहर मॉडल परिभाषित किया गया है जो शहर के geoname_id और location (GeoPt) के रूप में सहेजता है। दो चीजें हैं जिन्हें मैं हासिल करना चाहता हूं।Google App Engine

  1. मैं किसी दिए गए शहर से 500km त्रिज्या के भीतर सभी शहरों को प्राप्त करना चाहता हूं।
  2. मैं दो दिए गए शहरों के बीच km में दूरी की गणना करना चाहता हूं।

यह ध्यान में रखते हुए यह सुनिश्चित करने का सबसे अच्छा तरीका क्या होगा कि मेरे पास शहरों का एक बड़ा डेटाबेस है और मैं प्रदर्शन कारक पर बहुत अधिक बलिदान नहीं देना चाहता हूं। किसी भी मदद या सलाह की सराहना की है।

उत्तर

7

यह एकदम सही काम करता है, लेकिन धीमी गति एक लील है: गणना से दूरी

समारोह। तर्क यह कार्य करने के लिए पारित कर दिया अक्षांश और एक स्थान या एक Geopt() के देशांतर की tuples हैं:

def HaversineDistance(location1, location2): 
    """Method to calculate Distance between two sets of Lat/Lon.""" 
    lat1, lon1 = location1 
    lat2, lon2 = location2 
    earth = 6371 #Earth's Radius in Kms. 

#Calculate Distance based in Haversine Formula 
dlat = math.radians(lat2-lat1) 
dlon = math.radians(lon2-lon1) 
a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2) 
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a)) 
d = earth * c 
return d 

समारोह दायरे में आसपास के शहरों की गणना की। यह शहर मॉडल के तहत एक विधि है जो सभी शहरों को स्टोर करती है:

def get_closest_cities(self, kms): 
    cities = [] 
    #Find surrounding Cities of a given city within a given radius 
    allcities = self.country.city_set 
    for city in allcities: 
    distance = HaversineDistance((self.location.lat, self.location.lon),(city.location.lat, city.location.lon)) 
    if not distance >= kms: 
     cities.append((city.name, int(distance))) 
    cities.remove(cities[0]) 
    return cities 
2
  1. आप सिर्फ दो शहरों के स्थानों को लोड https://developers.google.com/appengine/articles/geosearch
  2. को कुछ इसी तरह का उपयोग करें और दूरी की गणना करने के त्रिकोणमिति उपयोग कर सकते हैं। उदाहरण देखें http://www.movable-type.co.uk/scripts/latlong.html
+0

आपकी प्रतिक्रिया के लिए धन्यवाद! – Amyth

3

Google ऐप इंजन भू-स्थानिक प्रश्नों का समर्थन नहीं करता है, लेकिन आप Geospatial Queries with Google App Engine using GeoModel देख सकते हैं।

आप mongoDB जैसे अन्य डेटाबेस का उपयोग करने पर विचार करना चाहेंगे जो Geospatial Indexing का समर्थन करते हैं और शायद इसे बाहरी सेवा के रूप में भी कर सकते हैं जो केवल यही करता है।

+0

मैं वास्तव में इसके लिए एक अलग पुस्तकालय का उपयोग नहीं करना चाहता क्योंकि मेरे पास पहले से ही डेटास्टोर में सहेजे गए शहरों का अक्षांश और देशांतर है। क्या आपको नहीं लगता कि एक साधारण गणना करना चाहिए या आप geomodel का उपयोग करने का सुझाव देंगे? यह एप्लिकेशन के प्रदर्शन को कैसे प्रभावित करेगा? आपके प्रतिक्रिया के लिए धन्येवाद। :) – Amyth

+0

कोई दूसरा रास्ता नहीं है .. जब तक कि आप अपना खुद का जीएसपीटीअल इंडेक्सिंग लागू नहीं कर रहे हैं .. क्योंकि जीएई बस इसका समर्थन नहीं करता है। आपको कम से कम इसे GeoModel के साथ एक शॉट देना चाहिए। प्रदर्शन आपके डेटास्टोर के आकार पर निर्भर करता है, और यह निश्चित रूप से आपके इंडेक्स आकार को बढ़ाने जा रहा है। यह समझने के लिए प्रलेखन के माध्यम से पढ़ें कि वे इसे कैसे प्राप्त कर रहे हैं। – Lipis

+0

धन्यवाद लिपिस, मैं अब इसके माध्यम से जाऊंगा! – Amyth