読者です 読者をやめる 読者になる 読者になる

Murayama blog.

プログラミングと、その次の話

AndroidでParse入門 - GeoPoints -

元ネタ

こちらを参考にGeoPointsについてまとめます。
https://parse.com/docs/android_guide#geo

前回の記事はこちら。
AndroidでParse入門 - Cloud Functions - - Murayama blog.

GeoPoints

Parseのオブジェクトは緯度・経度といった位置情報をサポートしています。ParseObjectにParseGeoPointを追加することで、指定した位置情報の近くにあるオブジェクトを問い合わせることが可能となります。この仕組みを使う事で、あるユーザの近くにいる人を見つけたり、ある場所の近くにいるユーザを見つけたりといったことが簡単にできるようになります。

ParseGeoPoint

オブジェクトに位置情報を関連づけるにはParseGeoPointを作ります。緯度40.0、経度-30.0を指定するなら次のようになります。

ParseGeoPoint point = new ParseGeoPoint(40.0, -30.0);

この位置情報は、オブジェクトのフィールドに保存できます。

placeObject.put("location", point);

Geo Queries

位置情報を持つオブジェクトを多数用意できたなら、ある地点から最も近いオブジェクトを見つけることができます。これにはParseQueryのwhereNearメソッドを制約として使います。10件の場所のリストを取得する場合は次のようになります。

ParseGeoPoint userLocation = (ParseGeoPoint) userObject.get("location");
ParseQuery<ParseObject> query = ParseQuery.getQuery("PlaceObject");
query.whereNear("location", userLocation);
query.setLimit(10);
query.findInBackground(new FindCallback<ParseObject>() { ... });

useLocationの地点から、距離の近い順でリストオブジェクトが返却されます。ただし、orderByAscending()/orderByDescending()を指定した場合は、距離の順序よりも優先されます。

距離を使って結果を制限したい場合は、whereWithinKilometers、whereWithinMiles、whereWithinRadiansメソッドを使用してください。

特定のエリアに含まれるオブジェクトを問い合わせることもできます。ある矩形の範囲内に含まれるオブジェクトを探したいなら、ParseQueryのwhereWithinGeoBoxメソッドを使います。

ParseGeoPoint southwestOfSF = new ParseGeoPoint(37.708813, -122.526398);
ParseGeoPoint northeastOfSF = new ParseGeoPoint(37.822802, -122.373962);
ParseQuery<ParseObject> query = ParseQuery.getQuery("PizzaPlaceObject");
query.whereWithinGeoBox("location", southwestOfSF, northeastOfSF);
query.findInBackground(new FindCallback<ParseObject>() { ... });

Caveats

いくつか注意事項があります。

  1. 個々のParseObjectクラスには、ParseGeoPointオブジェクトを一つのキーでしか保持できません。
  2. 位置情報は、範囲の上限を超えてはいけません。緯度は-90.0から90.0、経度は180.0から180.0を超えてはいけません。範囲外の値を設定するとエラーとなります。