GeoDjango在一个东北和西南的框内

13

我正在使用谷歌地图创建地理应用程序,而我收到的边界框是由2个坐标表示的:

  • 东北角
  • 西南角

我有一个带PointField的模型。

from django.contrib.gis.db import models

class Place(models.Model):
    name            = models.CharField(max_length=200)
    address         = models.CharField(max_length=200)

    location        = models.PointField()

如何执行查询以获取边界框内的所有位置?

2个回答

25

@Tyler的回答在许多方面都是错误的。正确的代码应该是:

ne = (latitude, longitude)
sw = (latitude, longitude)

xmin=sw[1]
ymin=sw[0]
xmax=ne[1]
ymax=ne[0]
bbox = (xmin, ymin, xmax, ymax)

from django.contrib.gis.geos import Polygon
geom = Polygon.from_bbox(bbox)
queryset = Place.objects.filter(poly__contained=geom)

正确。你说得对。伙计,你能看一下我的问题吗?它涉及到多边形边界与日期变更线(也称为反子午线)相交的情况 - https://gis.stackexchange.com/questions/278021/how-to-get-points-within-boundaries-which-overlaps-the-anti-meridian - Andrey Shipilov
我知道对吧?Tyler的回答让我感到困惑,因为sw[0]和其他点都混乱了! - Valachio

10

假设“2个坐标”是x,y元组,例如:

ne = (50.0, -90)
sw = (45.5, -95)
您可以提取坐标并创建一个边界框元组:
xmin = sw[0]
ymin = ne[1]
xmax = sw[1]
ymax = ne[0]
bbox = (xmin, ymin, xmax, ymax)

使用边界框几何形状,使用空间查询查询您的地点记录:

from django.contrib.gis.geos import Polygon

geom = Polygon.from_bbox(bbox)
queryset = Place.objects.filter(poly__contained=geom)

3
谢谢,这个方法可行,但是xmin和ymin不应该来自同一个元组吗?(xmax/ymax也是一样的) - Charles Offenbacher
6
contained 空间查询 应该被使用吗? - borges
同意borges的观点。"objects.filter(poly__contained)"是正确的查询语句,可以找到所有poly字段在边界框内的对象。否则,这个答案已经让我接近90%的解决方案! - Victor Bruno
5
是不是应该使用 location__contained - Mitar
2
对于类型为地理位置的点,您必须使用“location__coveredby”。 - mbieren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接