0

PythonでGoogleAppEngineにウェブサイトを書いていますが、GPS座標を含む文字列プロパティを持つLocationデータストアエンティティがあります。ユーザーにGPS座標で検索させたいのですが、緯度または経度の+/-10ポイント以内にあるすべての場所を返したいのです。基本的に私がやりたかったのは次のコードですが、GPSをそのように並べ替えることはできません。1つは文字列であるため、2つは同じプロパティであるためです。

  inputlocation = self.request.get("userlocation")

        g = geocoders.Google()
        try:
            place, (lat, lng) = g.geocode(inputlocation)
        except ValueError:
            geocodespot = g.geocode(inputlocation, exactly_one=False)
            place, (lat, lng) = geocodespot[0]
         GPSlocation = "("+str(lat)+", "+str(lng)+")"
         GPSlocation = float(GPSlocation)

         bound = 10
         upper = GPSlocation + bound
         lower = GPSlocation - bound
         left = GPSlocation + bound
         right = GPSlocation - bound

        if GPSlocation:
            locations = db.GqlQuery("select * from Location where GPSlocation>:1 and where GPSlocation>:2 and where GPSlocation <:3 and where GPSlocation <:4 order by created desc limit 20", upper, lower, left, right)
#example GPSlocation in the datastore = "(37.7699298, -93.4469157)"

データストアの設定方法を変更せずに、基本的にこれを行う方法を考えられますか?Latitude用とLongitude用の2つのプロパティを作成せずに、その情報を取得する方法はありますか?

4

2 に答える 2

2

Google GAEには、やりたいことを実行するためのツールがいくつかあるようです。

近接フェッチは必要なもののように見えます

def proximity_fetch(query, center, max_results=10, max_distance=0):
于 2012-10-10T03:58:18.470 に答える
1

おそらく、計算プロパティを追加する必要があります。

https://developers.google.com/appengine/docs/python/ndb/properties#computed

計算されたプロパティ(ComputedProperty)は読み取り専用のプロパティであり、その値はアプリケーションが提供する関数によって他のプロパティ値から計算されます。計算された値は、クエリしてデータストアビューアに表示できるようにデータストアに書き込まれますが、エンティティがデータストアから読み戻されるときに、保存された値は無視されます。むしろ、値が要求されるたびに関数を呼び出すことによって値が再計算されます。

class SomeEntity(ndb.Model):
  name = ndb.StringProperty()
  name_lower = ndb.ComputedProperty(lambda self: self.name.lower())

x = SomeEntity(name='Nick')

したがって、上記のlower()の代わりに、モデル内の新しいLatFloatであるLongFloatを計算して更新する、ある種の関数が必要になります。したがって、データを2つのfloatと1つの文字列として保存できます。これを追加するだけで、既存のデータは影響を受けず、そのデータを読み取ったり検索したりしようとすると、計算されて返されると思います。

于 2012-10-10T10:34:35.557 に答える