geodjango中按距离排序的效率如何(整个表)

2023-12-06

假设我有以下数据模型:

Person(models.Model):
    id       = models.BigAutoField(primary_key=True)
    name     = models.CharField(max_length=50)
    location = models.PointField(srid=4326)

还假设我有一个查询 Django 后端的应用程序,该应用程序的唯一功能是返回以分页格式从最近到最远排序的注册用户列表。

目前我有以下查询:

# here we are obtaining all users in ordered form
current_location = me.location
people = Person.objects.distance(current_location).order_by('distance')

# here we are obtaining the first X through pagination
start_index = a
end_index = b

people = people[a:b]

虽然这有效,但它没有我想要的那么快。

我担心这个查询的速度。如果表很大(超过 100 万个),带有 PostGIS 的 Postgres SQL 数据库是否必须计算表之间的距离?current_location和每一个location在对随后的 100 万行进行排序之前,先在数据库中进行排序order_by手术?

谁能建议一种更有效的替代方法来根据距离检索和排序附近的用户?


如果您想按距离对该表上的每个条目进行排序,那么它会像预期的那样慢,并且无能为力(我目前知道并且我的知识。)!

您可以按照以下步骤并做出一些假设来提高计算效率:

  1. Enable 空间索引在你的桌子上。要在 GeoDjango 中执行此操作,请遵循文档说明并将它们适合您的模型:

    Note

    在 PostGIS 中,ST_Distance_Sphere 不限制执行地理距离查询的几何类型。[4]但是,这些查询可能需要很长时间,因为必须为查询中的每一行动态计算大圆距离。这是因为传统几何字段上的空间索引无法使用。

    为了在 WGS84 距离查询上获得更好的性能,请考虑使用地理专栏相反,因为他们能够在距离查询中使用空间索引。您可以通过设置告诉 GeoDjango 使用地理列geography=True在你的字段定义中。

  2. 现在您可以使用一些逻辑约束来缩小查询范围:

    Ex:我的用户不会寻找距离他当前位置超过 50 公里的人。

  3. 使用缩小搜索范围dwithin利用上述的空间查找空间索引,因此速度相当快。

  4. 最后应用distance对剩余行进行排序。

最终查询可能如下所示:

current_location = me.location
people = People.objects.filter(
    location__dwithin=(current_location, D(km=50))
).annotate(
    distance=Distance('location', current_location)
).order_by('distance')

P.S:使用 django 视图提供的分页方法比创建自定义分页尝试更有效:

  • Docs

或者您可以使用 Django Rest Framework 并使用它的分页:

  • Docs and a DRF分页问答示例
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

geodjango中按距离排序的效率如何(整个表) 的相关文章

