gpt4 book ai didi

python - 返回 Django 中的附近位置

转载 作者:太空宇宙 更新时间:2023-11-03 13:00:03 24 4
gpt4 key购买 nike

我有一个 Django 模型,它有一个名为 LocationField 的自定义属性。

class List(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=200)
location = LocationField(blank=True, max_length=255)

其中的值存储为格式为 latitude, longitude 的字符串。从我的模板中,我传递了一个 url,如下所示:/nearby?lat='+somevalue+'&long='+somevalue

现在,我想根据传递的值从 List 返回附近的条目。

为此,我编写了一个 views.py 函数,如下所示:

def nearby(request):
if request.GET['lat']:
lat = request.GET['lat']
longitude = request.GET['long']
first_query = Playlist.objects.filter(location__istartswith=lat)
for f in first_query:
l = f.index(',')
n_string = f[l:]

为了阐明我所做的事情,first_query 返回所有以相同 latitude 开头的条目。但是,现在我还想匹配 longitude 这就是为什么我运行 for 循环 并搜索分隔 latitude,longitude 的逗号索引 在我的 LocationField 中。 n_string 获取 LocationField 的子字符串,然后我计划将其与我的 longitude 变量匹配。

我的问题分为两部分:

  1. 如何生成匹配纬度的查询以及如何将其返回到模板?
  2. 我如何检查该区域周围 2 平方公里的区域?

是否有用于此的 django 包?

最佳答案

至少有 3 种方法可以做到这一点:

a) Haersine 距离(MySQL 中的示例)

def nearby_spots_old(request, lat, lng, radius=5000, limit=50):
"""
WITHOUT use of any external library, using raw MySQL and Haversine Formula
http://en.wikipedia.org/wiki/Haversine_formula
"""
radius = float(radius) / 1000.0

query = """SELECT id, (6367*acos(cos(radians(%2f))
*cos(radians(latitude))*cos(radians(longitude)-radians(%2f))
+sin(radians(%2f))*sin(radians(latitude))))
AS distance FROM demo_spot HAVING
distance < %2f ORDER BY distance LIMIT 0, %d""" % (
float(lat),
float(lng),
float(lat),
radius,
limit
)

queryset = Spot.objects.raw(query)
serializer = SpotWithDistanceSerializer(queryset, many=True)

return JSONResponse(serializer.data)

b) Geodjango 的使用 (PostgreSQL + PostGIS)

def nearby_spots_new(request, lat, lng, radius=5000, limit=50):
"""
WITH USE OF GEODJANGO and POSTGIS
https://docs.djangoproject.com/en/dev/ref/contrib/gis/db-api/#distance-queries
"""
user_location = fromstr("POINT(%s %s)" % (lng, lat))
desired_radius = {'m': radius}
nearby_spots = Spot.objects.filter(
mpoint__distance_lte=(user_location, D(**desired_radius))).distance(
user_location).order_by('distance')[:limit]
serializer = SpotWithDistanceSerializer(nearby_spots, many=True)

return JSONResponse(serializer.data)

c) 一些智能查询(考虑圆内切于正方形)

在这里查看我的答案:How to filter a django model with latitude and longitude coordinates that fall within a certain radius

关于python - 返回 Django 中的附近位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25623829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com