【问题标题】:How to do spatial polygon search with Lucene.net + Spatial4n?如何使用 Lucene.net + Spatial4n 进行空间多边形搜索?
【发布时间】:2017-07-14 10:07:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: asp.net search geospatial lucene.net


    【解决方案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
        }
    

    【讨论】:

    • 难道这一切都不会发生在内存中,而不是 lucene 的一部分吗?这是我特别想解决的 lucene 搜索方面。
    • 您可以在发布时进行计算,将结果添加到卢塞恩索引。
    猜你喜欢
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 2017-10-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多