Str*_*ire 2 python django location distance geodjango
我的Profile模型有这个领域:
location = models.PointField(geography=True, dim=2, srid=4326)
Run Code Online (Sandbox Code Playgroud)
我想locations使用GeoDjango 计算这两者之间的距离(考虑到地球是一个椭球体),这样我就可以将这个距离存储在数据库中.
我已经回顾过以前的类似问题,并没有发现它们有用.没有答案足以解释正在发生的事情或其原因.
我正在使用Django 1.8和GeoDjango所需的最新版本库.
谢谢!
根据Abhyudit Jain的评论,我正在使用geopy来计算距离.根据e4c5的建议,我将它添加为属性而不是存储它:
from django.contrib.gis.measure import Distance, D
from geopy.distance import distance
@property
def distance(self):
return Distance(m=distance(self.user_a.profile.location, self.user_b.profile.location).meters)
Run Code Online (Sandbox Code Playgroud)
Geopy默认使用Vincenty的公式,误差高达0.5%,并且包含我将来会使用的许多其他功能.
以上内容返回GeoDjango Distance对象,可以在测量之间轻松转换.
谢谢您的帮助!
我如何用 GeoDjango 计算这个距离?对于两个对象:
a.location.distance(b.location)
Run Code Online (Sandbox Code Playgroud)
假设您有一个对象 a,它是您的剖面模型的实例,并且您希望找到与每个其他剖面的距离,您可以执行以下查询,如Geodjango 参考中所述:
for profile in Profile.objects.distance(a.location):
print profile.distance
Run Code Online (Sandbox Code Playgroud)
如果您只想与距离小于 1km 的物体进行比较:
for profile in Profile.objects.filter(location__dwithin=(a.location, D(km=1)).distance(a.location):
print profile.distance
Run Code Online (Sandbox Code Playgroud)
结果采用什么单位?
该单位可以是您想要的任何单位。返回的是一个距离对象。然而,默认值是以米为单位,这就是上面的打印语句将显示的内容。
是否有存储这些数据的“最佳”方法?漂浮?十进制?
最好的办法就是不保存。通常,人们不会将通过简单查询计算出的内容保存在数据库中。并且记录的数量将呈指数级增长。例如,如果您的数据库中有 N 个配置文件,它将与 N-1 个其他配置文件具有一些距离属性。所以你最终会在“缓存表”中得到 N(N-1) 条记录
| 归档时间: |
|
| 查看次数: |
3034 次 |
| 最近记录: |