GeoDjango dwithin Fehler bei der Verwendung von django.contrib.gis.measure.D
Zunächst einmal: Python 2.7.6, Django 1.6.5, Postgres 9.3.4, PostGIS 2.1.3, Psycopg2 2.5.3 auf RHEL 6.5
Hier ist das relevante Modell:
class Location(models.Model):
name = models.CharField(max_length=255)
geometry = models.MultiPolygonField(blank=True, default=None, null=True)
objects = models.GeoManager() # override the default manager with a GeoManager instance
parent = models.ForeignKey('self', blank=True, default=None, null=True)
def __unicode__(self):
return self.name
Diese Abfrage sollte funktionierenlaut den docs:
touching_locations = Location.objects.filter(geometry__dwithin=(location.geometry, D(km=5)))
logging.debug(type(touching_locations))
logging.debug(len(touching_locations))
Aber das tut es nicht. Der erste Debug-Aufruf funktioniert, der zweite löst einen ausValueError
:
<class 'django.contrib.gis.db.models.query.GeoQuerySet'>
ValueError: Only numeric values of degree units are allowed on geographic DWithin queries.
Wenn ich eine kleine Änderung durch Ändern vornehmeD(km=5)
zu5
:
touching_locations = Location.objects.filter(geometry__dwithin=(location.geometry, 5))
logging.debug(type(touching_locations))
logging.debug(len(touching_locations))
Plötzlich klappt es. Die Ausgabe, die ich erhalte, ist die folgende:
<class 'django.contrib.gis.db.models.query.GeoQuerySet'>
54
Weiß jemand, warum dies nicht wie erwartet funktioniert? Ist das vielleicht ein Fehler oder mache ich einen Fehler, den ich einfach nicht sehe?
[bearbeiten]
Ich denke, das könnte ein Django-Bug sein. Ich ging voran und öffnete eine KarteHier. Sobald ich herausgefunden habe, was die richtige Lösung ist, werde ich die Antwort hier hinzufügen.