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.Model
和 db.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 版本控制