/ / Finde große Kreisabstände von den Punkten im Wörterbuch - Python, Wörterbuch, Koordinaten

Große Kreisabstände von Punkten im Wörterbuch finden - Python, Wörterbuch, Koordinaten

Ich habe den folgenden Code, um die Entfernung zwischen Punkten auf einer Karte zu berechnen. Mein Ziel ist es, Folgendes zu tun:

  • Haben Sie einen Startpunkt und die Orte aus dem Standortwörterbuch,

  • Blättern Sie durch das Wörterbuch und berechnen Sie die Entfernung von allen zeigt auf den Startpunkt.

  • Suchen Sie den Ort mit dem Mindestabstand vom Startpunkt.

  • Paaren Sie dann diese Position mit dem Startpunkt, um ein Knotenpaar zu bilden um eine Kante zu verbinden.

  • Machen Sie danach den Mindeststandort als neuen Startpunkt und entferne es aus dem Ortsverzeichnis.

Ich werde dann zum vorherigen Schritt für den Rest der Punkte zurückkehren.

Ich bin derzeit in der Lage, die Entfernung vom ersten Startpunkt zu bekommen, aber nicht in der Lage, die restlichen Punkte im Ortsverzeichnis zu durchlaufen.

Jeder Rat wird sehr geschätzt.

from math import atan2, cos, sin, sqrt, radians

start = (43.82846160000000000000, -79.53560419999997000000)

locations = {
"one":(43.65162010000000000000, -79.73558579999997000000),
"two":(43.75846240000000000000, -79.22252100000003000000),
"thr":(43.71773540000000000000, -79.74897190000002000000)
}

cal_distances = {}

nodes = []

def dis():

y = len(locations)

x = 0

while x != y:

for key, value in locations.iteritems():
d = calc_distance(value)
cal_distances.setdefault(key,[])
cal_distances[key].append(d)

print cal_distances

min_distance = min(cal_distances, key = cal_distances.get)

if locations.has_key(min_distance):
for ky, val in locations.iteritems():
if ky == min_distance:
start = val
locations.pop(ky)
x = x+1

print locations

print nodes

def calc_distance(destination):
"""great-circle distance between two points on a sphere from their longitudes and latitudes"""
lat1, lon1 = start
lat2, lon2 = destination
radius     = 6371 # km. earth

dlat = radians(lat2-lat1)
dlon = radians(lon2-lon1)

a = (sin(dlat/2) * sin(dlat/2) + cos(radians(lat1)) * cos(radians(lat2)) * sin(dlon/2) * sin(dlon/2))
c = 2 * atan2(sqrt(a), sqrt(1-a))
d = radius * c

return d

dis()

Antworten:

0 für die Antwort № 1

Ihr Code, wie er steht, ist ziemlich verwirrend. Ich denke, was Sie erreichen wollen, ist:

start = (43.82846160000000000000, -79.53560419999997000000)

locations = {"one":(43.65162010000000000000, -79.73558579999997000000),
"two":(43.75846240000000000000, -79.22252100000003000000),
"thr":(43.71773540000000000000, -79.74897190000002000000)}

def dis(start, locations):

nodes = []

while locations:
# until the dictionary of locations is empty

nearest = min(locations, key=lambda k: calc_distance(start, locations[k]))
# find the key of the closest location to start

nodes.append((start, locations[nearest]))
# add a tuple (start, closest location) to the node list

start = locations.pop(nearest)
# remove the closest location from locations and assign to start

return nodes

def calc_distance(start, destination):
# ...

nodes = dis(start, locations)

Beachten Sie, dass ich gemacht habe start ein explizites Argument zu calc_distance, und start und locations explizite Argumente zu dis - Wo immer es möglich ist, verlassen Sie sich nicht auf Spielraum für den Zugriff auf Variablen. Die Ausgabe, die ich bekomme nodes ist:

[((43.8284616, -79.53560419999997), (43.7177354, -79.74897190000002)),
((43.7177354, -79.74897190000002), (43.6516201, -79.73558579999997)),
((43.6516201, -79.73558579999997), (43.7584624, -79.22252100000003))]