在django中计算附近的gps坐标

Posted

技术标签:

【中文标题】在django中计算附近的gps坐标【英文标题】:Calculating near gps coordinates in django 【发布时间】:2016-10-02 21:00:23 【问题描述】:

我在 django 中有一个模型,用于存储位置的 gps 坐标列表。我需要做的是实施搜索。我从他的设备中获取用户的坐标。我需要做的是向他展示附近的位置,以及他可以过滤搜索半径的功能。

我们最初的想法是遍历所有数据并找到匹配项。但即使使用缓存,这也是低效的。

我需要知道的是我可以使用 neo4j 图形数据库还是应该坚持现有的 ORM。

在现有 ORM 的情况下,编写返回附近位置列表的搜索过滤器的最有效方法是什么。

对于 neo4j,我是全新的,如果您能指出一些资源与 django 相同的示例实现,我将不胜感激

这是我们正在使用的当前模型

from __future__ import unicode_literals                                         

from django.db import models                                                    
from django.contrib.auth.models import User                                     

class Category(models.Model):                                                   
        name = models.CharField(max_length = 100, blank = False)                

class Location(models.Model):                                                   
        name = models.CharField(max_length = 100, blank = True)                 
        cordinateX = models.FloatField(max_length = 50 , blank = False)         
        cordinateY = models.FloatField(max_length = 50 , blank = False)         

class Activity(models.Model):                                                   
        owner = models.ForeignKey(User,blank = True, null = True)               
        name = models.CharField(max_length = 100,blank = False)                 
        about = models.TextField(max_length = 500, blank = False)               
        location = models.ForeignKey(Location, blank = True, null = True)       
        category = models.ManyToManyField(Category, blank = True)               
        status = models.BooleanField(default = False)                           
        deleted = models.BooleanField(default = False)                          
        createdAt = models.DateTimeField(auto_now_add=True)                     

        def __unicode__(self):                                                  
                return self.name

根据评论,我假设,使用 geodjango,位置应该改变,而 lat,long 应该被 geodjango 模型中的Point 替换。

这又增加了一个问题,现有模型到geodjango模型的外键是否存在问题。搜索过滤器应该能够获取附近的Activity,然后按最近到最远的顺序显示

【问题讨论】:

虽然 neo4j 可能能够为您做到这一点,但 geodjango 是适合这项工作的工具 @e4c5 ,我只是稍微研究了一下,我假设对所有坐标都使用 PointField,现在我如何过滤相同的,似乎关于相同的文档非常少。我也很感激我可以用简单的filter near points 发布答案,并使用 django 表单插入:) 很高兴。请发布您的模型。 @e4c5 感谢您的帮助,我添加了模型,对此也不确定,但 geodjango 有单独的模型,我仍然可以将它们作为现有模型的外键引用吗? 【参考方案1】:

拥有installed Geodjango 后,您可以将模型转换为空间模型 通过将导入更改为模型

from django.contrib.gis.db import models

正如您正确猜测的那样,您的 Location 模型会改变。

class Location(models.Model):                                                   
    name = models.CharField(max_length = 100, blank = True)                 
    coords = models.PointField() 

你能有一个从ActivityLocation 的外键吗?绝对是的。您的 Activity 模型不需要更改

关于获取附近的活动并从最近到最远的顺序显示它们。这就是您的查询的样子

from django.contrib.gis.db.models.functions import Distance
Activity.objects.annotate(
  distance=Distance('location__coords',somepoint)
).order_by('distance')

somepoint 是一个点对象。您甚至可以通过使用 Django F 对象让somepoint 来自另一个模型。

在这个阶段,我必须警告您,如果您的数据库中有大量位置,无论您使用 geodjango 还是其他类似上述的平台查询都可能会变得很慢。

加快查询速度的秘诀是应用过滤器来删除距离太远的点。这就是dwithin 进入图片的地方。

【讨论】:

以上是关于在django中计算附近的gps坐标的主要内容,如果未能解决你的问题,请参考以下文章

如何ListView依照GPS距离排序

在 Python 中根据 GPS 坐标计算基本方向

计算两个 GPS 坐标之间的罗盘方位问题

使用 GPS 坐标计算最短距离

用墨卡托和GPS坐标计算距离时误差测试

在给定点、方位角和距离的情况下计算 gps 坐标