在django中计算近gps坐标

时间:2016-06-02 22:59:18

标签: python django

我在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,然后按最接近最远的顺序显示

1 个答案:

答案 0 :(得分:1)

获得installed Geodjango后,您可以将模型转换为空格 将导入更改为

的模型
from django.contrib.gis.db import models

正如您猜测的那样,您的位置模型会发生变化。

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

你能拥有从ActivityLocation的外键吗?肯定是的。您的活动模型无需更改

至于获取附近的活动并从最近到最远的顺序显示它们。这就是您的查询看起来像

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进入图片的地方。