Django 的 Distance 函数不返回 Distance 对象

2023-12-02

这是在与 @Nargiza 解决此问题的过程中出现的意外行为:使用 GeoDjango 进行 3D 距离计算.

遵循 Django 文档Distance function:

接受两个地理字段或表达式并且返回它们之间的距离,作为 Distance 对象.

并从一个Distance object,我们可以得到每一个的距离支持单位.

But:

设模型为:

class MyModel(models.Model):
    ...
    coordinates = models.PointField()

然后是以下内容:

p1 = MyModel.objects.get(id=1).coordinates
p2 = MyModel.objects.get(id=2).coordinates
d = Distance(p1, p2) # This is the function call, 
                     # so d should be a Distance object
print d.m

应该打印之间的距离p1 and p2以米为单位。

相反,我们收到以下错误:

AttributeError: 'Distance' object has no attribute 'm'

我们最终找到了一个解决方法(d = Distance(m=p1.distance(p2)))但问题仍然存在:

Why the Distance function没有返回Distance object?
这是一个错误,还是我们错过了什么?

在此先感谢您的时间。


这两者之间的关系并不密切。文档确实说它“返回” Distance 对象,但有一个额外的步骤:

django.contrib.gis。数据库模型.functions.距离 is a database函数,它需要两个表达式(可能包括数据库字段名称)并返回一个Func可以用作查询的一部分的对象。

所以简单来说,需要在数据库中执行。它将使用数据库函数计算距离(例如postgis ST_距离)然后把它带回来作为django.contrib.gis.measure.距离 object.

因此,除非有人想搞乱 SQL 编译器和数据库连接,否则获取两点之间距离的最简单方法是Distance(m=p1.distance(p2))

EDIT:一些代码来说明这一点:

您可以查看距离(测量)类的代码django/contrib/gis/measure.py。它相当小并且很容易理解。它所做的只是为您提供一种方便的方法来进行距离转换、比较和算术运算:

In [1]: from django.contrib.gis.measure import Distance

In [2]: d1 = Distance(mi=10)

In [3]: d2 = Distance(km=15)

In [4]: d1 > d2
Out[4]: True

In [5]: d1 + d2
Out[5]: Distance(mi=19.32056788356001)

In [6]: _.km
Out[6]: 31.09344

现在,让我们看一下距离函数:

Add __str__方法到模型,以便我们可以在查询集 api 返回时看到距离值和短 db_table 名称,以便我们可以在查询中查看:

class MyModel(models.Model):
    coordinates = models.PointField()

    class Meta:
        db_table = 'mymodel'

    def __str__(self):
        return f"{self.coordinates} {getattr(self, 'distance', '')}"

创建一些对象并做一个简单的select * from query:

In [7]: from gisexperiments.models import MyModel

In [8]: from django.contrib.gis.geos import Point

In [10]: some_places = MyModel.objects.bulk_create(
    ...:     MyModel(coordinates=Point(i, i, srid=4326)) for i in range(1, 5)
    ...: )

In [11]: MyModel.objects.all()
Out[11]: <QuerySet [<MyModel: SRID=4326;POINT (1 1) >, <MyModel: SRID=4326;POINT (2 2) >, <MyModel: SRID=4326;POINT (3 3) >, <MyModel: SRID=4326;POINT (4 4) >]>

In [12]: str(MyModel.objects.all().query)
Out[12]: 'SELECT "mymodel"."id", "mymodel"."coordinates" FROM "mymodel"'

无聊的。让我们使用 Distance 函数将距离值添加到结果中:

In [14]: from django.contrib.gis.db.models.functions import Distance

In [15]: from django.contrib.gis.measure import D  # an alias

In [16]: q = MyModel.objects.annotate(dist=Distance('coordinates', origin))

In [17]: list(q)
Out[17]:
[<MyModel: SRID=4326;POINT (1 1) 157249.597768505 m>,
 <MyModel: SRID=4326;POINT (2 2) 314475.238061007 m>,
 <MyModel: SRID=4326;POINT (3 3) 471652.937856715 m>,
 <MyModel: SRID=4326;POINT (4 4) 628758.663018087 m>]

