2017-07-19 3 views
0

Mein Ziel ist es, die lat/long-Position eines Benutzers abzurufen und dann den nächsten lat/long in meiner Liste der Orte zu finden. Unten ist, was ich habe und ich glaube, es funktioniert, aber ich bin mir nicht sicher, ob dies die beste Methode ist, um zu dem Endergebnis zu kommen, das ich will.Finde das nächste Wertpaar mit Python3

Ich gehe durch die Liste der Standorte, die sie in absolute Werte umwandeln, subtrahiere dann den Standortwert des Benutzers, um die Entfernung zu erhalten. Wenn entweder X oy Y kleiner als das zuvor aufgezeichnete X oder Y ist, wird die Abstandsvariable mit den neuen Werten aktualisiert.

Dies scheint zu funktionieren, aber wie ich schon sagte, ich bin mir nicht sicher, ob ich es in der bestmöglichen Weise gemacht habe. Meine Liste der Standorte wird immer wieder aktualisiert, aber es werden nicht mehr als 100 mögliche Positionen angezeigt.

Vielen Dank für Ihre Zeit.

locations = [(-71.43994800000002,41.6919549), 
(-71.61075089999997,41.577545), 
(-71.06653670000003,42.41383099999999), 
(-71.41283429999999,41.8239891), 
(-71.05888010000001,42.3600825), 
(-74.00594130000002,40.7127837)] 

userlocation = (-71.28254930000003,41.7303793) 

distance = [999,999] #initial value holder for distance 
for location in locations: 
    x = abs(location[0]) # absolute value of latitude 
    y = abs(location[1]) #absolute value of longitude 
    xu = abs(userlocation[0]) #absolute value of user's latitude 
    yu = abs(userlocation[1]) #absolute value of user's longitude 
    dx = x-xu #Subtract user from location X 
    dy = y-yu #subtract user from location Y 
    if dx < distance[0]: #if distance X is less than the current distance value 
     distance[0] = dx #update with new values 
     distance[1] = dy 
     continue #go to the next one 
    if dy < distance[1]: #if distance Y is less than the current distance value 
     distance[0] = dx #update with new values 
     distance[1] = dy 
     continue #go to the next one 
print(distance) #print the end smallest result 
+0

geografische Breite und Länge sind nicht x/y. Sie können nicht einfach die euklidische oder Manhatten-Distanz usw. zwischen zwei solchen Koordinaten berechnen. Weiter gibt es einen Wraparond. –

+0

Wie genau brauchen Sie das? Weil die euklidische Distanz vielleicht nicht präzise genug ist - zum Beispiel nimmt ein Breitengrad an den Polen ~ 111,7 km ein, aber am Äquator deckt er "nur" ~ 110,6 km ab. – zwer

+0

Ich verstehe, wenn wir auf den gesamten Globus skaliert sind, dass wir diese Koordinaten nicht als Gitter darstellen können, aber ich arbeite mit einer kleinen Region der USA, also dachte ich, dass es in meinem eingeschränkten Bereich für relative Entfernung funktionieren könnte. Ist meine Annahme falsch? – Reizvoller

Antwort

0

Ich würde versuchen, die wirkliche Distanz dann zu erhalten, den Abstand in einem Hacky Weise zu vergleichen Calculate distance between two latitude-longitude points? (Haversine formula) und dann

def calculate_distance(lat1, lon1, lat2, lon2): 
    # go to the link to use the implementation 
    pass 
locations = [] 
user_loc = (-71.28254930000003,41.7303793) 
ulat, ulon = user_loc 
res = map(lambda x: (calculate_distance(ulat, ulon, x[0], x[1]), x), locations) 
print min(res, key=lambda x: x[0]) 
Verwandte Themen