- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是在与@Nargiza 解决此问题的过程中出现的意外行为:3d distance calculations with GeoDjango .
遵循 Distance 上的 Django 文档函数:
Accepts two geographic fields or expressions and returns the distance between them, as a Distance object.
来自Distance object,我们可以得到每一个 supported units 中的距离.
但是:
设模型为:
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
和 p2
之间的距离。
相反,我们得到了以下错误:
AttributeError: 'Distance' object has no attribute 'm'
我们最终找到了解决方法 (d = Distance(m=p1.distance(p2))
) 但问题仍然存在:
为什么Distance
函数没有返回Distance
对象?
这是一个错误,还是我们遗漏了什么?
提前感谢您的宝贵时间。
最佳答案
这两者并没有那么密切相关。文档确实说它“返回”Distance 对象,但还有一个额外的步骤:
django.contrib.gis.db.models.functions.Distance 是一个数据库函数,它需要两个表达式(可能包括数据库字段名称)并返回 Func可用作查询的一部分的对象。
所以简单来说就是需要在数据库中执行。它将使用数据库函数(例如 postgis ST_Distance)计算距离,然后将其作为 django.contrib.gis.measure.Distance 对象返回。
因此,除非有人想搞乱 SQL 编译器和数据库连接,否则获取两点之间距离的最简单方法是 Distance(m=p1.distance(p2))
编辑一些代码来说明这一点:
您可以在 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
现在,让我们看一下距离函数:
将 __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
查询:
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_sphere
sql 函数使用来自 "mymodel"."coordinates"
的值和我们的 origin
的字节表示来计算距离> 点。
我们现在可以使用它来过滤和排序以及许多其他事情,所有这些都在数据库管理系统中(快速):
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>]
注意 .m
您需要将 float 传递给过滤器,它将无法识别 Distance 对象。
关于python - Django 的 Distance 函数不返回 Distance 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43864292/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我已经检查了问题、源代码和其他示例,但我终究无法理解 Distance d = Distance() 是什么。参数在函数中的意思 template int flann::hierarchicalClu
从 GeoDjango Point Field,我得到以下几点: object1.point = "POINT(-113.4741271000000040 53.4235217000000020)"
这是在与@Nargiza 解决此问题的过程中出现的意外行为:3d distance calculations with GeoDjango . 遵循 Distance 上的 Django 文档函数:
我在 C++ 中实现了 Damerau–Levenshtein 距离,但它没有为输入(pantera,主动脉)提供正确的 o/p,正确的 o/p 是 4,但我的代码给出了 5...... int e
嘿,各位极客们! 我对 Web 3.0 有一个革命性的想法,呵呵。我将创建一个像 jQuery-UI 一样的 SVG-UI-lib。为了使某些功能成为可能,我需要 fork /贡献 d3.js。IE。
我有一个列表,其中包含具有 3D 名称和坐标的点列表。类似这样的列表长度要长得多: group=[[gr1, 5, 8, 9], [gr2, 7, 4, 5], [gr3, 3, 8, 1], [gr
我是 OOP 的新手,我在这个任务中一直遇到这个错误。或许你能帮帮我。 这是类头文件: class Distance : public Magnitude { private: double
Django——地质学 我正在寻找如何定义两点之间的距离。第一个与帖子本身有关,不会因每个帖子而改变。它表示帖子的位置。第二个将与用户的位置相关联。 我想计算发布和用户的距离。 问题:假设我已连接:每
当使用短语运算符( )语法进行全文搜索时,它并没有像我期望的那样“小于或等于”数字。搜索值必须正好位于那么多位置之外。 给出这个例子: select * from (values ('bob i
假设我有两个由纬度和经度表示的位置。 位置1:37.5613 , 126.978地点 2 : 37.5776 , 126.973 如何使用曼哈顿距离计算距离? 编辑:我知道计算曼哈顿距离的公式,如 E
我有两个我知道纬度和经度的点。 我如何计算它们之间的距离(以公里和英里为单位)。公式是什么? 最佳答案 您可以使用 haversine formula来计算这样的距离。 关于distance - 以公
我搜索了 A* 的算法/伪代码,然后对其进行了编码。我使用曼哈顿距离作为 h(n)。 ( f(n) = g(n) + h(n) ) 这就是结果, 当没有墙挡路时总是会发生这种情况,但是当我放置很多墙时
我正在寻找一种数据结构来处理包含 512 个二进制值的数十亿个二进制字符串。 我的目标是向结构发送查询并获得一个结果集,其中包含距离更短的所有数据。 我的第一个想法是使用 kd 树。但是这些树对于高维
无线测量相距几米的两个物体(计算机、智能手机或专用设备)之间的距离的最佳方法是什么,精确到约 10 厘米? 这是否可以通过在 WLAN、蓝牙或 GPS 上小 pig 乞求来实现? 最佳答案 Ekaha
给定一个四元数值,我想在一组四元数中找到它的最近邻居。为此,我显然需要一种方法来比较两个四元数之间的“距离”。这种比较需要什么距离表示以及如何计算? 谢谢 乔什 最佳答案 这是一个老问题,但似乎需要更
我们如何测量分类数据之间的相似度距离? 示例:性别:男、女数值:[0 - 100]、[200 - 300]弦乐:专业人士、初学者等... 提前致谢。 最佳答案 有不同的方法可以做到这一点。最简单的一种
我正在开发一种工具来查找给定纬度和经度的两点之间的距离。当纬度和经度在 中给出时就可以了签名学位格式 .但是当在 中给出纬度和经度时,我找不到计算距离的方法。度分秒格式 (例如:N 11° 14' 5
编辑距离查找一个字符串到另一个字符串所需的插入、删除或替换次数。我还想在这个算法中包含掉期。例如“apple”和“appel”应该给出1的编辑距离。 最佳答案 您定义的编辑距离称为 Damerau-L
我实现了一个 levenshtein trie 来查找与给定单词相似的单词。 我的目标是有一种快速的方法来进行拼写纠正。 但是我发现有一种更快的方法可以做到这一点: 莱文斯坦自动机 我只是有一个问题.
我是一名优秀的程序员,十分优秀!