6

Sto cercando una libreria alternativa per il datastore del motore dell'app che eseguirà le query geografiche più vicine o in scatola, attualmente sto utilizzando GeoModel 0.2 e funziona piuttosto lentamente (> 1,5 secondi in alcuni casi). Qualcuno ha qualche suggerimento?Python GeoModel alternativo

Grazie!

risposta

6

Ho lo stesso problema con il geomodello. Per correggerlo, io uso una risoluzione di 4 e io uso un python ordinato e filtro.

SEARCHED_LOCATION = db.GeoPt("48.8566667, 2.3509871") # Location of Paris. 
DISTANCE = 50000 #Between 10000 and 150000. 
MAX_RESULTS = 300 

# Resolution '4' is about 150 kilometers i suppose it's a good compromise.                                
bbox = geocell.compute_box(geocell.compute(SEARCHED_LOCATION, resolution=4)) 
cell = geocell.best_bbox_search_cells(bbox, geomodel.default_cost_function) 

query.filter('location_geocells IN', cell) 

# Python filters 
def _func(x): 
    """Private method used to set the distance of the model to the searched location 
    and return this distance. 
    """ 
    x.dist = geomath.distance(SEARCHED_LOCATION, x.location) 
    return x.dist 

results = sorted(query.fetch(MAX_RESULTS), key=_func) # Order the result by distance 
results = [x for x in results if x.dist <= DISTANCE] # Filter the result 
2

Non riesco a indicarvi una libreria esistente con prestazioni migliori, ma, come ricordo, GeoModel è open source e il codice non è difficile da comprendere. Abbiamo scoperto che potremmo apportare alcuni miglioramenti di velocità adeguando il codice al nostro scenario. Ad esempio, se non è necessario il più vicino-n, sono necessari solo i risultati X all'interno di un determinato riquadro di delimitazione o raggio, è possibile migliorare la velocità di GeoModel, poiché GeoModel deve attualmente ottenere ogni record nel geohash appropriato. e quindi ordina per la memoria più vicina. (Dettagli di tale implementazione lasciati come esercizio per il lettore.)

Si potrebbe anche prendere in considerazione la regolazione di quanti livelli di geohash si sta utilizzando. Se disponi di molti dati densi e stai eseguendo query su piccole aree, potresti aumentare considerevolmente le prestazioni mantenendo 16 livelli anziché 8 o 12.

(Non sto guardando all'origine GeoModel ma richiamando quando l'ho usata per l'ultima volta diversi mesi fa, quindi prendi questo con un pizzico di sale e immergiti direttamente nel codice sorgente.)