GeoDjango 中的地理模式距离 - PostGIS 1.5

发布于 2024-09-17 23:25:58 字数 369 浏览 9 评论 0原文

我在模型中存储一个名为“坐标”的 PointField 字段。

然后,我在命令解释器中查询距给定实例最近的实例,并打印其名称和以公里为单位的距离。

[(p.name, p.distance.m) for p in Model_Name.objects.filter(
  coordinates__distance_lte=(pnt, 1000000)).distance(pnt)]

问题是,当字段“坐标”是几何类型时,它会很好地工作。但是,如果我包含选项“geography=True”,为了获得更好的精度,它会返回一个小得多的值,即使我指示像以前一样以公里为单位打印它。

如何获得正确的地理计算?

谢谢

I store a PointField field named "coordinates" in a model.

Then, I consult nearest instances from a given one, in the command interpreter, and print its name and the distance in km.

[(p.name, p.distance.m) for p in Model_Name.objects.filter(
  coordinates__distance_lte=(pnt, 1000000)).distance(pnt)]

The thing is, when the field "coordinates" is of kind geometry, it works well. But if I include the option "geography=True", to get better precision, it returns a much smaller value, even that I am indicating to print it in km as before.

How can I get correct geography calculations?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我的痛♀有谁懂 2024-09-24 23:25:58

将 .距离() 附加到末尾查询集将导致 geoqueryset 中的每个对象都用距离对象进行注释。您可以使用该距离对象来获取不同单位的距离。

因为距离属性是一个Distance对象,所以你可以很容易地
以您选择的单位表示该值。例如,
city.distance.mi 是以英里为单位的距离值,city.distance.km
是以公里为单位的距离值

但是在 django 1.9 中,它们 移动了目标柱,而附加 .distance() 仍然有效,现在推荐的方法是

from django.contrib.gis.db.models.functions import Distance
[  (p.name, p.distance.m) for p in Model_Name.objects.filter(
   coordinates__distance_lte=(pnt, 1000000)
   ).annotate(distance=Distance('point', pnt))]

最后,而不是使用 coordinates__distance_lte 有一个postgis和mysql 5.7中提供了更快的方法: dwithin

Appending .distance() to the end of the query set would result in each object in the geoqueryset being annotated with a distance object. And you can use that distance object to get distances in different units.

Because the distance attribute is a Distance object, you can easily
express the value in the units of your choice. For example,
city.distance.mi is the distance value in miles and city.distance.km
is the distance value in kilometers

However in django 1.9 they moved the goal posts, while appending .distance() still works, now the recommended way is to do

from django.contrib.gis.db.models.functions import Distance
[  (p.name, p.distance.m) for p in Model_Name.objects.filter(
   coordinates__distance_lte=(pnt, 1000000)
   ).annotate(distance=Distance('point', pnt))]

Finally, instead of using coordinates__distance_lte there is a much faster method available in postgis and mysql 5.7: dwithin

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文