Google App Engine 中的 GeoModel 使用

Posted

技术标签:

【中文标题】Google App Engine 中的 GeoModel 使用【英文标题】:GeoModel Usage in Google App Engine 【发布时间】:2012-10-12 06:29:12 【问题描述】:

我正在尝试使用 Google App Engine 的 GeoModel 类进行邻近获取。我想使用它的实体是 ndb,我不确定我需要下载和导入什么,以及我可以在我的 python 代码中从谷歌导入什么。这些网站似乎有点过时,我想知道是否有人有更多相关信息。这是我到目前为止所拥有的,它告诉我 Location 没有属性proximity_fetch,我知道,但我不确定我应该如何在 Location(ndb.Model) 类中定义它。

        g = geocoders.Google()

        place, (lat, lng) = g.geocode(inputlocation, exactly_one=False)


        bound = 20
        upper = lat + bound
        lower = lat - bound
        left = lng + bound
        right = lng - bound

        locations = []

        if lat and lng:
            locations = Location.proximity_fetch(
                                                 Location.query(),
                                                 geotypes.Point(lat, lng),
                                                 max_results=50,
                                                 max_distance=500000) 

此外,当我尝试导入似乎对此非常重要的地理模型和地理类型时,它给了我一个导入错误,我不知道从哪里得到它们。

任何帮助或示例将不胜感激!

【问题讨论】:

【参考方案1】:

您应该首先从 SVN 存储库中签出最新的代码。你可以在http://code.google.com/p/geomodel/source/checkout找到相关信息

在您的机器上本地获得代码后,在主目录内有一个名为geo 的目录。您应该将此目录复制到您的 GAE 项目中。然后在你的代码中,你从这个包中导入你需要的东西。例如:

from geo import geomodel

现在,关于您的Location 模型,为了能够执行proximity_fetch 查询,您的模型应该扩展名为GeoModel 的geomodel 中提供的模型。因此,你应该有这样的东西:

class Location(ndb.Model, GeoModel):
....

请注意,GeoModel 当前使用“旧”GAE 数据存储层 db,而不是您在代码中使用的 ndb。不过,这应该不会造成任何麻烦。

有关如何使用 geomodel 的更多信息,您还应该查看从 SVN 获得的代码中也存在的演示。您可以在 demos 目录中找到它们。

希望这会有所帮助!

【讨论】:

是的,我已经完成了所有这些,当我尝试执行 Location(ndb.Model, GeoModel) 时,我得到:元类冲突:派生类的元类必须是其所有基础谷歌应用引擎的元类 你是对的,原因是GeoModel已经继承自db.Model。因此,您的模型间接继承自 ndb.Modeldb.Model。这种情况有两种解决方案。 1) 修改您的模型以仅使用db.Model。在这种情况下,您只需从GeoModel 继承,即class Location(GeoModel)。 2) 另一种解决方案是将GeoModel 功能嵌入到您的类中,并将其修改为使用ndb 模型和函数。您最终会选择什么取决于您的具体需求。 把GeoModel改成ndb不应该比较容易吗?这就是我所做的,但我仍然遇到相同的元类冲突错误【参考方案2】:
from geo import geotypes

他们做了一个完整的例子,可以在这里找到:http://code.google.com/p/geomodel/source/browse/trunk/demos/pubschools/handlers/service.py http://code.google.com/p/geomodel/source/browse/#svn/trunk/demos/pubschools

results = PublicSchool.proximity_fetch(
        base_query,
        center, max_results=max_results, max_distance=max_distance)

【讨论】:

好的,当我下载并导入它时,它可以工作,但你知道如何让proximity_fetch工作吗?

以上是关于Google App Engine 中的 GeoModel 使用的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS 中的 Google App Engine 日志记录

Google App Engine 中的 Django 模板语法错误

数据存储区中的 Google App Engine 版本控制

Google App Engine 中的 GeoModel 使用

Google App Engine 中的漂亮网址

将参数传递给 app.yaml Google App Engine 中的 php