In [18]: str(q.query)
Out[18]: 'SELECT "mymodel"."id", "mymodel"."coordinates", ST_distance_sphere("mymodel"."coordinates", ST_GeomFromEWKB(\'\\001\\001\\000\\000 \\346\\020\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\'::bytea)) AS "distance" FROM "mymodel"'

你可以看到它使用ST_distance_spheresql 函数使用以下值计算距离"mymodel"."coordinates"和我们的字节表示origin point.

我们现在可以使用它进行过滤和排序以及许多其他事情,所有这些都在数据库管理系统内(快速):

In [19]: q = q.filter(distance__lt=D(km=400).m)

In [20]: list(q)
Out[20]:
[<MyModel: SRID=4326;POINT (1 1) 157249.597768505 m>,
 <MyModel: SRID=4326;POINT (2 2) 314475.238061007 m>]

Notice .m您需要将浮点数传递给过滤器,它将无法识别距离对象。

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

Django 的 Distance 函数不返回 Distance 对象 的相关文章

  • 更改 Inkscape 的 Python 解释器

    在使用 Inkscape 时 我不断收到错误 这似乎意味着未满足 python 2 vs 3 的期望 尽管我已经安装了它们 例如 当我尝试从模板生成新文档时 我得到 Traceback most recent call last File
  • 如何配置散景图以具有响应宽度和固定高度

    我使用通过组件功能嵌入的散景 实际上我使用 plot sizing mode scale width 它根据宽度进行缩放并保持纵横比 但我想要一个响应宽度但固定或最大高度 这怎么可能实现呢 有stretch both and scale b
  • 错误只有 size-1 数组可以转换为 Python 标量

    我有这个代码 for a in data X for i in a if not i isdigit x hash i data X column row x row row 1 row 0 column column 1 desired
  • 使用 GeoDjango 在坐标系之间进行转换

    我正在尝试将坐标信息添加到我的数据库中 添加django contrib gis支持我的应用程序 我正在写一个south数据迁移 从数据库中获取地址 并向 Google 询问坐标 到目前为止 我认为我最好的选择是使用geopy为了这 接下来
  • 在 Python 中比较日期 - 如何处理时区修饰符

    我正在做Python日期比较 假设我有一个这样的约会 Fri Aug 17 12 34 00 2012 0000 我按以下方式解析它 dt datetime strptime Fri Aug 17 12 34 00 2012 0000 a
  • 代理阻止网络套接字?如何绕行

    我有一个用 Python 编写的正在运行的 websocket 服务器 来自https github com opiate SimpleWebSocketServer https github com opiate SimpleWebSoc
  • Python:如何重构循环导入

    我有件事可以帮你做engine setState
  • 将 JSON 字符串传递给 Django 模板

    我一直在用头撞墙 试图找出为什么我无法将从 Django 模型生成的 JSON 字符串传递到模板的 javascript 静态文件中 事实证明 问题不在模型级别 使用serializers serialize 在脚本本身中放入相同的字符串将
  • 检查对象数组中的多个属性匹配

    我有一个对象数组 它们都是相同的对象类型 并且它们有多个属性 有没有办法返回一个较小的对象数组 其中所有属性都与测试用例 字符串匹配 无论该属性类型是什么 使用列表理解all http docs python org 3 library f
  • Selenium 网页抓取与动态内容和隐藏数据表上的美丽汤

    真的需要这个社区的帮助 我正在使用 Selenium 和 Beautiful Soup 对 Python 中的动态内容进行网页抓取 问题是定价数据表无法解析为 Python 即使使用以下代码 html browser execute scr
  • keras 预测内存交换无限期增加

    我使用keras实现了一个分类程序 我有一大组图像 我想使用 for 循环来预测每个图像 然而 每次计算新图像时 交换内存都会增加 我尝试删除预测函数内部的所有变量 并且我确信该函数内部存在问题 但内存仍然增加 for img in ima
  • 如何创建指向指针数组的 Python ctypes 指针

    我需要学习如何处理char 在下面的 C 方法中通过 Python ctypes 我通过使用调用其他只需要单个指针的方法做得很好create string buffer 但此方法需要一个指向指针数组的指针 ladybugConvertToM
  • 散景中的时间序列流

    我想在散景中绘制实时时间序列 我只想在每次更新时绘制新的数据点 我怎样才能做到这一点 散景网站上有一个动画情节的示例 但它每次都需要重新绘制整个图片 另外 我正在寻找一个简单的示例 我可以在其中逐点绘制时间序列的实时绘图 散景效果0 11
  • Django Azure AD 集成

    我目前正在使用 Azure AD 将 SSO 集成到 Django 项目中 我目前正在使用该包 https github com leibowitz django azure ad auth https github com leibowi
  • 对 pandas 数据框中的每一列应用函数

    我如何以更多的熊猫方式编写以下函数 def calculate df columns mean self df means for column in df columns columns tolist cleaned data self
  • 带有整数的 np.sqrt 和 where 条件返回错误结果

    当我将 numpy sqrt 方法应用于带有 a 的整数数组时 我得到了奇怪的结果where健康 状况 见下文 对于整数 a np array 1 4 9 np sqrt a where a gt 5 Out 3 array 0 0 5 3
  • 如何在 Python 中解析损坏的 XML?

    我无法影响的服务器发送的 XML 非常损坏 具体来说 Unicode WHITE STAR 将被编码为 UTF 8 E2 98 86 然后使用 Latin 1 转换为 HTML 实体表 我得到的是 acirc 98 86 9 个字节 位于声
  • python IDLE shell 似乎无法正确处理一些转义

    例如 b 退格键打印为四元 在下面的示例中显示为 但是 n 换行是可以的 gt gt gt print abc bd abc d gt gt gt print abc nd abc d 我在 Vista pro python 2 7 下运行
  • Elastic Beanstalk 上的 Django + MySQL - 查询 MySQL 时出错

    当我在 Elastic beanstalk 上托管的 Django 应用程序上查询 MySQL 时 出现错误 错误说 admin login 处出现操作错误 1045 用户 adminDB 172 30 23 5 的访问被拒绝 使用密码 Y
  • 将笔记本生成的 HTML 片段转换为 LaTeX 和 PDF

    在我的笔记本里有时会有 from IPython display import display HTML display HTML h3 The s is important h3 question of the day 但当我后来将笔记本

