Найти ближайшее место в STRtree - PullRequest
4 голосов
/ 07 июня 2011

Я использую nettopologysuite (порт JTS Topology Suite ).Я использую реализацию 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;
    }

Ответы [ 2 ]

2 голосов
/ 22 апреля 2013

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

0 голосов
/ 27 февраля 2013

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

  1. Рассчитайте расстояние до каждого места, используя формулу Харвесина, и найдите минимальное расстояние. Если у вас не слишком много координат, это может быть оптимальным решением. См. " Proximity Search " для получения более подробной информации.
  2. Используйте структуру данных, которая позволяет искать ближайшие координаты, например, KD-Tree . Обратите внимание, что реализация KD-Tree в NetTopologySuite не подходит для вашего варианта использования.
...