2010-02-11 34 views
5

Estoy tratando de usar el módulo GeoModel python para acceder rápidamente a datos geoespaciales para mi aplicación Google App Engine. Solo tengo algunas preguntas generales para los problemas que me estoy encontrando. Hay dos métodos principales, proximity_fetch y bounding_box_fetch, que puede usar para devolver consultas. En realidad devuelven un conjunto de resultados, no una consulta filtrada, lo que significa que debe preparar completamente una consulta filtrada antes de pasarla. También le impide iterar sobre el conjunto de consultas, ya que los resultados se obtienen y usted no tiene la opción de ingresar un desplazamiento en la búsqueda.GeoModel con Google App Engine - consultas

Si no se modifica el código, ¿alguien puede recomendar una solución para especificar un desplazamiento en la consulta? Mi problema es que necesito verificar cada resultado con una variable para ver si puedo usarla, de lo contrario, deséchela y pruebe la siguiente. Puedo encontrar casos donde necesito hacer una búsqueda adicional, pero comenzando con un desplazamiento.

+0

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

Respuesta

2

También puede trabajar directamente con el location_geocells de su modelo.

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

No hay forma práctica de hacerlo, porque una llamada a geoquery recae en varias consultas del almacén de datos, que se funde en un único conjunto de resultados. Si pudieras especificar un desplazamiento, geoquery aún tendría que buscar y descartar los primeros n resultados antes de devolver los que solicitaste.

Una mejor opción podría ser modificar geoquery para que admita cursores, pero cada consulta debería devolver un conjunto de cursores, no uno solo.