我想在 GAE 中查询“附近的”数据存储对象。为此,我计划在数据存储实体中索引 ndb.GeoPt 属性。每当查询附近的物体时,我都会简单地找到正方形的四个角点:(lat_min,lon_min),(lat_max,lon_min),(lat_min,lon_max),(lat_max,lon_max) 并比较 ndb.GeoPt 属性看看它是否在这个广场上。这可以使用索引吗?我将如何进行查询以将 ndb.GeoPt 属性与上述 4 个 GeoPt 进行比较。
提前致谢。
我想在 GAE 中查询“附近的”数据存储对象。为此,我计划在数据存储实体中索引 ndb.GeoPt 属性。每当查询附近的物体时,我都会简单地找到正方形的四个角点:(lat_min,lon_min),(lat_max,lon_min),(lat_min,lon_max),(lat_max,lon_max) 并比较 ndb.GeoPt 属性看看它是否在这个广场上。这可以使用索引吗?我将如何进行查询以将 ndb.GeoPt 属性与上述 4 个 GeoPt 进行比较。
提前致谢。
您可以通过生成边界框并将其作为字符串保存在数据存储对象中来做到这一点,然后附近的事物都将具有相同的边界框记录,您只需查找该字符串即可。
此代码: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'
第一个坐标集是边界框的最西/最北角。第二个坐标集是边界框的最东/最南角。
在这些设置(分辨率=2,切片=5)下,对于稍微不同的位置(-122.3953 2 vs -122.3953 3 ),我们得到相同的答案。所以“附近”记录是那些也包含与您当前记录相同的“地理框字符串”的记录,或者您当前的查询评估为该地理框字符串,然后简单的相等搜索将为您获取那些“附近”记录。
该代码还可以通过计算周围的边界框集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']
该项目中的其他代码演示了用法。