2013-07-01 24 views
0

我試圖使用Django(1.5.1)和草堆(2.0.1)用於搜索的對象,其中包括地理位置信息:如何將GeoDjango與Haystack一起使用?

from django.contrib.gis.db import models as geomodels 

class GeoModel(geomodels.Model): 
    geo_point = geomodels.PointField() 
    # Geographic Locator manager 
    objects = geomodels.GeoManager() 
    ... 

我需要根據地理位置進行過濾。下面的查詢工作,主要是因爲GeoModel使用geomodels.GeoManager

from django.contrib.gis.measure import D 
from django.contrib.gis.geos import Point 
... 

center = Point(lat, lng) 
radius = D(km=100) 
GeoModel.objects.all().filter(geo_point__distance_lte=(center, radius)) 

問題是,當我嘗試使用草堆過濾基於其地理位置的結果。我做了一個SearchView的子類:

from haystack.views import SearchView 
... 

class MySearchView(SearchView): 

    def get_results(self): 
     center = Point(lat, lng) 
     radius = D(km=100) 
     results = super(MySearchView, self).get_results() # << OK, get all results 
     return results.filter(geo_point__distance_lte=(center, radius)) # << WRONG, no results 

那麼,我該如何定製Haystack views/form來過濾基於特定位置的結果呢? 在此先感謝。

+2

從定義點開始,你從哪裏獲得緯度/經度?另一件事是Point首先用lng定義,所以它應該是center = Point(lng,lat)。我也受騙了,但在閱讀文檔時發現它 - https://django-haystack.readthedocs.org/en/latest/spatial.html#points –

+0

嗨Dan,感謝您的澄清。我從Google Geolocation API獲取經度和緯度,並將這些值存儲在Django會話中。然後我按照這個順序建立'Point(lat,lng)'參數,但是我會檢查你發佈的參考,謝謝。 – Cartucho

回答

1

我使用了一個非常類似的設置(Django的1.5.4,2.0.0草堆,Elasticsearch 0.90.0),這就是我的了:

from haystack.utils.geo import D, Point 
from haystack.views import SearchView 

class MySearchView(SearchView): 
    results = super(MySearchView, self).get_results() 
    ... 
    lng = -112.0739 
    lat = 33.4492 
    center = Point(lng, lat) 
    radius = D(mi=50) 
    results = results.dwithin('geo_point', center, radius) 
    ... 
    return results 

一個重要的事情保持頭腦也是後端。根據Haystack後端支持矩陣(http://django-haystack.readthedocs.org/en/latest/backend_support.html#backend-support-matrix),只有Solr和Elasticsearch支持空間數據。

+0

太棒了!謝謝。 – Cartucho

相關問題