1

我想使用 Geodjango 过滤使用由纬度和经度值组成的对象distance_ltePoint以下是我设置模型的方式:

class Point(models.Model):
    latitude = models.FloatField()
    longitude = models.FloatField()
    objects = models.GeoManager()

class Thing(models.Model):
    point = models.ForeignKey(Point)
    objects = models.GeoManager()

我试图像这样过滤,但没有奏效:

>>> from myapp.models import Thing, Point
>>> from django.contrib.gis.measure import D
>>> pnt = Point(37.7725205498, -122.408472587)
>>> z = Thing.objects.filter(point__distance_lte=(pnt,D(km=5)))
 TypeError: Related Field has invalid lookup: distance_lte

我该怎么做这样的事情?:

>>> z = Thing.objects.filter(point__distance_lte=(pnt,D(km=5)))
             ### or ###
>>> z = Thing.objects.filter(point__(latitude_longitude)__distance_lte=(pnt,D(km=5)))

感谢您的任何想法!

4

1 回答 1

1

使用 GeoManager 是必要的,但还不够。必须告知数据库字段包含空间数据(包括要使用的坐标系统),以便它可以在查询时解释该数据,适当地对其进行索引等。对于 PostGIS,它通过通过AddGeometryColumn添加这些列来做到这一点存储过程。您的代码仅在数据库中创建浮点字段。

因此,您最简单的方法是将PointField添加到您的Point模型中,在这种情况下,您的查找可能看起来更像模型,point__point__distance_lte或者直接添加到Thing模型中代替 ForeignKey 字段(如果您仍想单独存储 lat/long,则可能重命名此字段)。

于 2013-10-25T10:37:53.897 回答