Если вам нужно больше, чем O (N), вы можете получить его, только если сначала заплатите N lg N за построение некоторого пространственного хеша (квадри, октре, хеш-сетку или тому подобное). Тогда каждый тест будет приблизительно равен O (LG N), и, как правило, он может быть намного лучше, если кешировать последнее проверенное местоположение, если есть большая согласованность (как правило, есть).
Я бы, вероятно, построил октре в пространстве Эйлера (геоцентрическое, XYZ), потому что это позволяет мне получить «истинное» расстояние, а не «искаженное» расстояние широта / долгота. Однако на практике квад-дерево в широтном пространстве, вероятно, будет работать достаточно хорошо. Как только у вас есть попадание, вы держитесь за этот узел дерева (при условии, что дерево не перестраивается во время выполнения), и следующий запрос начинает идти с этого узла дерева, и ему нужно беспокоиться только об узлах, которые могут быть ближе, если предыдущий пункт отошел от предыдущего ответа.