Индексирование свойства 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']
Другой код в этом проекте демонстрирует использование.