随机推荐

  • mysql_insert_id线程安全吗?

    我正在使用 MySQL C API 构建数据库客户端应用程序 并且我需要获取 INSERT 语句中的最后一个自动增量值 因此 mysql insert id 可以做到 但是这个客户端是多线程的 并且是这样的一段代码 mysql query
  • 如何在Python中使列表只包含不同的元素? [复制]

    这个问题在这里已经有答案了 我有一个 Python 列表 如何使其值唯一 最简单的方法是转换为集合 然后再转换回列表 my list list set my list 这样做的一个缺点是它不会保留订单 您可能还想首先考虑使用集合 而不是列表
  • 保护正在访问的用户文件,以便只有所有者才能访问?

    我正在用 php 编写一个 Web 应用程序 用户可以在其中上传自己的文件或图像 但如何保护这些文件不被所有者以外的其他人访问 想想 dropbox 保护这些文件的机制是什么 我尝试过搜索 但没有得到任何关于此的信息 任何指向教程的指针或链
  • 使用进程名称获取另一个程序的窗口标题

    这个问题可能很基本 但我很难破解它 我假设我必须使用一些东西ctypes windll user32 请记住 我几乎没有使用这些库的经验 甚至没有ctypes作为一个整体 我已经使用此代码列出了所有窗口标题 但我不知道应该如何更改此代码以获
  • 使用html5(提醒应用程序)访问电话闹钟(原生资源)

    这些是我的技术 HTML5 Jquery 移动 Jquery Javascript Css Cordova 我们正在使用 HTML 5 开发应用程序 我们需要访问手机 Android iPhone Windows Phone 资源 例如闹钟
  • Swift 中的重命名问题

    我是第一次使用 Swift 进行编程 在此过程中我遵循this教程 不幸的是 该教程看起来有点过时 并且大多数代码都会引发构建时错误 最常出现的错误是NSURLSession has been renamed to URLSession 我
  • 如何使用 python 以“更智能”的方式下载文件?

    我需要在Python中通过http下载几个文件 最明显的方法就是使用 urllib2 import urllib2 u urllib2 urlopen http server com file html localFile open fil
  • 使用 SICStus Prolog 推广斐波那契数列

    我正在尝试寻找广义斐波那契序列 GFS 查询的解决方案 问题是 是否有第 12 个数字为 885 的 GFS 最初的 2 个数字可能限制在 1 到 10 之间 我已经找到了在从 1 1 开始的序列中查找第 N 个数字的解决方案 其中我明确定
  • 如何使用 Azure AD B2C 保护 Spring Boot REST API 的安全?

    我正在使用 Spring Boot 2 2 0azure active directory b2c spring boot starter2 2 0 我设法用它来保护 Thymeleaf 网页 按照他们的教程 现在 我想要一个以相同方式保护
  • SpringBeanAutowiringSupport不在jUnit测试中注入bean

    I use SpringBean自动装配支持用于某些对象中的 bean 注入 问题是 bean 注入在 jUnit 测试中不起作用 使用 SpringJUnit4ClassRunner 进行测试 public class DossierRe
  • 字节数组的 HashSet [重复]

    这个问题在这里已经有答案了 我需要一个字节数组的 HashSet 来检查集合中是否存在给定的字节数组 但这似乎不适用于字节数组 或可能任何数组 这是我的测试代码 void test byte b1 new byte 1 2 3 byte b
  • PHP函数/过程动态绑定问号

    我对 PHP 还很陌生 我需要通过编写自定义函数来绑定 PDO 中的参数 假设这些是我有的 2 个 sql sample sql 1 select f name age address from table1 where l name an
  • 在 IntelliJ IDEA 中单步调试 JDK 源代码

    如何在 IntelliJ IDEA 7 中单步执行 JDK 源代码并查看调试信息 我当前可以命中断点并单步执行代码 但调试信息不 可用 这意味着我看不到局部变量的值 我只想单步执行一个类的源代码 如果这很重要的话 对于它的价值来说 它是ja
  • Spring 4 与 thymeleaf 国际化无法识别资源属性文件中的消息

    使用 Spring 4 thymeleaf 开发我的 web 应用程序以支持国际化 我尝试了很多方法来更改位置文件和基本名称的配置 但仍然收到 label greeting 在模板结果上 下面是我的代码 Configuration Enab
  • IPv6 应用商店拒绝

    我们的更新今天因 IPv6 网络连接问题两次被拒绝 我们的网络代码在先前版本和当前版本之间没有更改 该应用程序仅向 api metooapp io 发出 https 网络请求 该请求已正确配置为 ipv6 0 并在 AWS 上的route5
  • 如何在zend框架中使用子查询执行查询

    你好 我需要用 Zend Db Select 编写这个 sql 但我不知道如何编写子查询 我将不胜感激任何帮助 谢谢 SELECT FROM advert WHERE categoryId IN SELECT id FROM tree WH
  • 获取正在运行的进程分配的内存区域

    谁能告诉我如何使用 WinAPI 函数获取某个进程的内存分配内存区域 我想知道每个区域 起始地址 大小和其他一些信息 例如保护类型等 我找不到任何 WinAPI 函数来执行此操作 谁能帮我 有代码可以使用暴力破解VirtualQueryEx
  • Spring AMQP 集成 - 用户手册确认

    我正在测试Spring AMQP with Spring Integration支持 我有以下配置和测试
  • ASP.Net 会话状态在其他网页上不可用

    我正在设计一个单页 Web 应用程序 所有操作都发生在 default aspx 上 我在用户登录后将其用户 ID 存储在 Session 中 我在default aspx中使用SWFUpload将文件上传到upload aspx 当 up
  • Django 的 Distance 函数不返回 Distance 对象

    这是在与 Nargiza 解决此问题的过程中出现的意外行为 使用 GeoDjango 进行 3D 距离计算 遵循 Django 文档Distance function 接受两个地理字段或表达式并且返回它们之间的距离 作为 Distance