Python 3.x 查找与Python3最接近的值对

Python 3.x 查找与Python3最接近的值对,python-3.x,distance,latitude-longitude,Python 3.x,Distance,Latitude Longitude,我的目标是检索用户的lat/long位置,然后在我的位置列表中找到最近的lat/long。下面是我所拥有的,我相信它是有效的,但是我不确定这是否是达到我想要的最终结果的最佳方法 我将位置列表转换为绝对值,然后减去用户的位置值,得到距离。如果X Y小于先前记录的X或Y,则距离变量将使用新值更新 但是,正如我所说,这似乎是可行的,我不确定我是否以最好的方式进行了这项工作。我的位置列表会经常更新,但不会超过100个可能的位置 非常感谢您抽出时间 locations = [(-71.4399480000

我的目标是检索用户的lat/long位置,然后在我的位置列表中找到最近的lat/long。下面是我所拥有的,我相信它是有效的,但是我不确定这是否是达到我想要的最终结果的最佳方法

我将位置列表转换为绝对值,然后减去用户的位置值,得到距离。如果X Y小于先前记录的X或Y,则距离变量将使用新值更新

但是,正如我所说,这似乎是可行的,我不确定我是否以最好的方式进行了这项工作。我的位置列表会经常更新,但不会超过100个可能的位置

非常感谢您抽出时间

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
位置=[(-71.439948000000002,41.6919549),
(-71.61075089999997,41.577545),
(-71.06653670000003,42.41383099999999),
(-71.41283429999999,41.8239891),
(-71.05888010000001,42.3600825),
(-74.00594130000002,40.7127837)]
用户位置=(-71.2825493000003,41.7303793)
距离=[999999]#距离的初始值保持器
对于位置中的位置:
x=abs(位置[0])#纬度绝对值
y=abs(位置[1])#经度的绝对值
xu=abs(用户位置[0])#用户纬度的绝对值
yu=abs(userlocation[1])#用户经度的绝对值
dx=x-xu#从位置x减去用户
dy=y-yu#从位置y减去用户
如果dx<距离[0]:#如果距离X小于当前距离值
距离[0]=dx#使用新值更新
距离[1]=dy
继续#转到下一个
如果dy<距离[1]:#如果距离Y小于当前距离值
距离[0]=dx#使用新值更新
距离[1]=dy
继续#转到下一个
打印(距离)#打印最终结果

我会尝试得到真实的距离,然后用一种简单的方式比较距离,然后

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])

纬度和经度不是x/y。不能简单地计算两个这样的坐标之间的欧几里德距离或曼哈登距离等。另外还有一个陆地,你需要多精确?因为欧几里德距离可能不够精确-例如,两极的纬度大约需要111.7公里,但在赤道,它的覆盖范围“仅”110.6公里。我知道,如果将其扩展到整个地球,我们无法将这些坐标表示为网格,但我正在美国的一个小地区工作,因此我认为在我的限制区域内,它可能适用于相对距离。我的假设不正确吗?@zwer的准确性不是很重要。如果最终结果是“大体上更接近”,那就足够可靠了。这是为了营销目的,不是科学的,所以绝对的准确性是不必要的。@Reizvoller-你仍然需要处理纬度和经度的覆盖范围的差异,所以将它们视为欧几里德距离将不会产生正确的结果,除非是非常普遍的情况。使用(此处为a)获得一般精度距离,如下所示。然后,您只需在列表中循环并比较距离,保留产生最低结果的距离。