在STRtree中查找最近的位置

本文关键字:位置 最近 查找 STRtree | 更新日期: 2023-09-27 17:58:43

我正在使用nettopologysuite(JTS拓扑套件的一个端口)。我使用SRTtree实现来存储时区列表和相应的坐标(基于此建议)。我从地名中提取了城市列表,提取了城市的时区和坐标,并将它们存储在STRtree中。我遇到的问题是,这个实现没有提供"最近"函数。为了进行查询,我必须提供一个起点和周长。目前我在循环中把周长增加.1,直到我找到一些结果,然后我取第一个。有更好的方法吗?

我在做什么:

    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;
    }

在STRtree中查找最近的位置

JTS 1.13提供了STRTree.nearestNeighbour方法来执行此操作。我不知道它是否已经移植到NTS,但如果没有,也许你可以请求它。

如果您唯一需要运行的查询是"获取最近的位置",那么使用R-树可能不是最佳选择。我可以想出两个替代方案:

  1. 使用Harvesine公式计算到每个位置的距离,并找到最小距离。如果你没有太多的坐标,这可能是最佳的解决方案。有关更多详细信息,请参阅"邻近搜索"
  2. 使用允许搜索最近坐标的数据结构,例如KD Tree。请注意,NetTopologySuite中的KD Tree实现不适合您的用例