我想在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进行比较。
先谢谢。
答案 0 :(得分:2)
您可以通过生成边界框并将其作为字符串保存在数据存储区对象中来实现,然后附近的所有内容都将具有相同的边界框记录,您只需查找该字符串即可。
此代码: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 )得到相同的答案。所以'附近'记录是那些也包含相同' geobox字符串'作为您当前的记录,或者您当前的查询评估到该地理区域字符串,然后简单的相等搜索将获得附近的那些'记录给你。
该代码还可以通过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']
该项目中的其他代码演示了用法。