我正在应用程序引擎上开发一个应用程序,我将位置信息存储在数据存储区中。我正在尝试获取给定点的指定半径内的所有点(纬度、经度)。类似于 SQL 上的这个StackOverflow问题。我想知道 GQL 是否可以实现相同的目标。(类似于我发现的这篇文章)
期待您的建议,
我正在应用程序引擎上开发一个应用程序,我将位置信息存储在数据存储区中。我正在尝试获取给定点的指定半径内的所有点(纬度、经度)。类似于 SQL 上的这个StackOverflow问题。我想知道 GQL 是否可以实现相同的目标。(类似于我发现的这篇文章)
期待您的建议,
不使用 GQL,但您可以使用Search API执行此操作,但这意味着您需要将实体单独索引为可搜索文档,并且成本也更高(数据存储查询为 0.06 美元/10 万美元,而复杂搜索为 0.6 美元/1 万美元查询,所有地理点搜索查询都是)。
编辑在评论中回答问题:在我看来,这个例子确实解决了你的问题:
"distance(survey_marker, geopoint(35.2, 40.5)) < 100"
将100
with500
和坐标替换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)
希望这可以帮助。
500m太小了!但至少这意味着除非你是极地探险家,否则你可以忽略地球的曲率。在这种情况下,您可能希望将 GeoPt 拆分为两个 FloatProperty 字段,以使“普通”索引更容易进行 - 然后您可以快速进行一组 bpunding-box 查询,lat 大于和 lat 小于,长大于和长小于,以隔离您想要的大多数GeoPts(如果事物通常均匀分布,则为 pi/4 的价值),然后只需自己过滤列表,对每个候选点进行适当的三角学测试。
(我从未尝试过索引 GeoPts,也许您可以直接对子字段进行查询)