Ответ на самом деле зависит от многих вещей, поэтому я помогу с основной стратегией. Чтобы разобраться, вам нужно понять, как работает Kademlia (Kademlia - это сеть DHT P2P, которая хранит информацию).
В Kademlia при первом запуске каждый узел выбирает случайный идентификатор, представляющий собой 160-разрядное число, представляющее точку в пространстве всех возможных 160-разрядных идентификаторов.
Идентификатор информации, которая должна быть сохранена, получается с помощью функции SHA-1 (она принимает произвольную строку и выдает 160-битное число, которое обрабатывается как идентификатор информации, которая должна быть сохранена)
После того, как у вас есть идентификатор информации, вы публикуете ее, информация физически сохраняется на узле с идентификатором, близким к идентификатору информации.
(иллюстрация взята из здесь )
Информация запрашивается через ее ID. Как поиск информации, так и поиск узлов требует O (log (N)) прыжков для получения необходимой информации. Метрика «XOR» используется в Kademlia (в вашем случае это может быть обычная евклидова метрика).
Каждый узел поддерживает массив сегментов, каждый блок содержит адреса узлов, которые соответствуют текущему сегменту. Соответствие - это мера того, насколько близки идентификаторы. рассмотрим пример:
0 160
Node 1 ID: 1101000101011111101110101001010...
Node 2 ID: 1101011101011111101110101001010...
Node 3 ID: 1101000101011001101110101001010...
После применения метрики XOR к узлам # 1,2, т. Е. (Вычисляя число, представляющее виртуальное расстояние между этими узлами), мы получаем:
index - 012345678901234
xor - 000001100000000... (the difference is in 5-th msb bit)
order - msb lsb
После применения метрики Xor к узлам # 1,3 мы получаем:
index - 012345678901234
xor - 000000000000011... (the difference is in 13-th msb bit)
order - msb lsb
Очевидно, что Узел 1 ближе к Узлу 3, так как он имеет разницу в менее значимых битах, чем расстояние от Узла 1 до Узла 2. И, следовательно, с точки зрения Узла 1 его соседний Узел 3 переходит на 13-й сегмент (более высокий индекс означает более близкие идентификаторы), и Узел 2 переходит к 5-му сегменту, который содержит группу узлов, которые находятся на расстоянии 5 мкс MSB от текущего идентификатора узла.
Такая структура данных позволяет каждому узлу знать свое окружение на различных 160 уровнях расстояний.
Возвращаясь к вашему примеру, чтобы обеспечить эффективные геопространственные запросы, вам необходимо заменить метрику XOR Kademlias обычной евклидовой метрикой. В этом случае вы будете иметь свои идентификаторы в виде трехмерных или двумерных векторов, и, к сожалению, из-за того, что евклидова метрика приводит к числам с плавающей запятой, которые не подходят непосредственно для этого типа алгоритма, поэтому вам нужно будет преобразовать их в дискретные двоичные числа как-то похоже на то, что делает функция XOR. После этого поиск соседних узлов является тривиальной задачей.
Надеюсь, это поможет. Кстати, посмотрите на HyperDex, новое распределенное хранилище данных с возможностью поиска, тесно связанное с евклидовой метрикой, может помочь ...