随机推荐

  • 在 R 中将星期几从整数转换为字符串

    我有一个数据集 其中包含一周中的事件数字 1 7 1 是星期一 7 是星期日 我已将其转换为用户可以理解的星期几 星期一 星期二等 只需将该行中的每个 1 实例替换为星期一 等 即可 有没有一个图书馆可以更干净地为我做这件事 set see
  • Django storages S3 - 存储现有文件

    我有 django 1 11 和最新的 django storages 使用 S3 后端进行设置 我正在尝试使用 AWS 图像链接作为起点 以编程方式实例化图像文件 我无法弄清楚如何通过查看源代码 文档来做到这一点 我假设我需要创建一个文件
  • 来自 cv::solvePnP 的世界坐标中的相机位置

    我有一个校准过的相机 固有矩阵和畸变系数 我想知道相机的位置 知道一些 3d 点及其在图像中的对应点 2d 点 我知道cv solvePnP可以帮助我 阅读后this and this我知道我的输出solvePnPrvec and tvec
  • 服务器端问题:PHP 将消息推送到黑莓

    我正在使用来自的客户端代码http supportforums blackberry com t5 BlackBerry Push Development Simplified BIS Push client sample ta p 693
  • getElementsByClassName 问题[重复]

    这个问题在这里已经有答案了 我目前遇到 getElementsByClassName 属性的问题 我有一个显示和隐藏功能 当您将鼠标悬停在产品上时会显示一个按钮点击这里我已经使用 getElementById 属性启用了此函数 但是由于我想
  • 如何在 Visual Studio 2015 中关闭解决方案范围分析?

    在我同事的 PC 上 Visual Studio 2015 有时会显示一条消息 检测到内存不足 解决方案范围内的分析已关闭 显示此消息后 一切都快得多 如何手动关闭此分析 Edit 是的 我使用 Resharper 但这不是我想要的 代码分
  • Pandas:如何创建一个简单的计数器来增加每 n 行?

    有没有办法创建一个每 n 行加一的计数器 示例 gt 计数器每 4 行增加 counter 0 1 1 1 2 1 3 1 4 2 5 2 6 2 7 2 8 3 9 3 我正在尝试df counter np arange len df 4
  • 如何控制绑定到 CustomObject 的 DataGridView 中的列类型?

    我在 C WinForms 应用程序中有一个 DataGridView 它在运行时 通过 Form Load 数据绑定到自定义对象 在 DataGridView 的设计视图中 我没有设置列 当表单加载时 将根据数据绑定到的自定义对象中的数据
  • 有负零吗?

    我正在编码简单的计算器只是为了开始 iPhone 开发 问题是我有一个 按钮 它应该通过执行一个简单的操作来否定已经放在屏幕上的任何内容 1 它工作正常 除非先前的输入是0 设想 屏幕空白或0 我点击 进行否定 然后当我点击例如9我希望它能
  • Java 中带有参数的高效 XSLT 管道

    这个问题的最佳答案描述了一种在 Java 中实现高效 XSLT 管道的技术 Java 中的高效 XSLT 管道 或将结果重定向到源 不幸的是 虽然 Transformer 似乎公开了一个用于设置 XSLT 参数的 API 但这似乎没有任何效
  • 如何使用 Jest 测试 asnyc 代码(或使用 jsdom 测试“image.onload”)

    编辑 我已经用 Promise 方式更改了我的代码 我正在写反应this由facebook创建的starter 我是测试方面的新手 现在我有一个关于图像的组件 它有一个检查图像大小的功能 import React Component fro
  • Drupal 7 Views - 按字段列出组

    我有一个列出类型内容的视图Bio 人物传记 但是 我想对其进行格式化 以便将它们分组在不同的标题下 我添加了一个新字段Bios内容类型是一个包含三个不同选项的下拉列表 Foo Bar and Baz 我想做的是将人员显示在各自组的标题下 现
  • 当视图使用主布局时,MVC 4 \ 表单提交按钮不起作用

    ok 经过长时间的调查 似乎当我创建一个与 layout cshtml 一起使用的视图时 我所拥有的表单中的提交按钮不起作用 没有任何操作返回到控制器 仅当我创建视图并取消选中 使用布局或母版页 时 该按钮才起作用 这看起来非常不清楚 所以
  • 如何使用 Spring RestTemplate 将列表或字符串数​​组传递给 getForObject

    我正在用 Spring 开发一些宁静的服务 我在将字符串数组或大字符串作为参数传递 获取到服务控制器时遇到问题 我的代码示例如下 控制器 RequestMapping value getLocationInformations pointL
  • HttpClient 订阅的响应标头未定义

    谁能告诉我为什么在从 http post 获取响应时没有收到任何标头的原因 this http post
  • 版本 5.5.4+ 中的 ItextSharp 字体颜色问题

    我有一些代码使用红色字体颜色创建红色 图章 string StampDate DateTime Now ToString MM dd yyyy string FontPath Server MapPath assets Fonts stri
  • 使用 Hadoop 版本 2.7.2 从 Spark 使用 S3a 协议访问 S3

    我正在尝试从 pyspark 版本 2 2 0 访问 s3 s3a 协议 但遇到了一些困难 我正在使用 Hadoop 和 AWS sdk 软件包 pyspark packages com amazonaws aws java sdk pom
  • OSMDroid:onTap 示例

    几周前我开始学习 Android 现在我需要你的帮助 我的任务是创建离线地图 使用 OSMDroid 和 Mobile Atlas Creator 上面有两个标记 它们之间的路径以及单击此标记后的一些活动 我已经做好了地图 标记和路径 这是
  • 如果缓存文件夹中不存在文件,则重写 htaccess

    我想检查缓存文件夹中是否不存在文件 然后将其重新连接到 php 文件 RewriteCond DOCUMENT ROOT cache 0 f NC RewriteRule jpg png gif css js include cache o
  • geodjango中按距离排序的效率如何(整个表)

    假设我有以下数据模型 Person models Model id models BigAutoField primary key True name models CharField max length 50 location mode