Docs Menu
Docs Home
/ /
Atlas Device SDK
/ / /

地理空間 - Flutter SDK

項目一覧

  • 地理空間データ型
  • 地理的ポイント
  • Geo循環
  • GeoBox
  • 永続的な地理空間データ
  • GeoJSON 互換クラスの作成
  • 埋め込みクラスの使用
  • 地理空間データのクエリ

バージョン 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 型は、永続性ではなくクエリで使用されます。

地理空間データを データベースに保存するには、「 永続的な地理空間データ 」を参照してください。

地理円 は、地球の表面上の円を定義します。次のオプションを提供して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 つの地理的円
クリックして拡大します

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 ジオボックス
クリックして拡大します

重要

地理空間データ型を永続化できません

現在、永続化できるのは地理空間データのみです。 地理空間データ型を直接永続化することはできません。 たとえば、タイプGeoBoxのプロパティを宣言することはできません。

これらの型は、地理空間クエリの引数としてのみ使用できます。

地理空間データを永続化する場合は、 GeoJSON 仕様 に準拠する必要があります 。

GeoJSON 仕様に準拠するクラスを作成するには、次の手順に従います。

  1. 埋め込みオブジェクトを作成します。 埋め込みオブジェクトの詳細については、「 埋め込みオブジェクト 」を参照してください

  2. 少なくとも、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.
@RealmModel(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.
@RealmModel()
class _Company {
@PrimaryKey()
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
クリックして拡大します

地理空間データに対してクエリを実行するには、 RQLとともにgeoWithin演算子を使用できます。 geoWithin演算子は、クエリ対象の点と 地理空間シェイプ の 1 つを定義する埋め込みオブジェクトの「座標」プロパティを受け取り、その点が形状内に含まれているかどうかを確認します。

注意

地理空間データをクエリするための形式は、地理データ リージョンの形状に関係なく同じです。

次の例では、さまざまなシェイプに対するクエリを実行して、そのシェイプ内の会社のリストを返す方法を示しています。

Geo循環

final companiesInSmallCircle =
realm.query<Company>("location geoWithin \$0", [smallCircle]);
final companiesInLargeCircle =
realm.query<Company>("location geoWithin \$0", [largeCircle]);
GeoCIDR の例をクエリします。
クリックして拡大します

GeoBox

final companiesInLargeBox =
realm.query<Company>("location geoWithin \$0", [largeBox]);
final companiesInSmallBox =
realm.query<Company>("location geoWithin \$0", [smallBox]);
GeoBox の例のクエリ。

戻る

Realm オブジェクト スキーマの更新