Я бы перевел их в трехмерные координаты, а затем использовал бы разделяй и властвуй , используя плоскость, а не линию. Это определенно будет работать правильно. Мы можем быть уверены в этом, потому что при рассмотрении только точек на сфере две ближайшие точки по дуговому расстоянию (расстояние, пройденное по поверхности) также будут двумя ближайшими по 3-му декартовому расстоянию. Это будет иметь время работы O (nlogn).
Для перевода в трехмерные координаты проще всего сделать (0,0,0) центр Земли, и тогда ваши координаты будут (cos (широта) * cos (долгота), cos (широта) * грех (LAN), грех (лат)). Для этих целей я использую шкалу, для которой радиус Земли равен 1, чтобы упростить вычисления. Если вам нужно расстояние в какой-то другой единице, просто умножьте все величины на радиус Земли, если измерять в этой единице.
Должен отметить, что все это предполагает, что земля является сферой. Это не совсем одна точка, и точки могут иметь высоту, поэтому эти ответы не будут действительно точными, но они будут очень близки к корректировке почти в каждом случае.