在Django中计算附近的GPS坐标

问题描述 投票:0回答:1

我在 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

我可以为此使用 Neo4j 图形数据库还是应该坚持现有的 ORM?

基于评论,我假设使用 GeoDjango 位置应该改变,并且纬度,经度应该替换为 GeoDjango 模型中的

Point

这又增加了一个问题,现有模型到 geodjango 模型的外键是否会出现问题。搜索过滤器应该能够获取附近的

Activity
并按从最近到最远的顺序显示。

python django geodjango
1个回答
1
投票

一旦您安装了Geodjango,您就可以将模型转换为空间
模型通过将导入更改为

from django.contrib.gis.db import models

正如您正确地猜测到的那样,您的位置模型将会改变。

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

您可以有从

Activity
Location
的外键吗?绝对是的。您的活动模型不需要更改

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

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 发挥作用的地方。

© www.soinside.com 2019 - 2024. All rights reserved.