从具有点列的 Geodjango 查询集中查找最外层坐标

Posted

技术标签:

【中文标题】从具有点列的 Geodjango 查询集中查找最外层坐标【英文标题】:Find outermost cordinates from Geodjango queryset which has point column 【发布时间】:2016-05-27 14:44:47 【问题描述】:

我对地理数据和 geodjango 本身还是很陌生。假设我有模型:

class Employee(models.Model):
    name = models.CharField(max_length=30)
    location = PointField()

我想使用leafletjs 显示地图,例如http://leafletjs.com/examples/quick-start-example.html,并在其位置上标明员工姓名和标记。

现在假设员工遍布德国,但他们中的一些人远程工作,并且位于某个未知的位置。如果它们只位于德国,我可以显示整个德国的地图并根据坐标添加标记。问题是,如果一名员工位于俄罗斯,我需要为所有其他国家/地区/员工显示俄罗斯等信息。

回到代码示例:

如果我的Employee 模型查询集返回位于德国和俄罗斯两个国家的三名员工,我想用标记显示德国到俄罗斯的地图,而不是整个世界的地图。如何从查询集中计算这个最外层坐标?或者还有什么其他方法可以解决上述问题?

【问题讨论】:

俄罗斯是一个巨大的国家,你想完整地展示俄罗斯和德国吗?那会让地图缩小到很大程度?为什么不只使用最好的配件盒? 我确实在寻找最合适的盒子。但看起来我不必担心自己找到它,leafletjs 似乎可以自己处理。我会更新它的进展情况。 【参考方案1】:

Leaflet 应该能够根据您希望在地图上显示的点计算地图的边界框。这也可以很容易地完成geodjango。 extent 是您正在寻找的。

 bounds = Employee.objects.filter(some filter).extent()

这在新版本中已弃用,改为使用:

from django.contrib.gis.db.models import Extent
bounds = Employee.objects.filter(some filter).aggregate(Extent('point'))['point__extent']

在 LefletJS 中:

var mymap = L.map('mapid').fitBounds(51.505, 51.507], [51.56, 50.98]], padding: [10, 10]);

【讨论】:

很高兴能帮上忙

以上是关于从具有点列的 Geodjango 查询集中查找最外层坐标的主要内容,如果未能解决你的问题,请参考以下文章

在最外圆括号内查找字符串

Django 在不使用字段查找的情况下从查询集中排除特定实例

查找另一列具有不同列的重复项

s-s-rS 2005 查找具有最大值的列的名称

如何获取数据集中具有空值的列的总数? [复制]

使用分析函数选择具有 2 个日期列的记录的高性能查询