Магазин 3 ближайших координат - PullRequest
0 голосов
/ 23 апреля 2011

У меня есть XML-файл, который содержит несколько точек с их долготой и широтой.

Мой код Python в данный момент получает ближайшую точку, просто просматривая XML-файл и находя ближайшую в милях.или что-то еще, сравнивая его с предыдущим ближайшим пунктом.Если его ближе, то я назначаю переменной значение этой новой точки.Так что все работает в этом отношении.

Теперь, что я хочу сделать, это на самом деле сохранить ближайшие 2 или 3 балла.Как мне это сделать?XML-файл не упорядочен самым близким, и, кроме того, местоположение пользователей будет меняться каждый раз, когда делается запрос.Могу ли я сделать это с помощью XML-файла или мне, возможно, придется изучить вопрос хранения данных SQL Server или MySQL?

Спасибо за помощь.PS, пример кода доступен здесь , если кому-то интересно.Это часть проекта колледжа.

Ответы [ 2 ]

1 голос
/ 23 апреля 2011

Вы должны хранить в списке кортежей (например) все пары точек и их расстояния при синтаксическом анализе файла xml.

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

Адаптация этого кода:

..............
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?
..................
1 голос
/ 23 апреля 2011

Вот решение, которое будет работать для любого количества точек:

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

Очевидно, немного псевдокоди. Для вызовов sort(), вероятно, потребуется аргумент, поэтому они будут отсортированы удобным способом, и вам, вероятно, понадобится функция для вычисления расстояния для замены члена distance.

...