вообще, для индексации точек на плоскости используют
quad-tree, то есть иерархию квадратных тайлов
индекс, по которому нужно сортировать список точек, можно вычислять так:
определим квадрат, в который вписана вся наша карта (вычислим координаты его краев)
старший бит индекса будет показывать, в левую либо правую половину квадрата попала наша точка
следующий бит - в верхнюю или нижнюю половину квадрата
следующий бит - в левую либо правую половину той половины, которую показывает старший бит
следующий бит - в верхнюю или нижнюю половину той половины... и т.д.
практически это сделать лучше так:
выразить 2 координаты точки целыми 32-битными числами
свести 2 этих 32-битных числа в одно 64-битное, чередуя их биты (старшие биты двух 32-битных станут двумя старшими битами 64-битного и т.д.)
(может хватить двух 16-битных координат, сведенных в одно 32-битное индексное число)
имейте в виду, что ваш BoundingBox может попасть во все 4 самых больших квадранта (тайла) -
если в него попадает центр карты
в общем, искомые точки будут кучковаться в 4 разных местах отсортированного списка