按2个字段排序?是否有任何黑客或index.yaml?还是geoPT?

时间:2010-10-04 02:45:04

标签: python google-app-engine

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之间? 感谢


  

块引用

3 个答案:

答案 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