バージョン 11.1.0 の新機能。
地理空間データ(「geodata」)では、地表の点と幾何学的オブジェクトを指定します。 地理データ タイプを使用すると、特定の点が形状内に含まれているかどうかを確認するクエリを作成できます。 For example, you can find all coffee shops within 15 km of a specified point.
バージョン 11.6.1 での変更: Atlas Device Sync でサポートされている地理空間データ
Realm .NET SDK バージョン 11.16.1 以降では、Atlas Device Sync の地理空間データのサポートが追加されています。 これにより、同期された Realm で地理空間クエリをサブスクライブできます。 古いバージョンの SDK で地理空間クエリをサブスクライブしようとすると、書き込み補正によるサーバー エラーが発生します。 同期サブスクリプションの管理の詳細については、「 Flexible Sync サブスクリプションの管理 - .NET SDK 」を参照してください。
Device Sync を使用して地理空間データをクエリする方法の詳細については、App Services ドキュメントの「 地理空間データ」を参照してください。
地理空間データ型
SDK は、次のデータ型を使用する地理空間クエリをサポートしています。
地理的ポイント
Geo循環
GeoBox
GeoPolygon
SDK はこれらの地理空間データ型を提供し、地理空間データのクエリを簡素化します。 これらのデータ型を直接永続化することはできません。
地理空間データを永続化する方法の詳細については、このページの「 GeoPoint データの永続化 」セクションを参照してください。
地理的ポイント
GeoPointは、地上の特定のロケーションを定義します。 すべての地理空間データ型は、ロケーションを定義するために GeoPointsを使用します。
注意
GeoPointを受け取るメソッドでは、代わりに double のペアを提供できます。最初の double は緯度、2 番目の double は経度です。 SDK はこれらのタプルをGeoPointsとして解釈します。 このページの例は、両方のアプローチを示しています。
Geo循環
Georoundは、地球の表面上の円を定義します。 円の中心にGeoPointを指定し、円の半径を指定するために距離オブジェクトを指定してGeoCircleを定義します。
注意
半径は、キロ、マイル、度、またはラジアンで定義できます。
次のコードには、円の作成に関する 2 つの例が示されています。
var circle1 = new GeoCircle((47.8, -122.6), Distance.FromKilometers(44.4)); var circle2 = new GeoCircle( new GeoPoint(latitude: 47.3, longitude: -121.9), Distance.FromDegrees(0.25));

GeoBox
GeoBoxは、地球の表面上の直角形を定義します。 左下(水平方向)の隅と右上(直列方向)の隅を指定して、直角形を定義します。 次の例では、 2ボックスを作成しています。
var box1 = new GeoBox(bottomLeftCorner: (47.3, -122.7), topRightCorner: (48.1, -122.1)); var box2 = new GeoBox(new GeoPoint(47.5, -122.4), new GeoPoint(47.9, -121.8));

GeoPolygon
GeoPolygonは、地球の表面上の多角形を定義します。 多角形は閉じた形状であるため、少なくとも4ポイント、多角形の形状を定義するには3ポイント、および形状を閉じるには 4 つ目の値が必要です。
重要
多角形内の 4 番目の点は最初の点と同じである必要があります。
1 つ以上の「穴」を定義して、多角形内の領域を除外することもできます。 穴は、境界が外側の多角形内に完全に収まる別の多角形です。 次の例では、3 つの多角形を作成します。1 つは 5 つのポイントを持つ基本的な多角形で、1 つは 1 つの穴がある同じ多角形で、3 つ目は 2 つの穴がある同じ多角形です。
var basicPolygon = new GeoPolygon((48, -122.8), (48.2, -121.8), (47.6, -121.6), (47.0, -122.0), (47.2, -122.6), (48, -122.8)); // Create a polygon with a single hole var outerRing = new GeoPoint[] { (48, -122.8), (48.2, -121.8), (47.6, -121.6), (47.0, -122.0), (47.2, -122.6), (48, -122.8) }; var hole1 = new GeoPoint[] { (47.8, -122.6), (47.7, -122.2), (47.4, -122.6), (47.6, -122.5), (47.8, -122.6) }; var polygonWithOneHole = new GeoPolygon(outerRing, hole1); // Add a second hole to the polygon var hole2 = new GeoPoint[] { (47.55, -122.05), (47.5, -121.9),(47.3, -122.1), (47.55, -122.05) }; var polygonWithTwoHoles = new GeoPolygon(outerRing, hole1, hole2);

