Внутри GeoDjango и содержит фильтры наборов запросов, которые отличаются от прямых поисков GEOS - PullRequest
2 голосов
/ 09 января 2012

У меня есть две модели, одна с областями, другая с точками.Я пытаюсь выполнить простой поиск при сохранении точечной модели (отправляет сообщение пользователям, в чьей области появляется точка).

Следующий код находится в обработчике сигнала post_save.

(Pdb)   PointBasedModel.objects.filter(location=instance.location)
[<PointBasedModel: on 2011-12-03 16:05:52>, <PointBasedModel: on 2011-12-03 16:05:52>]

(Pdb)   PointBasedModel.objects.filter(location__within=PolyBasedModel.objects.all()[0].area)
[<PointBasedModel: on 2012-01-03 17:36:51>, <PointBasedModel: on 2011-12-03 16:05:52>, <PointBasedModel: on 2011-12-03 16:05:52>, <PointBasedModel: on 2011-11-09 19:53:34>, <PointBasedModel: on 2011-11-09 19:53:34>, <PointBasedModel: on 2011-11-06 15:24:31>, <PointBasedModel: on 2011-10-17 07:40:39>, <PointBasedModel: on 2011-02-27 20:46:04>]

(Pdb) PolyBasedModel.objects.filter(area__contains=PointBasedModel.objects.filter(location__within=PolyBasedModel.objects.all()[0].area)[0].location)
[]

Как вы можете видеть, можно извлечь только что созданный экземпляр, а затем найти все PolyBasedModel, в которых появляется этот экземпляр PointBasedModel, отфильтровывая обратно PolyBasedModel, используя PointBasedModel, который, как известно, находится в пределахПоли, терпит неудачу.

Код немного придуман, чтобы продемонстрировать проблему, проще говоря, вот что я вижу:

(pdb) PolyBasedModel.objects.filter(area__contains=instance.location)
[]
(pdb) instance.location.within(PolyBasedModel.objects.get(pk=2).area)
True
(Pdb) PolyBasedModel.objects.get(pk=2).area.contains(instance.location)
True

Это не имеет смысла ... Любойбыла похожая проблема / знаете решение?

1 Ответ

0 голосов
/ 09 января 2012

Немного покопавшись, я обнаружил эту проблему:

(Pdb) str(PolyBasedModel.objects.filter(area__contains='POINT (-2.6203333333300001 51.4453333332999989)').query)
*** AttributeError: 'str' object has no attribute 'ewkb'

Быстрый поиск 'str' object has no attribute 'ewkb' показал http://groups.google.com/group/geodjango/browse_thread/thread/11a3016a0aeceec9, что указывает на то, что вы должны использовать GeoManager ... очевидно.

Изменение PolyBasedModel для использования GeoManager исправило его.

Полагаю, это то, что вы получаете за преобразование из не геопространственного в геопространственное! Сделай это правильно с первого раза. : -)

...