q = WorldObject.all()
# define boundaries
# left
q.filter('x >=', x)
# right
q.filter('x <', x + width)
# top
q.filter('y >=', y)
# bottom
q.filter('y <', y + height)
#q.filter('world', world_key)
wobjects = q.fetch(1000)
我收到一条错误消息,说我不能使用多种
q = WorldObject.all()
q.filter('xy >=', db.GeoPt(1, 1))
q.filter('xy <', db.GeoPt(4, 4))
wobjects = q.fetch(1000)
我发现这个http://www.spatialdatabox.com/可能很有意思,因为它使用Amazon EC3来恢复地理数据。
这个查询给了我错误的世界对象:用lat = 9为什么?如果我限制在1到4之间? 感谢
块引用
答案 0 :(得分:2)
谷歌的数据存储索引是顺序的。此外,数据存储区拒绝满足需要多个索引的范围查询。您可以在数据存储区(硬盘)上实现GiS索引,也可以只在一个轴上执行范围查询,并在应用程序代码中排除范围外的结果(简单)。
因此,如果你想要努力,你可以使用geohash
来实现简单方法的例子:
myquery = MyModel.all()
myquery.filter("x >=" x)
myquery.filter("x <" x+delta_x)
resultset = [result for result in myquery.fetch(1000) if y <= result.y < y+delta_y]
答案 1 :(得分:2)
App Engine目前不支持您尝试执行的查询类型。虽然他们已经提到过解决方案正在进行中。
但谷歌确实有a nice walk through关于如何构建类似于你所询问的内容。另请参阅Nick Johnson的博客文章,了解有关general topic的一些有趣讨论。
答案 2 :(得分:0)
由于GeoModel,我得以某种方式工作。 你怎么看?它可能大规模工作? 如果可能的话,我想知道它在幕后做了多少查询。谢谢你的帮助:
def get_world_objects_in_area(input):
try:
x = input.x
y = input.y
width = input.w
height = input.h
world_key = input.k
except:
return False
# boundaries
top = to_map_unit(y)
bottom = to_map_unit(y-height) # this is "-" because in flash the vertical axis is inverted
left = to_map_unit(x)
right = to_map_unit(x+width)
bounding_box = geo.geotypes.Box(top, right, bottom, left)
query = WorldObject.all()
query.filter('world', world_key)
r = WorldObject.bounding_box_fetch(query,
bounding_box,
max_results=1000)
return r
def to_map_unit(n):
if n is not 0:
divide_by = 1000000000000
r = Decimal(n) / Decimal(divide_by)
return float(r)
else:
return 0