Google App Engine中的GeoModel - 查询
我正在尝试使用GeoModel这个Python模块,想要快速访问我在Google App Engine上的地理空间数据。现在我遇到了一些问题,有几个基本的问题想请教一下。
这个模块有两个主要的方法,分别是proximity_fetch和bounding_box_fetch,使用这两个方法可以返回查询结果。需要注意的是,它们返回的是一个结果集,而不是经过筛选的查询,这意味着在传入之前,你需要先准备好一个完整的筛选查询。此外,这也限制了你对查询结果进行逐个处理,因为结果是一次性获取的,而且你不能在获取时指定一个偏移量。
在不修改代码的情况下,有人能推荐一个解决方案,让我可以在查询中指定偏移量吗?我的问题是,我需要检查每个结果是否符合我的要求,如果不符合就丢掉,继续测试下一个结果。我可能会遇到需要额外获取数据的情况,但我希望能从一个偏移量开始。
2 个回答
1
实际上没有简单的方法来做到这一点,因为调用地理查询(geoquery)会变成多个数据存储查询,然后把这些结果合并成一个结果集。如果你能指定一个偏移量,geoquery 仍然需要先获取并丢弃前面 n 个结果,然后才会返回你想要的结果。
一个更好的选择可能是修改 geoquery,让它支持游标(cursors),但每个查询需要返回一组游标,而不是一个单独的游标。
2
你也可以直接使用你模型中的 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]