버전 11.1.0의 새로운 기능
지리 공간적 데이터 또는 '지리 데이터'는 지구 표면의 점과 기하학적 객체를 지정합니다. 지리 데이터 유형을 사용하면 주어진 점이 모양 내에 포함되어 있는지 확인하는 쿼리를 만들 수 있습니다. 예를 들어, 지정된 점에서 15km 이내에 있는 모든 커피숍을 찾을 수 있습니다.
버전 11.6.1에서 변경됨: Atlas Device Sync에서 지원되는 지리 공간적 데이터
Realm .NET SDK 버전 11.16.1 이상은 Atlas Device Sync에서 지리 공간적 데이터에 대한 지원을 추가합니다. 이를 통해 동기화된 영역에서 지리 공간적 쿼리를 구독할 수 있습니다. 이전 버전의 SDK에서 지리 공간적 쿼리를 구독하려고 하면 보정용 쓰기와 함께 서버 오류가 발생합니다. 동기화 구독 관리에 대한 자세한 내용은 managed Flexible Sync - .NET SDK를 참조하세요.
Device Sync 를 사용하여 지리 공간적 데이터를 쿼리하는 방법에 대한 자세한 내용은 App Services 문서에서 지리 공간적 데이터를 참조하세요.
지리 공간적 데이터 유형
SDK는 다음 데이터 유형을 사용하여 지리 공간적 쿼리를 지원합니다.
GeoPoint
GeoCircle
GeoBox
GeoPolygon
SDK는 이러한 지리 공간적 데이터 유형을 제공하여 지리 공간적 데이터 쿼리를 간소화합니다. 이러한 데이터 유형을 직접 유지할 수 는 없습니다 .
지리 공간적 데이터를 유지하는 방법에 대한 자세한 내용은 이 페이지의 GeoPoint 데이터 유지 섹션을 참조하세요.
GeoPoint
GeoPoint 는 지구 표면의 특정 위치를 정의합니다. 모든 지리 공간적 데이터 유형은 GeoPoints 를 사용하여 위치를 정의합니다.
참고
GeoPoint 을 사용하는 메서드에서는 첫 번째 더블이 위도이고 두 번째 더블이 경도인 더블 튜플을 제공할 수도 있습니다. SDK는 이러한 튜플을 GeoPoints 로 해석합니다. 이 페이지의 예제에서는 두 가지 접근 방식을 모두 보여줍니다.
GeoCircle
GeoCircle 은 지구 표면에 원을 정의합니다. 원의 중심에 GeoPoint 를 제공하고 원의 반지름을 지정하는 거리 객체를 제공하여 GeoCircle 를 정의합니다.
참고
반지름은 킬로미터, 마일, 도 또는 라디안 단위로 정의할 수 있습니다.
다음 코드는 원을 만드는 두 가지 예를 보여줍니다.
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 점, 모양을 닫으려면 네 번째 점).
중요
다각형의 네 번째 점은 첫 번째 점과 같아야 합니다.
하나 이상의 "홀"을 정의하여 다각형 내의 영역을 제외할 수도 있습니다. 구멍은 경계가 외부 다각형 내에 완전히 들어가는 또 다른 다각형입니다. 다음 예제에서는 3개의 다각형을 생성합니다: 하나는 점이 5개인 기본 다각형, 하나는 단일 구멍이 있는 동일한 다각형, 세 번째는 두 개의 구멍이 있는 동일한 다각형입니다.
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 객체( IEmbeddedObject 를 상속하는 클래스)를 만듭니다.
최소한 GeoJSON 사양에 필요한 두 개의 필드를 추가합니다.
영역 스키마의 '좌표'(대소문자 구분) 속성에 매핑되는
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); } }
임베디드 클래스 사용
그런 다음 다음 예제와 같이 영역 모델에서 사용자 지정 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) }); });
다음 이미지는 이러한 두 회사 객체를 생성한 결과를 보여줍니다.

지리 공간적 데이터 쿼리
지리 공간적 데이터를 쿼리하려면 GeoWithin 메서드를 사용하거나 geoWithin 연산자를 RQL 과 함께 사용할 수 있습니다. GeoWithin 메서드는 쿼리하려는 점을 정의하는 내장된 객체의 '좌표' 속성과 지리 공간적 도형 중 하나를 사용하여 해당 점이 도형 내에 포함되어 있는지 확인합니다.
참고
지리 공간 데이터를 쿼리하는 형식은 지리 데이터 리전의 형태에 관계없이 동일합니다.
다음 예는 GeoWithin 메서드를 사용한 쿼리와 RealmQL의 차이점을 보여줍니다.
var GeoWthinExample = realm.All<Company>() .Where(c => QueryMethods.GeoWithin(c.Location, circle1)); var RQLExample = realm.All<Company>() .Filter("Location geoWithin $0", circle2);
다음 예제에서는 다양한 셰이프를 쿼리하여 셰이프 내의 회사 목록을 반환하는 방법을 보여 줍니다.
GeoCircle
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));
