Вы можете думать об этом как о проблеме 3D. Преобразуйте (широта, долгота) координаты в (x, y, z) координаты. Это нужно сделать только один раз для вашей базы данных.
Для каждой контрольной точки преобразуйте в (x, y, z) и вычислите квадраты расстояний chord (для скорости и простоты) до каждого города. Выберите ближайший. Я считаю, что ближайший город в 3-пространстве также будет самым близким городом с точки зрения расстояния большого круга.
Если вам нужно большое расстояние по кругу, вы можете рассчитать его только для ближайшего города.
С (x, y, z) -space, возможно, существует структура пространственного разделения, которую вы можете использовать, чтобы ограничить, какие города вам действительно нужно проверить. Я не думаю, что есть тот, который поможет непосредственно в (lat, lon) -пространстве. Но O (N) действительно не так уж и плохо. Кроме того, проблема векторизуется довольно хорошо.