Сортировать по 2 полям? есть ли хаки или с index.yaml? или geoPT? - PullRequest
3 голосов
/ 04 октября 2010
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? спасибо


Blockquote

Ответы [ 3 ]

2 голосов
/ 04 октября 2010

App Engine в настоящее время не поддерживает тип запросов, которые вы пытаетесь выполнить. Хотя они уже упоминали, что решение находится в разработке.

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

2 голосов
/ 04 октября 2010

индексы хранилища данных Google являются последовательными. Более того, хранилище данных отказывается удовлетворить запросы диапазона, для которых требуется более одного индекса. Вы можете либо внедрить индекс 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]
0 голосов
/ 06 октября 2010

Я начал работать, благодаря 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...