Помимо сохранения широты и долготы как двойных, вы определенно захотите проиндексировать эти поля. Однако вам следует помнить о том, что операции с индексами наиболее эффективны в случае целочисленных полей - и это важно учитывать при работе с большими объемами данных.
Полагаю, вам может помочь следующий алгоритм:
- ввести дополнительные столбцы:
- LatitudeIdx int = round (Latitude * ScaleFactor)
- LongitudeIdx int = round (Longitude * ScaleFactor)
- определить значение для ScaleFactor, которое будет соответствовать вашим потребностям
- определить индекс (LatitudeIdx, LongitudeIdx)
- запрос данных к вам с использованием значений LatiduteIdx и LongitudeIdx (это будет операция быстрого просмотра индекса)
Чего вы добьетесь с помощью * столбцов Idx и ScaleFactor фактически разбивает ваши данные на ячейки одинакового размера. Размер ячейки фактически равен 1 / географическим градусам ScaleFactor, то есть примерно 111 км / ScaleFactor.
Таким образом, когда вы извлекаете данные с определенными значениями LatitudeIdx и LongitudeIdx, вы фактически получаете все точки, попадающие в ячейку, определенную этими значениями, то есть фильтруете свои точки данных. После этого вы вычисляете расстояния до точки интереса и выбираете ближайшую (вы можете сделать это непосредственно в запросе и отсортировать по расстоянию, чтобы получить нужную точку за один проход).