存储3个最近的坐标

0 投票
2 回答
676 浏览
提问于 2025-04-16 16:15

我有一个XML文件,里面记录了一些点的经度和纬度。

我现在的Python代码是通过循环遍历这个XML文件来找到最近的点,计算距离(比如用英里),然后和之前找到的最近点进行比较。如果这个新点更近,我就把它的值赋给一个变量。所以在这方面一切都正常。

现在,我想做的是存储最近的2到3个点。我该怎么做呢?这个XML文件并不是按距离排序的,而且用户的位置每次请求都会变化。我能用XML文件来实现这个功能吗?还是说我需要考虑把数据存储到SQL Server或MySQL里呢?

谢谢你的帮助。
顺便说一下,如果有人感兴趣,样例代码可以在这里找到。这是一个大学项目的一部分。

2 个回答

1

这里有一个适合任意数量点的解决方案:

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这个成员。

1

你应该在解析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?
..................

撰写回答