私はGeoDjango(Django 1.7およびPostGIS 2.1.4バックエンドを使用)で作業しています。データベースにPointFieldを含むモデルがあり、ポイントから半径10 km以内のすべてのアイテムを検索しようとしています。
これが私のモデルコードです:
class Place(models.Model):
id = models.IntegerField(primary_key=True)
location = models.PointField(null=True, blank=True)
objects = models.GeoManager()
これが私のビューコードです(読みやすくするために省略されています):
from django.contrib.gis.geos import Point
from django.contrib.gis.measure import Distance
lat = 52.5
lng = 1.0
radius = 10
point = Point(lng, lat)
print point
places = Place.objects.filter(location__dwithin=(point.location, Distance(km=radius)))
これは私に与えます:
AttributeError: 'Point' object has no attribute 'location'
コンソールにポイントが表示されます:POINT (1.0000000000000000 52.5000000000000000)
。
クエリの構造を変えるにはどうすればよいですか?
(dwithinのドキュメントに従って)point
ではなく単に使用しようとすると、別のエラーが発生します。point.location
ValueError: Only numeric values of degree units are allowed on geographic DWithin queries
更新:
これは動作するようですが、それが正しいかどうかはわかりません:
radius = int(radius)
degrees = radius / 111.325
point = Point(float(lng), float(lat))
places = Place.objects.filter(location__dwithin=(point, degrees))
結果は問題ないように見えますが、度への変換が妥当かどうかはわかりません。
いいえ、そうではありません。この比率は赤道でのみ機能します。
—
Michal Zimmermann