2

我正在应用程序引擎上开发一个应用程序,我将位置信息存储在数据存储区中。我正在尝试获取给定点的指定半径内的所有点(纬度、经度)。类似于 SQL 上的这个StackOverflow问题。我想知道 GQL 是否可以实现相同的目标。(类似于我发现的这篇文章

期待您的建议,

4

2 回答 2

4

不使用 GQL,但您可以使用Search API执行此操作,但这意味着您需要将实体单独索引为可搜索文档,并且成本也更高(数据存储查询为 0.06 美元/10 万美元,而复杂搜索为 0.6 美元/1 万美元查询,所有地理点搜索查询都是)。

编辑在评论中回答问题:在我看来,这个例子确实解决了你的问题:

"distance(survey_marker, geopoint(35.2, 40.5)) < 100"

100with500和坐标替换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)

希望这可以帮助。

于 2013-08-29T12:26:52.507 回答
1

500m太小了!但至少这意味着除非你是极地探险家,否则你可以忽略地球的曲率。在这种情况下,您可能希望将 GeoPt 拆分为两个 FloatProperty 字段,以使“普通”索引更容易进行 - 然后您可以快速进行一组 bpunding-box 查询,lat 大于和 lat 小于,长大于和长小于,以隔离您想要的大多数GeoPts(如果事物通常均匀分布,则为 pi/4 的价值),然后只需自己过滤列表,对每个候选点进行适当的三角学测试。

(我从未尝试过索引 GeoPts,也许您可​​以直接对子字段进行查询)

于 2013-08-31T08:24:43.407 回答