6

En yakın n veya kutulu coğrafi sorguları yapacak uygulama motoru veri deposu için alternatif bir kütüphane arıyorum, şu anda GeoModel 0.2 kullanıyorum ve oldukça yavaş çalışıyor (bazı durumlarda> 1.5s)). Herhangi bir öneri var mı?Python GeoModel alternatifi

Teşekkürler!

cevap

6

Geomodel ile aynı sorunum var. Doğru olması için 4'lük bir çözünürlük kullanıyorum ve python sıralı ve filtre kullanıyorum. Bunun yerine dinamik deformasyon modelinde birleştirilerek 0.2.0 serbest kullanmanın

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

Seni daha iyi bir performansa sahip varolan bir kitaplığa gösteremiyorum ama hatırladığım kadarıyla GeoModel açık kaynak kodlu ve anlaşılması zor bir kod. Kodu, senaryonuza uyacak şekilde ayarlayarak bazı hız iyileştirmeleri yapabileceğimizi gördük.

Örneğin, en yakın-n'ye ihtiyacınız yoksa, yalnızca belirli bir sınırlama kutusundan veya yarıçaptan X sonuçlarına gereksiniminiz varsa, GeoModel'in şu anda uygun coğrafi konumdaki her kaydı alması gerektiğinden, GeoModel'in hızını muhtemelen artırabilirsiniz. ve sonra bellekte en yakın için sıralar. (Bu uygulamanın detayları, okuyucu için bir egzersiz olarak kalmıştır.)

Ayrıca, kaç tane geohash kullandığınızı ayarlamayı da düşünebilirsiniz. Çok fazla yoğun veriye sahipseniz ve küçük alanlar üzerinde sorgulama yapıyorsanız, 8 veya 12 yerine 16 seviye tutarak performansı önemli ölçüde artırabilirsiniz.

(Şu anda GeoModel kaynağına bakmıyorum ancak I son birkaç ay önce kullanıldı, bu yüzden bir tuz tohumu ile alın ve kaynak kodun içine dalın.)