5

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

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

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

4

5 回答 5

9

您应该使用GeoDjango。它允许您对地理数据库条目执行距离查询

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)))
于 2015-04-21T07:22:57.607 回答
2

你可以使用geopy

from geopy import distance  

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

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

#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()
于 2015-04-21T08:03:22.443 回答
0

没有 GeoDjango

你可以这样做,

objects = YourModel.objects.raw('SELECT *,  ( 6371 * acos( cos( radians('+my_lat+') ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians('+my_long+') ) + sin( radians('+my_lat+') ) * sin( radians( latitude ) ) ) ) AS distance FROM "YourModel" WHERE (6371 * acos( cos( radians('+my_lat+') ) * cos( radians(latitude) ) * cos( radians(longitude) - radians('+my_long+') ) + sin( radians('+my_lat+') ) * sin( radians(latitude) ) ) ) <= 100')

其中 my_lat 是输入纬度,my_long 是输入经度,latitude 是纬度的模型字段,经度是经度的模型字段,100 是距离。

我在模型中使用 FloatField 作为纬度和经度。

现在因为这返回一个 RawQueryset,如果您需要在查询集上使用其他过滤器,您可以通过执行以下操作获得通常的 Django 查询集,

objects = YourModel.objects.filter(pk__in=[i.pk for i in objects])


于 2021-12-11T18:52:31.787 回答
0

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

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

我的模特班

#
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))
于 2017-06-15T08:16:28.653 回答
-1

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

class CustomGeoModel(models.Model):
  lat = models.CharField(max_length=30)
  lon = models.CharField(max_length=30)
于 2015-04-21T09:29:02.567 回答