使用用户输入的位置按位置推荐餐厅的最佳方式 - 使用 python

The best way of recommending restaurants by location using user inputted locations - using python

我正在为一个项目创建一个程序,可以推荐城市中的景点。

如果我的数据库中有很多餐馆的位置,并且我让用户输入他们的位置,那么向他们推荐不营业的餐馆的最佳方式是什么。我不会仅根据位置进行推荐,但我只是不知道执行此操作的最佳方法。我愿意学习只是不知从何下手!

让用户输入他们的位置(例如 post 代码)就足够了 - 我不知道我是否有足够的技术技能来使用 gps,我对 API 等没问题

这里有几个问题。

  • 首先,您需要使用一致的co-ordinate系统来存储餐厅位置,EPSG:3857在这种情况下是最简单的,因为单位是米而不是度。这个系统仍然会扭曲长度,但餐厅离人很近,所以这在这里很好。 PyProj Python 库是转换 co-ordinate 位置的标准,使用 pyproj.Transformer.

  • 使用 web-API 获取此人的位置。为此,您可以使用 Geopy Python 库来 look-up 一个地址,并在测试和演示中使用 Nominatim 解决这些问题;如果你想要频繁 look-ups.

    ,你需要转向付费服务而不是 Nominatim
  • 然后,使用一种算法进行“最近邻查找”,而不是仅仅循环访问站点并使用您从几何中知道的距离公式。为此,有许多算法可供选择; sklearn Python 图书馆 can do this.

使用欧氏距离公式:

euclid-dist

在哪里

euclid-dist

只是在python中编码为

x**0.5

if you want to read about the performance of x**0.5 vs math.sqrt(x) read this

哪里

euclid-dist

只是在python中编码为

x**2

然后,

您可以使用这个非常基本的指导性 python 代码:

#location in tuple (x,y)
user_location = (8,9)

#This is dictionary with:
#keys being names of Restaurants
#values being tuples with the position (x,y)
locations={"MacDonald's":    (-4,-8),
           "TGI Fridays":    (1,1),
           "Bembos":         (2,3),
           "Burger King":    (5,6),
           "El Limeño":      (7,8),
           "Astrid y Gastón":(-1,10),
           "Central":        (1,9),
           "Johnny Rockets": (6,1)
           }

#Extract x,y value from tuple user_location
user_x,user_y = user_location
dist_min=float('inf')


for key in locations:
    x,y=locations[key]
    #Euclidean's Distance Expression presented earlier
    dist=((x-user_x)**2+(y-user_y)**2)**0.5
    print(f"Location:({x},{y}) Name:{key} / Distance:{dist:4.3f}" )
    if dist<dist_min:
        dist_min = dist
        best_key = key

print("\n")
print(f"The selected location is {best_key} since it has th smallest distance to the user:{dist_min:4.3f}")

复制并粘贴此代码,它很简单。

希望对您有所帮助。