2016-05-13 38 views
0

我正在使用的PostGIS以下近鄰查詢與燒瓶的SQLAlchemy:如何在給定距離內優化postgis中的最近鄰居查詢?

def get_neighbor(): 
    pt = WKTElement('POINT(%s %s)' % (longitude, latitude), srid=srid) 

    # Get total count of neighbor with distance less than 1000m for example. 
    total_count = db.session.query(User, func.ST_Distance(User.geom, pt)). \ 
     filter(func.ST_DWith(User.geom, pt, 1000).count() 

    if total_count > 0: 
     result_list = db.session.query(User, func_ST_Distance(User.geom, pt)). \ 
      filter(func.ST_DWithin(User.geom, pt, 1000).all() 

     return jsonify({'total_count': total_count, 'result_list':result_list}) 
    else 
     return jsonify({'total_count': total_count}) 

它的工作原理其實很好,但我查詢TOTAL_COUNTresult_list時注意到了同樣的查詢語句將被執行兩次

  1. 如何優化重複查詢問題TOTAL_COUNTresult_list
  2. 當用戶表包含數千行時,查詢會將用戶表中的每一行與給定點進行比較嗎?如果是這樣,這將是緩慢的表現,我該如何解決這個問題?

任何意見將不勝感激!

謝謝!

回答

0

我從來沒有使用過Flask-SQLAlchemy,但是你想要的是ST_DWithin,它經過了優化,可以在一定距離內查找幾何圖形,並且可以使用GiST索引。這比找到具有ST_Distance的所有幾何的距離要好。

,因爲它似乎你有SRID = 4326,你要麼需要使用geography類型獲得度量距離的計算結果,或可投geometry該類型:

SELECT COUNT(*) 
FROM user 
WHERE ST_DWithin(user.geom::geography, 'SRID=4326;POINT(-122.4 37.7)'::geography, 1000.0); 

您可以創建一個空間索引投上類似的東西:

CREATE INDEX user_geog_idx ON user USING gist ((geom::geography)); 
+0

謝謝麥克,我會試試看。 :) – Raindrop