GeoPoint データの永続化
重要
地理空間データ型を永続化できません
現在、永続化できるのは地理空間データのみです。 地理空間データ型を直接永続化することはできません。 たとえば、タイプGeoBoxのプロパティを宣言することはできません。
これらの型は、地理空間クエリの引数としてのみ使用できます。
GeoPointデータを永続化する場合は、GeoJSON 仕様 に準拠する必要があります。
GeoJSON 互換クラスの作成
GeoJSON 仕様に準拠するクラスを作成するには、次の手順に従います。
埋め込みRealmオブジェクト( I埋め込みObject から継承するクラス)を作成します。
少なくとも、GeoJSON 仕様に必要な 2 つのフィールドを追加します。
Realm スキーマ内の「座標」(大文字と小文字を区別する)プロパティにマッピングする
IList<double>タイプのフィールド。「type」プロパティにマッピングする
stringのフィールド。 このフィールドの値は「Point」である必要があります。
次の例は、GeoPoint データを永続化するために使用される「CustomGeoPoint」という名前の埋め込みクラスを示しています。
public partial class CustomGeoPoint : IEmbeddedObject { [] public IList<double> Coordinates { get; } = null!; [] private string Type { get; set; } = "Point"; public CustomGeoPoint(double latitude, double longitude) { Coordinates.Add(longitude); Coordinates.Add(latitude); } }
埋め込みクラスの使用
次に、次の例に示すように、Realm モデルでカスタム GeoPoint クラスを使用します。
public partial class Company : IRealmObject { [] [] public Guid Id { get; private set; } = Guid.NewGuid(); public CustomGeoPoint? Location { get; set; } public Company() { } }
次に、他の Realm モデルと同様に、クラスのインスタンスを Realm に追加します。
realm.WriteAsync(() => { realm.Add(new Company { Location = new CustomGeoPoint(47.68, -122.35) }); realm.Add(new Company { Location = new CustomGeoPoint(47.9, -121.85) }); });
次の画像は、これら 2 つの会社オブジェクトを作成した結果を示しています。

地理空間データのクエリ
地理空間データに対してクエリを実行するには、 GeoWithinメソッドを使用するか、 RQLとともにgeoWithin演算子を使用できます。 GeoWithinメソッドは、クエリ対象の点を定義する埋め込みオブジェクトの「座標」プロパティと、その点が形状内に含まれているかどうかを確認する地理空間シェイプの 1 つを受け取ります。
注意
地理空間データをクエリするための形式は、地理データ リージョンの形状に関係なく同じです。
次の例えは、 GeoWithinメソッドと RQL を使用したクエリの違いを示しています。
var GeoWthinExample = realm.All<Company>() .Where(c => QueryMethods.GeoWithin(c.Location, circle1)); var RQLExample = realm.All<Company>() .Filter("Location geoWithin $0", circle2);
次の例では、さまざまなシェイプに対するクエリを実行して、そのシェイプ内の会社のリストを返す方法を示しています。
Geo循環
var companiesInCircle = realm.All<Company>() .Where(c => QueryMethods.GeoWithin(c.Location, circle1)); var companiesInSmallerCircle = realm.All<Company>() .Where(c => QueryMethods.GeoWithin(c.Location, circle2));

GeoBox
var companiesInBox1 = realm.All<Company>() .Where(c => QueryMethods.GeoWithin(c.Location, box1)); var companiesInBox2 = realm.All<Company>() .Where(c => QueryMethods.GeoWithin(c.Location, box2));

GeoPolygon
var companiesInBasicPolygon = realm.All<Company>() .Where(c => QueryMethods .GeoWithin(c.Location, basicPolygon)); var companiesInPolygon = realm.All<Company>() .Where(c => QueryMethods .GeoWithin(c.Location, polygonWithTwoHoles));
