Найти ближайшее местоположение в STRtree

Я использую nettopologysuite (порт JTS Набор топологий). Я использую реализацию SRTtree для хранения списка часовых поясов и соответствующих координат (на основе этого предложение). Я взял список городов из геоназваний, вытащил часовой пояс города и координаты и храню их в STRtree. проблема, с которой я сталкиваюсь, заключается в том, что эта реализация не предоставляет функцию «Ближайший». Чтобы сделать запрос, я должен указать начальную точку и окружность. В настоящее время я увеличиваю окружность на 0,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;
    }

person Micah    schedule 06.06.2011    source источник


Ответы (2)


JTS 1.13 предоставляет файл STRTree.nearestNeighbour для выполнения этой операции. Я не знаю, было ли это перенесено на NTS, но если нет, возможно, вы можете запросить это.

person dr_jts    schedule 22.04.2013

Если единственный запрос, который вам нужно выполнить, это «Получить ближайшее местоположение», использование R-дерева может быть не лучшим выбором. Я мог бы подумать о двух альтернативах:

  1. Вычислите расстояние до каждого местоположения, используя формулу Харвезина, и найдите минимальное расстояние. Если у вас не слишком много координат, это может быть оптимальным решением. Дополнительные сведения см. в разделе "Близкий поиск".
  2. Используйте структуру данных, позволяющую искать ближайшие координаты, например KD-Tree. Обратите внимание, что реализация KD-Tree в NetTopologySuite не подходит для вашего варианта использования.
person kshahar    schedule 27.02.2013