Поскольку ваша задача состоит только из двух измерений, мы можем использовать двоичное дерево. Где каждый лист может иметь максимум «N» точек (широта, долгота - это точка). Только узлы листа будут иметь точки.
Тип данных точки
class Point
{
float Latitude;
float Longitude;
string Description;
}
Тип данных внутреннего узла (NonLeaf Node)
class Node
{
Float MaxLatitude;
Float MinLatitude;
Float MaxLongitude;
Float MinLongitude;
}
Тип данных листового узла
class LeafNode
{
Point points[K]; // Array of points
}
Генерируйте двоичное дерево динамически и делите узел, когда вставляете больше точек. Если высота узла даже тогда, то делите его на широту, а делите на долготу.
При поиске входной точки найдите соответствующий листовой узел, и все точки в этом листовом узле будут ближайшими к входной точке.
Это популярная проблема - http://en.wikipedia.org/wiki/Nearest_neighbor_search#Approximate_nearest_neighbor