2011-06-06 124 views
4

我使用的是nettopologysuiteJTS Topology Suite的一個端口)。我正在使用SRTtree實現來存儲時區列表和相應的座標(基於此suggestion)。我從geonames中選取城市列表,抽出城市的時區和座標,並將它們存儲在STRtree中。我遇到的問題是該實現不提供「最近」功能。爲了做一個查詢,我必須提供一個起點和一個圓周。目前我在循環中以.1遞增周長,直到找到一些結果,然後我拿第一個結果。有沒有更好的方法來做到這一點?查找STRtree中的最近位置

下面是我在做什麼:

public static SRTtree Cities { get; set; } 

    public static string GetTimezone(double lat, double lng) 
    { 
     var envelope = new Envelope(new Coordinate(lat, lng)); 

     IList results; 

     do 
     { 
      envelope.ExpandBy(.1); 
      results = Cities.Query(envelope); 
     } while (results.Count == 0); 

     return results[0] as string; 
    } 

回答

0

如果你需要運行的唯一條件是「獲取最近的位置」,使用R-樹可能不是最好的選擇。我可以考慮兩種方法:

  1. 使用Harvesine公式計算到每個位置的距離,並找到最小距離。如果你沒有太多的座標,這可能是最佳的解決方案。有關更多詳細信息,請參閱「Proximity Search」。
  2. 使用允許搜索最近座標的數據結構,如KD-Tree。請注意,NetTopologySuite中的KD-Tree實現不適合您的用例。
2

JTS 1.13提供了STRTree.nearestNeighbour方法來執行此操作。我不知道這是否已被移植到NTS,但如果沒有,也許你可以要求它。