我正在app引擎上开发一个应用程序,我将位置信息存储在数据存储区中。我正在尝试获取给定点的指定半径内的所有点(纬度,长度)。 与关于SQL的StackOverflow问题类似。我想知道使用GQL是否可以实现相同目的。 (类似于this article I found)
期待您的建议,
答案 0 :(得分:4)
不是使用GQL,但您可以使用Search API执行此操作,但这意味着您需要将实体单独索引为可搜索的文档,并且much more expensive也是{$ 3 / 100k,用于数据存储区查询对于复杂搜索查询的$ 0.6 / 10k,所有地理位置搜索查询都是。)
在评论中编辑回答问题: 在我看来,例如 解决你的问题:
"distance(survey_marker, geopoint(35.2, 40.5)) < 100"
将100
替换为500
,将geopoint(35.2, 40.5)
中的坐标替换为圆圈中心的坐标,将survey_marker
替换为索引的GeoPt属性的名称。
因此,如果您将文档编入索引:
from google.appengine.api import search
query = #something
index = search.Index(name="myIndex")
for entity in query:
my_document = search.Document(
doc_id = entity.key,
fields=[
search.GeoField(name='location', value=search.GeoPoint(entity.point))
])
index.put(document)
您可以这样编写查询:
coords = (lat, long)
query_string = "distance(location, geopoint(%s, %s)) < 500" % (lat, long)
index.search(query.string)
希望这有帮助。
答案 1 :(得分:1)
500米很小!但至少它意味着除非你是极地探险家,否则你可以忽略地球的曲率。在这种情况下,您可能希望将GeoPt拆分为两个FloatProperty字段以使“简单”索引更容易 - 您可以快速设置bpunding-box查询,lat大于和小于,如果事情通常是均匀分布的话,那么将大部分大部分分离出你所希望的GeoPts,那么只需过滤大小,而不是长期,然后自己过滤列表进行适当的三角测量测试每个候选点。
(我从未试过索引GeoPts,也许你可以直接在子字段上进行查询)