GeoModel с Google App Engine - запросы - PullRequest
5 голосов
/ 12 февраля 2010

Я пытаюсь использовать модуль Python GeoModel для быстрого доступа к геопространственным данным для моего приложения Google App Engine. У меня просто несколько общих вопросов по проблемам, с которыми я сталкиваюсь. Есть два основных метода, бесконтактный_фект и пограничный_каталог, которые вы можете использовать для возврата запросов. Они фактически возвращают набор результатов, а не фильтрованный запрос, что означает, что вам нужно полностью подготовить фильтрованный запрос перед его передачей. Это также ограничивает вас от итерации по набору запросов, так как результаты выбираются, а у вас нет опция для ввода смещения в выборку.

Если не считать изменения кода, кто-нибудь может порекомендовать решение для указания смещения в запросе? Моя проблема в том, что мне нужно проверять каждый результат по переменной, чтобы посмотреть, смогу ли я его использовать, в противном случае выбросить его и проверить следующее. Я могу столкнуться со случаями, когда мне нужно сделать дополнительную выборку, но начиная со смещения.

Ответы [ 2 ]

2 голосов
/ 07 сентября 2011

Вы также можете напрямую работать с location_geocells вашей модели.

from geospatial import geomodel, geocell, geomath

# query is a db.GqlQuery
# location is a db.GeoPt

# A resolution of 4 is box of environs 150km
bbox = geocell.compute_box(geocell.compute(geo_point.location, resolution=4))
cell = geocell.best_bbox_search_cells (bbox, geomodel.default_cost_function)

query.filter('location_geocells IN', cell)

# I want only results from 100kms.
FETCHED=200
DISTANCE=100
def _func (x):
  x.dist = geomath.distance(geo_point.location, x.location)
  return x.dist

results = sorted(query.fetch(FETCHED), key=_func)
results = [x for x in results if x.dist <= DISTANCE]
1 голос
/ 08 сентября 2011

Нет практического способа сделать это, потому что вызов geoquery превращается в несколько запросов к хранилищу данных, которые объединяются в один набор результатов. Если бы вы могли указать смещение, то геоквиту все равно пришлось бы извлекать и отбрасывать все первые n результатов, прежде чем возвращать запрошенные.

Лучшим вариантом может быть изменение гео-запроса для поддержки курсоров, но каждый запрос должен возвращать набор курсоров, а не один.

...