加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 返回Django附近的位置

发布时间:2020-12-20 11:37:30 所属栏目:Python 来源:网络整理
导读:我有一个 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) 其中的值存储为纬度,经
我有一个 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)

其中的值存储为纬度,经度格式的字符串.从我的模板中,我传递了一个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返回以相同纬度开头的所有条目.但是,现在我还想匹配经度,这就是我运行for循环的原因,并搜索在我的LocationField中分隔纬度,经度的逗号索引. n_string获取LocationField的子字符串,然后我计划将它与我的经度变量匹配.

我的问题是两部分:

>如何生成匹配纬度的查询以及如何将其返回到模板?
>如何检查该区域周围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,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读