Индексирование свойства ndb.GeoPt в Google App Engine

Я хочу запросить "близлежащие" объекты хранилища данных в GAE. Для этого я планировал проиндексировать свойство ndb.GeoPt в сущностях хранилища данных. И всякий раз, когда делается запрос для соседних объектов, я просто найду четыре угловые точки квадрата: (lat_min,lon_min),(lat_max,lon_min),(lat_min,lon_max),(lat_max,lon_max) и сравнение свойства ndb.GeoPt чтобы найти, если он лежит на этой площади. Возможно ли это с помощью индексации? Как я сделаю запрос, чтобы сравнить свойство ndb.GeoPt с вышеуказанными 4 GeoPts.

Заранее спасибо.

1 ответ

Вы можете сделать это, сгенерировав ограничивающую рамку и сохранив ее в своем объекте хранилища данных в виде строки, тогда все объекты, расположенные поблизости, будут иметь одинаковую запись ограничивающей рамки, и вы можете просто найти эту строку.

Этот код: GeoBox

Можно использовать так:

In [0]: compute("36.752", "-122.39532", 2, 5)
Out[1]: '36.80|-122.40|36.75|-122.35'

In [2]: compute("36.752", "-122.39533", 2, 5)
Out[3]: '36.80|-122.40|36.75|-122.35'

Первый набор координат - это западный / северный угол ограничительной рамки. Второй набор координат - это восточный / самый южный угол ограничительной рамки.

Мы получаем тот же ответ для немного другой позиции (-122,3953 2 против -122,3953 3) при этих настройках (разрешение =2, срез =5). Таким образом, "близлежащие" записи - это те, которые также содержат ту же "строку геобокса", что и ваша текущая запись, или ваш текущий запрос оценивается по этой строке геобокса, и простой поиск на равенство затем получит эти "близлежащие" записи для вас.

Этот код также может вычислять множество окружающих ограничивающих прямоугольников с помощью compute_set,

In [4]: compute_set("37.78452", "-122.39532", 6, 25)
Out[5]: 
['37.784500|-122.395350|37.784475|-122.395325',
 '37.784500|-122.395325|37.784475|-122.395300',
 '37.784500|-122.395300|37.784475|-122.395275',
 '37.784525|-122.395350|37.784500|-122.395325',
 '37.784525|-122.395325|37.784500|-122.395300',
 '37.784525|-122.395300|37.784500|-122.395275',
 '37.784550|-122.395350|37.784525|-122.395325',
 '37.784550|-122.395325|37.784525|-122.395300',
 '37.784550|-122.395300|37.784525|-122.395275']

Другой код в этом проекте демонстрирует использование.

Другие вопросы по тегам