GeoDjango dwithin errors when using django.contrib.gis.measure.D
|Reported by:||django@…||Owned by:||nobody|
|Has patch:||no||Needs documentation:||no|
|Needs tests:||no||Patch needs improvement:||no|
First off, I started a StackOverflow thread here but haven't come up with an answer yet. I think there may be a bug in Django somewhere.
Versions: Python 2.7.6, Django 1.6.5, Postgres 9.3.4, PostGIS 2.1.3, psycopg2 2.5.3 on RHEL 6.5
Here's the model I'm using:
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
This query should work according to the docs:
touching_locations = Location.objects.filter(geometry__dwithin=(location.geometry, D(km=5))) logging.debug(type(touching_locations)) logging.debug(len(touching_locations))
But it doesn't. The first debug call works, but the second throws a ValueError:
<class 'django.contrib.gis.db.models.query.GeoQuerySet'> ValueError: Only numeric values of degree units are allowed on geographic DWithin queries.
If I make a small change by changing D(km=5) to 5:
touching_locations = Location.objects.filter(geometry__dwithin=(location.geometry, 5)) logging.debug(type(touching_locations)) logging.debug(len(touching_locations))
All of a sudden it works. The output I get is this:
<class 'django.contrib.gis.db.models.query.GeoQuerySet'> 54
Is there a bug somewhere in Django? Am I misunderstanding how to use D? Are the Django docs incorrect? Is something else going on here? I appreciate any help I can get. Thanks!
Change History (6)
comment:1 follow-up: ↓ 2 Changed 20 months ago by claudep
- Needs documentation unset
- Needs tests unset
- Patch needs improvement unset
- Resolution set to invalid
- Status changed from new to closed