在FloatProperty上执行cos / sin时的TypeError

时间:2015-12-03 16:19:03

标签: python python-2.7 google-app-engine google-cloud-datastore app-engine-ndb

我正在使用Android应用程序,该应用程序必须与服务器通信才能在数据库中存储/检索模型。模型有两个参数纬度和经度,即FloatProperty

class Model(ndb.Model):
    latitude = ndb.FloatProperty()
    longitude = ndb.FloatProperty()

现在我有一个请求处理程序,当它收到带有某个标志的GET请求以及经度和纬度参数时,它应该查询数据库以查找某个距离的所有模型。

我做的是

latitude = float(self.request.get('latitude'))
longitude = float(self.request.get('longitude'))
max_fetch = 20
... 
sin_lat = math.sin(latitude)
cos_lat = math.cos(latitude)
R = 6371 * math.pow(10, 3)
max_distance = 1000
around_you = Model.query(math.acos(sin_lat*math.sin(Model.latitude) + 
                                     cos_lat*math.cos(Model.latitude)*math.cos(longitude - Model.longitude)) * 
                                      R <= max_distance).fetch(max_fetch)

但这样做会给我一个

TypeError: a float is required

当我尝试

math.sin(Model.latitude)

有关如何解决此问题的任何提示?

1 个答案:

答案 0 :(得分:0)

数据存储本身不支持任何数学运算。你可以隐藏ComputedProperty中的任何一个(因为它实际上是在你的应用程序的Python代码中使用.put()将数据发送到商店之前计算的),但是不支持外部“参数” - 它必须完全根据实例上的值的属性计算。

因此,ComputedProperty可以是例如math.sin的{​​{1}} - 但是在这里您似乎需要根据“外部参数”FloatProperty和{ {1}}。

相反,在App Engine搜索API中,https://cloud.google.com/appengine/docs/python/search/ - 而不是数据存储区似乎提供了您需要的功能(特别是通过{{1} } type和latitude字段类型。