如何从数据库中获取最近的位置条目?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从数据库中获取最近的位置条目?相关的知识,希望对你有一定的参考价值。

我将坐标存储为我的数据库中的纬度经度对。现在,我需要从给定的lat-long坐标中检索给定半径内的所有条目。例如,如果给定坐标48.796777,2.371140和距离20公里,它将检索距离该点20公里内的所有记录。

如果它提供任何简化或导致较少的CPU时间,则它足够准确地计算点之间的“直线”距离,即不需要考虑地球的曲率。

如何用Django实现这一目标?更具体地说,如何为这样的查询构建视图(可能还有模型)?

答案

你应该使用GeoDjango。它允许您在地理数据库条目上执行distance queries

from django.contrib.gis.measure import D
from django.contrib.gis.geos import *
from myapp.models import MyResult

pnt = fromstr('POINT(48.796777 2.371140 )', srid=4326)
qs = MyResult.objects.filter(point__distance_lte=(pnt, D(km=20)))
另一答案

你可以使用geopy

from geopy import distance  

_, ne = g.geocode('Newport, RI')  
_, cl = g.geocode('Cleveland, OH')  
distance.distance(ne, cl).miles  
# 538.37173614757057

要优化一点,您可以过滤用户对象,以便首先粗略估计附近的用户。这样您就不必遍历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()
另一答案

试试这段代码。我正在使用python,sqlalchemy

此sqlalchemy查询返回给定point.its工作正确的最近对象。但此查询返回所有模型。但它的工作正常。

我的模特课

#
class City(Base):
   __tablename__ = "tbl_City"
  city_id = Column(Integer, primary_key=True, unique=True) 
  geo_coordinates = Column(Geometry('POINT', srid=4326))

我的查询

#
point = city.geo_coordinates
near_citylist = City.query.order_by(City.geo_coordinates.distance_box(point))
另一答案

我认为最好的方法是像Timmy建议的那样使用GeoDjango,但是你必须拥有一个支持Geo的后端(如PosGis)。但是,如果您的模型包含自定义纬度和经度字段,我认为不可能使用

class CustomGeoModel(models.Model):
  lat = models.CharField(max_length=30)
  lon = models.CharField(max_length=30)

以上是关于如何从数据库中获取最近的位置条目?的主要内容,如果未能解决你的问题,请参考以下文章

从 Postcode DB 获取 lat/lng 并在 PHP/MYSQL 中按最近的顺序排序

如何从 HealthKit 数据中获取最新的体重条目

如何从 HealthKit 数据中获取最新的体重条目

SQL:获取最近的最大条目

如何从 tkinter 条目为另一个函数生成位置参数

如何从 Derby 数据库中获取在最后 30 秒内插入的条目?