2017-07-14 79 views
2

我有一個公司的列表,每個公司都有一個lat lng。另外,每個公司都有一個他們準備工作的範圍。我需要做的是能夠圍繞給定位置+半徑執行搜索,並查看該半徑是否與任何公司的工作半徑重疊。如何用Lucene.net + Spatial4n做空間多邊形搜索?

我使用的是Lucene.net 2.9.4(Umbraco),我正在使用Spatial4n。我目前得到了Spatial4n 0.3 lib,並且已經編譯了lucene.net.contrib.spacial項目(在將最新的lucene回購廣告中的一些代碼混合在一起之後,有些東西似乎缺失了)。

所以我的問題是,我將如何開始索引公司及其工作半徑?和b)尋找準備在給定搜索範圍內工作的公司?

回答

-1

不能回答a),但對於b),得到2個座標之間的距離,如果它小於兩個半徑的總和,則它是匹配的(即重疊)。

獲取距離:

public static double GetDistance(double latitude1, double longitude1, double latitude2, double longitude2, DistanceUnits distanceUnits = DistanceUnits.Miles) 
    { 
     try 
     { 
      // Earth radius in kilometers via NASA as of 2016 - https://nssdc.gsfc.nasa.gov/planetary/factsheet/earthfact.html 
      const double earthRadiusKilometers = 6378.137; 

      var latRadians = (latitude2 - latitude1).ToRadians(); 
      var lonRadians = (longitude2 - longitude1).ToRadians(); 

      var a = Math.Sin(latRadians/2) * 
        Math.Sin(latRadians/2) + 
        Math.Cos(latitude1.ToRadians()) * 
        Math.Cos(latitude2.ToRadians()) * 
        Math.Sin(lonRadians/2) * 
        Math.Sin(lonRadians/2); 

      var radianDistance = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a))); 

      switch (distanceUnits) 
      { 
       case DistanceUnits.Kilometers: 
        { 
         return radianDistance * earthRadiusKilometers; 
        } 
       case DistanceUnits.Miles: 
        { 
         return radianDistance * ConvertKilometersToMiles(earthRadiusKilometers); 
        } 
      } 

      return radianDistance; 
     } 
     catch 
     { 
      return double.MaxValue; 
     } 
    } 

    public static double ConvertKilometersToMiles(double kilometers) 
    { 
     return kilometers * 0.621371192; 
    } 

    public enum DistanceUnits 
    { 
     Miles, 
     Kilometers, 
     Radians 
    } 
+0

難道這一切是發生在內存雖然不Lucene的一部分?這是我特別想要解決的lucene搜索方面。 –

+0

您可以在發佈時進行計算,將結果添加到盧塞恩索引中。 –