2011-04-22 5 views
0

J'ai un fichier XML qui contient un certain nombre de points avec leur longitude et leur latitude.Magasin 3 coordonnées les plus proches

Mon code python obtient pour le moment le point le plus proche simplement en faisant une boucle dans le fichier XML, en trouvant le plus proche, en miles ou autre, puis en le comparant avec le point le plus proche précédent. Si c'est plus proche alors j'attribue à la variable la valeur de ce nouveau point. Donc, tout fonctionne à cet égard.

Maintenant, ce que je veux faire est de stocker les 2 ou 3 points les plus proches. Comment puis-je faire cela? Le fichier XML n'est pas classé par le plus proche, et de plus, l'emplacement des utilisateurs changera chaque fois qu'une demande est faite. Est-ce que je peux faire ceci avec un fichier XML ou devrais-je devoir regarder en stockant les données est SQL Server ou MySQL?

Merci pour l'aide. PS, l'exemple de code est available here si quelqu'un est intéressé. Cela fait partie d'un projet d'université.

Répondre

1

Vous devez stocker dans une liste de tuples (par exemple) toutes les paires de points et leurs distances lors de l'analyse du fichier xml.

mypoints = [(distance12, x1, x2),...,(distancenm, xn, xm)] 
mypoints.sort() 
three_closer = mypoints[:3] 

adaptant à votre code:

.............. 
mypoints = [] 
for row in rows: 
    # Get coords for current record 
    curr_coords = row.getAttribute("lat") + ',' + row.getAttribute("lng") 
    # Get distance 
    tempDistance = distance.distance(user_coords, curr_coords).miles 
    mypoints.append((tempDistance, row)) 

mypoints.sort() 
#the three closest points: 
mythree_shorter = mypoints[0:3] 
for distance, row in mythree_shorter: 
    shortestStation = json.dumps(
          {'number': row.getAttribute("number"), 
          'address': row.getAttribute("address"), 
          'lat': row.getAttribute("lat"), 
          'lng': row.getAttribute("lng"), 
          'open': row.getAttribute("open")}, 
          sort_keys=True, 
          indent=4) 
    save_in_some_way(shortestStation) #maybe writing to a file? 
.................. 
+0

Merci pour votre aide! Je ne pense pas que l'écriture dans un fichier est faisable car ces données seront consommées par un iPhone. Je ne comprends pas très bien la 2ème boucle for(). Comment sait-il seulement obtenir les 3 plus proches? Je suppose que c'est fait dans 'mypoints [0: 3]' mais mon python est seulement basique. Je vais le tester quand même et je vous le ferai savoir. – eoinzy

+0

Merci Joaquin! J'ai utilisé une partie de votre code et l'ai fait fonctionner! La seule chose qui manquait était un "+ =" sur 'shortestStation', donc la façon dont je l'ai maintenant est' shortestStation = shortestStation + json.dumps() .... '. Merci encore!! – eoinzy

+1

les trois plus proches sont stockés dans mythree_sorter et ils sont pris par la boucle dans l'ordre. La seconde pour la boucle est là pour sauvegarder les trois points les plus proches sérialisés comme des cordes json quelque part (une liste, un fichier) ou peut-être pour les envoyer quelque part (à vous de voir) ... – joaquin

1

est ici une solution qui fonctionne pour un certain nombre de points:

closest = points[:NUM_CLOSEST] 
closest.sort() 
for point in points[NUM_CLOSEST:]: 
    if point.distance < closest[-1].distance: 
     closest[-1] = point 
     closest.sort() 

De toute évidence, un peu pseudo-cody. Les appels sort() nécessiteront probablement un argument afin qu'ils soient triés d'une manière utile, et vous voudrez probablement une fonction pour calculer la distance pour remplacer le membre distance.

+0

Merci pour la réponse! Sort() était le chemin à parcourir! – eoinzy

Questions connexes