2016-12-07 14 views
1

質問1:地域内の場所のデータストアクエリ

私はApp Engine FlexでGoogle Datastore(Javaクライアントライブラリ)を使用しており、場所データを保存しています。私は矩形領域内の場所のリストを照会したいと思います。

現在地エンティティは次のようになります。

Location 
    - lat (eg. -56.1) 
    - long (eg. 45.6) 

私はこのようなGQLを使用して照会することはできませんので、Googleのデータストアが異なる性質上、複数の不平等を照会するための制限があります。

SELECT * FROM Location WHERE lat <= @maxLat AND lat >= @minLat AND long <= @maxLong AND long >= @minLong 

maxLatminLat,maxLongおよびminLongは、場所を検索する境界矩形を表します。

現在、私はただ一つのフィルタ使用して照会しています:

SELECT * FROM Location WHERE lat <= @maxLat AND lat >= @minLat 

を、返された結果から、私は同様に経度の範囲内のものを除外する。この戦略に頼ることなくこれを行うより良い方法はありますか?

質問2:

IをGoogleデータストアにGeopointとして緯度/経度の組み合わせを格納する場合には、どのように緯度と経度を確認することができますか?私はJavaクライアントライブラリを使用してGeopoint内緯度/経度でフィルタリングすることができない

Location 
    - location (Geopoint) 

:場所がこのように格納されている場合、例えば

SELECT * FROM Location WHERE location.long <= @maxLong 

Datastore Geopointプロパティの回避策はありますか?

答えて

1

これを行う方法の例については、Pythonの 'geomodel'ライブラリをご覧ください。

基本前提:値がに含まれていることを「セル」を定義することであり、離散値に

分割あなたの緯度と経度の値(例えば、1度ブロック)、あなたが持っているので、一緒に、次いで/ハッシュ結合。単一の値。

これらのセルに対して等価フィルタを実行することで、境界のある矩形内の位置のクエリを変換することができます。境界のある矩形がセルエッジと完全に並んでいない場合、最後にフィルタをポストします。時間でこれを行うための

関連する例は次のとおりです。Is datastore good for storing hr shifts?

+0

私はこの戦略の意味を理解していません。このようなGQLクエリを書くことはできません。 lat = -90.0〜-89.0、long:-180.0〜-179.0を表すセル0の1度セルを使用します。細胞数は緯度が上がるたびに増加し、緯度が89.0〜90.0に達すると-90.0〜-89.0に戻り、長さは1度上がります。次に、位置(0、0)はセル32,399内にあることで表されます(位置は4つの異なるセルの角です。これはあなたが示唆していることですか?バウンディングボックスが非常に小さなボックスである場合、セルは非常に特異的でなければなりませんか? (0.0001度のブロック) – Kookz

+0

私はこれについて長い間懸命に考えてきましたが、私はまだあなたの解決策を完全には把握していません。少し拡大して、サンプルソリューションを見せてもらえますか?ありがとう! – Kookz

-1

は、データストアのREST APIをチェックしてください。あなたは下のリンクで文書を見つけることができますgeopointsのための明示的な値のタイプがあります:

https://cloud.google.com/datastore/docs/reference/rest/v1/projects/runQuery#Value

はあなたが行う必要がありますすべては、エンティティ上(のジオそれを呼びましょう)geopoint valueプロパティを作成しています

SELECT * FROM Address WHERE geo.latitude <= @maxLat AND geo.latitude >= @minLat