计算django的近gps坐标



我在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,Location应该更改,lat,long应该替换为geodyango模型中的Point

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

安装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进入画面的地方。

最新更新