使用GeopositionField查找最近的数据库条目

Jon*_*han 2 python django geocoding geolocation django-geoposition

我在Django中使用GeopositionField来存储我的用户的坐标.现在我想找到最接近当前用户的20个用户的列表.我的GeopositionField可以实现该功能吗?我知道GeoDjango可以轻松搜索距离,但由于我使用Heroku和postgresql,我想降低成本并使用postgressql,安装PostGIS似乎是唯一的选择.

有什么建议?

all*_*aps 8

对于两点之间的距离,您可以使用Geopy.

来自文档:这是distance.distance的示例用法:

>>> from geopy import distance  
>>> _, ne = g.geocode('Newport, RI')  
>>> _, cl = g.geocode('Cleveland, OH')  
>>> distance.distance(ne, cl).miles  
538.37173614757057 
Run Code Online (Sandbox Code Playgroud)

在Django项目中实现这一点.在models.py中创建一个普通模型:

class User(models.Model):
    name = models.Charfield()
    lat = models.FloatField()
    lng = models.FloatField()
Run Code Online (Sandbox Code Playgroud)

要优化一点,您可以过滤用户对象,以便首先粗略估计附近的用户.这样您就不必遍历db中的所有用户.这种粗略估计是可选的.为了满足您的所有项目要求,您可能需要编写一些额外的逻辑:

#The location of your user.
lat, lng = 41.512107999999998, -81.607044999999999 

min_lat = lat - 1 # You have to calculate this offsets based on the user location.
max_lat = lat + 1 # Because the distance of one degree varies over the planet.
min_lng = lng - 1
max_lng = lng + 1    

users = User.objects.filter(lat__gt=min_lat, lat__lt=max__lat, lat__gt=min_lat, lat__lt=max__lat)

# If not 20 fall back to all users.
if users.count() <= 20:
     users = User.objects.all()
Run Code Online (Sandbox Code Playgroud)

计算用户与用户中每个用户之间的距离,按距离对其进行排序并获得前20个.

results = []
for user in users:
     d = distance.distance((lat, lng), (user.lat, user.lng))
     results.append( {'distance':d, 'user':user })
        results = sorted(results, key=lambda k: k['distance'])
results = results[:20]
Run Code Online (Sandbox Code Playgroud)