如何使用Lucene.net + Spatial4n进行空间多边形搜索?

时间:2017-07-14 10:07:39

标签: asp.net search geospatial lucene.net

我有一个公司列表,每个公司都有一个lat lng。此外,每家公司都有一个准备工作的半径。我需要做的是能够围绕给定位置+半径执行搜索,看看该半径是否与任何公司的工作半径重叠。

我正在使用Lucene.net 2.9.4(Umbraco),我希望使用Spatial4n。我目前已经获得了Spatial4n 0.3 lib,并且针对它编译了lucene.net.contrib.spacial项目(在必须将最新的lucene repo广告中的一堆代码混合在一起后,似乎有些东西似乎丢失了。)

所以我的问题是,我将如何a)索引公司及其工作半径? b)搜索准备在给定搜索范围内工作的公司?

1 个答案:

答案 0 :(得分:-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
    }