地理空間 - Flutter SDK
バージョン 1.6.0 の新機能。
地理空間データ(「geodata」)では、地表の点と幾何学的オブジェクトを指定します。 地理データ タイプを使用すると、特定の点が形状内に含まれているかどうかを確認するクエリを作成できます。 たとえば、指定した点から15以内にあるすべてのレストランを検索できます。
Flutter SDK v 1.6.1以降では、Atlas Device Sync の地理空間データのサポートが追加されます。 これにより、同期されたデータベースで地理空間クエリをサブスクライブできます。 古いバージョンの SDK で地理空間クエリをサブスクライブしようとすると、書き込み補正によるサーバー エラーが発生します。 同期サブスクリプションの管理の詳細については、「 同期サブスクリプションの管理 - Flutter SDK 」を参照してください。
Device Sync を使用して地理空間データをクエリする方法の詳細については、App Services ドキュメントの「 地理空間データ」を参照してください。
地理空間データ型
Flutter SDK は、次のデータ型を使用する地理空間クエリをサポートしています。
GeoPoint
GeoCircle
GeoBox
SDK はこれらの地理空間データ型を提供し、地理空間データのクエリを簡素化します。 これらのデータ型を直接永続化することはできません。
地理空間データを永続化する方法の詳細については、このページの「 永続的な地理空間データ」セクションを参照してください。
地理的ポイント
GeoPoint は、地表の特定の場所を定義します。すべての地理空間データ型は、GeoPoints
を使用してロケーションを定義します。
GeoPoint
は、2 つの必須プロパティを持つオブジェクトです。
lat
: double 値lon
: double 値
GeoPoint は、他の形状(Geo Edition と GeoBox )のビルド ブロックとしてのみ使用されます。 これらのシェイプと GeoPoint 型は、永続性ではなくクエリで使用されます。
地理空間データを データベースに保存するには、「 永続的な地理空間データ 」を参照してください。
Geo循環
地理円 は、地球の表面上の円を定義します。次のオプションを提供してGeoCircle
を定義します。
円の中心の
GeoPoint
円の距離(半径)が
GeoDistance
半径距離は測定単位としてラジアンを使用し、SDK に double として実装されます。 SDK には、他の測定単位からGeoDistance
を作成する便利なメソッドが用意されています。
次のコードには、円の作成に関する 2 つの例が示されています。
final smallCircle = GeoCircle(GeoPoint(lon: -121.9, lat: 47.3), 0.25.degrees); final largeCircleCenter = GeoPoint(lon: -122.6, lat: 47.8); // The SDK provides convenience methods to convert measurements to radians. final radiusFromKm = GeoDistance.fromKilometers(44.4); final largeCircle = GeoCircle(largeCircleCenter, radiusFromKm);
![2 つの地理的円](/ja-jp/docs/atlas/device-sdks/static/9e9b060713c414d5d84e33ee50767603/6a29e/geocircles.webp)
GeoBox
GeoBox は、地球の表面上の直角形を定義します。左下(水平方向)の隅と右上(直列方向)の隅を指定して、直角形を定義します。
次の例では、 2ボックスを作成しています。
final largeBox = GeoBox( GeoPoint(lon: -122.7, lat: 47.3), GeoPoint(lon: -122.1, lat: 48.1)); final smallBoxSouthWest = GeoPoint(lon: -122.4, lat: 47.5); final smallBoxNorthEast = GeoPoint(lon: -121.8, lat: 47.9); final smallBox = GeoBox(smallBoxSouthWest, smallBoxNorthEast);
![2 ジオボックス](/ja-jp/docs/atlas/device-sdks/static/e652ed3c490f1d68ab1993aa8e5b75f7/96cd5/geoboxes.webp)
永続的な地理空間データ
重要
地理空間データ型を永続化できません
現在、永続化できるのは地理空間データのみです。 地理空間データ型を直接永続化することはできません。 たとえば、タイプGeoBox
のプロパティを宣言することはできません。
これらの型は、地理空間クエリの引数としてのみ使用できます。
地理空間データを永続化する場合は、 GeoJSON 仕様 に準拠する必要があります 。
GeoJSON 互換クラスの作成
GeoJSON 仕様に準拠するクラスを作成するには、次の手順に従います。
埋め込みオブジェクトを作成します。 埋め込みオブジェクトの詳細については、「 埋め込みオブジェクト 」を参照してください。
少なくとも、GeoJSON 仕様に必要な 2 つのフィールドを追加します。
スキーマ内の「座標」(大文字と小文字を区別する)プロパティにマッピングする
double[]
タイプのフィールド。「type」プロパティにマッピングする
string
のフィールド。 このフィールドの値は「Point」である必要があります。
次の例では、地理空間データを保持するために使用されるMyGeoPoint
という名前の埋め込みクラスを示しています。
// To store geospatial data, create an embedded object with this structure. // Name it whatever is most convenient for your application. (ObjectType.embeddedObject)class _MyGeoPoint { // These two properties are required to persist geo data. final String type = 'Point'; final List<double> coordinates = const []; // You can optionally implement convenience methods to simplify // creating and working with geospatial data. double get lon => coordinates[0]; set lon(double value) => coordinates[0] = value; double get lat => coordinates[1]; set lat(double value) => coordinates[1] = value; GeoPoint toGeoPoint() => GeoPoint(lon: lon, lat: lat); }
埋め込みクラスの使用
次に、次の例に示すように、データモデルでカスタムMyGeoPoint
クラスを使用します。
// Use the GeoJSON-compatible class as a property in your model. ()class _Company { () late ObjectId id; _MyGeoPoint? location; }
クラスのインスタンスは、他のモデルと同様に データベースに追加します。
final realm = Realm(Configuration.local([MyGeoPoint.schema, Company.schema])); realm.write(() { realm.addAll([ Company( firstCompanyID, location: MyGeoPoint(coordinates: [-122.35, 47.68]), ), Company( secondCompanyID, location: MyGeoPoint(coordinates: [-121.85, 47.9]), ) ]); });
次の画像は、これら 2 つの会社オブジェクトを作成した結果を示しています。
![2 GeoPoints](/ja-jp/docs/atlas/device-sdks/static/e2a34c0b13221325b3e2fb2f47aa3c32/20f8c/geopoints.webp)
地理空間データのクエリ
地理空間データに対してクエリを実行するには、 RQLとともにgeoWithin
演算子を使用できます。 geoWithin
演算子は、クエリ対象の点と 地理空間シェイプ の 1 つを定義する埋め込みオブジェクトの「座標」プロパティを受け取り、その点が形状内に含まれているかどうかを確認します。
注意
地理空間データをクエリするための形式は、地理データ リージョンの形状に関係なく同じです。
次の例では、さまざまなシェイプに対するクエリを実行して、そのシェイプ内の会社のリストを返す方法を示しています。
Geo循環
final companiesInSmallCircle = realm.query<Company>("location geoWithin \$0", [smallCircle]); final companiesInLargeCircle = realm.query<Company>("location geoWithin \$0", [largeCircle]);
![GeoCIDR の例をクエリします。](/ja-jp/docs/atlas/device-sdks/static/0772d990be80943a5011e513eccbd29b/f0d7d/geocircles-query.webp)
GeoBox
final companiesInLargeBox = realm.query<Company>("location geoWithin \$0", [largeBox]); final companiesInSmallBox = realm.query<Company>("location geoWithin \$0", [smallBox]);
![GeoBox の例のクエリ。](/ja-jp/docs/atlas/device-sdks/static/397984610ac368234fc01ef0cb10bb4f/30f62/geoboxes-query.webp)