2010-02-11 21 views
5

Google App Engine uygulamam için coğrafi verilere hızlıca erişmek için GeoModel python modülünü kullanmaya çalışıyorum. Sadece içine girdiğim sorunlar için birkaç genel sorum var. Sorguları döndürmek için kullanabileceğiniz iki ana yöntem vardır: proximity_fetch ve bounding_box_fetch. Aslında bir sonuç kümesini döndürürler, filtrelenmiş bir sorguyu değil. Bu, filtrelenmiş bir sorguyu tam olarak iletmeden önce tam olarak hazırlamanız gerektiği anlamına gelir. Ayrıca, sonuçlar getirildiği için sorgu kümesinde yinelemenizi de engeller. getiriye bir ofset girme seçeneği.Google App Engine ile GeoModel - sorgular

Kodun değiştirilmesinin kısa bir nedeni, sorgunun bir ofset belirtilmesi için bir çözüm önerebilir mi? Benim sorunum, kullanıp kullanamayacağımı görmek için her bir sonucu değişkene göre kontrol etmem gerektiğidir, aksi halde fırlatıp diğerini test etmem gerekir. Ek bir getirme yapmam gereken, ancak bir ofsetle başlayacağım vakalara girebilirim.

+0

http://code.google.com/p/geomodel/issues/detail?id=3&colspec=ID%20Type%20Summary%20Status%20Priority%20Owner%20Stars%20Milestone – Uri

cevap

2

Modelinizin doğrudan location_geocells ile de çalışabilirsiniz. GeoQuery çağrısı tek bir sonuç kümesinde bir araya birleştirir birden veri deposu sorguları, devolves çünkü

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

, bunu yapmak için pratik bir yolu yoktur. Eğer bir ofset belirtebilseydiniz, geoquery, talep ettiğiniz ürünleri iade etmeden önce tüm n sonuçlarını almalı ve atmalıdır.

Daha iyi bir seçenek imleçlerini desteklemek için GeoQuery değiştirmek olabilir, ama her sorgu imleçler bir dizi değil, tek tek dönmek zorunda kalacaktı.