Menu Docs
Página inicial do Docs
/ /
Atlas Device SDKs
/ / /

Tipos de dados geoespaciais - .NET SDK

Nesta página

  • Tipos de dados geoespaciais
  • GeoPoint
  • Círculo geográfico
  • GeoBox
  • GeoPolygon
  • Dados persistentes do GeoPoint
  • Criando uma classe compatível com GeoJSON
  • Usando a classe incorporada
  • Executar query de dados geoespaciais

Novidades na versão 11,1,0.

Os dados geoespaciais, ou "geodata", especificam pontos e objetos geométricos na superfície da Terra. Com os tipos de dados geográficos, você pode criar query que verificam se um determinado ponto está contido dentro de uma forma. Por exemplo, você pode encontrar todos os cafés em um raio de 15 km de um ponto especificado.

Alterado na versão 11.6.1: Dados geoespaciais suportados no Atlas Device Sync

O Realm .NET SDK versão 11.16.1 e posterior adiciona suporte para dados geoespaciais no Atlas Device Sync. Isto permite a você assinar queries geoespaciais em um domínio sincronizado. Se você tentar se inscrever em uma query geoespacial com uma versão mais antiga do SDK, receberá um erro de servidor com uma gravação compensatória. Para obter mais informações sobre como gerenciar suas assinaturas de sincronização, consulte Gerenciar assinaturas de Flexible Sync- .NET SDK.

For more information on querying geospatial data with Device Sync, refer to Geospatial Data in the App Services documentation.

O SDK suporta query geoespaciais utilizando os seguintes tipos de dados:

  • GeoPoint

  • Círculo geográfico

  • GeoBox

  • GeoPolygon

O SDK fornece estes tipos de dados geoespaciais para simplificar a query de dados geoespaciais. Você não pode persistir esses tipos de dados diretamente.

Para informações sobre como persistir dados geoespaciais, consulte a seção Persisting Data GeoPoints nesta página.

Um GeoPoint define um local específico na superfície da Terra. Todos os tipos de dados geoespaciais utilizam GeoPoints para definir sua localização.

Observação

Nos métodos que usam um GeoPoint, você pode fornecer alternativamente uma tupla de valores duplos, em que o primeiro duplo é a latitude e o segundo duplo é a longitude. O SDK interpreta essas tuplas como GeoPoints. Os exemplos nesta página demonstram ambas as abordagens.

Um GeoCircle define um círculo na superfície da Terra. Você define um GeoCircle fornecendo um GeoPoint para o centro do círculo e um objeto de distância para especificar o raio do círculo.

Observação

Você pode definir o raio em quilômetros, milhas, graus ou radianos.

O seguinte código mostra dois exemplos de criação de um círculo:

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));
Dois círculos geográficos
clique para ampliar

Uma GeoBox define um retângulo na superfície da Terra. Você define o retângulo especificando o canto inferior esquerdo (sudoeste) e o canto superior direito (nordeste). O exemplo a seguir cria 2 caixas:

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));
2 GeoBoxes
clique para ampliar

Um GeoPolygon define um polígono na superfície da Terra. Como um polígono é uma forma fechada, você deve fornecer um mínimo de 4 pontos: 3 pontos para definir a forma do polígono e um quarto para fechar a forma.

Importante

O quarto ponto em um polígono deve ser igual ao primeiro ponto.

Você também pode excluir áreas dentro de um polígono definindo um ou mais "furos". Um orifício é outro polígono cujos limites se encaixam completamente dentro do polígono externo. O exemplo abaixo cria 3 polígonos: um é um polígono básico com 5 pontos, um é o mesmo polígono com um único orifício e o terceiro é o mesmo polígono com dois orifícios:

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);
3 GeoPolygons
clique para ampliar

Importante

Não é possível persistir tipos de dados geoespaciais

Atualmente, você só pode persistir dados geoespaciais. Os tipos de dados geoespaciais não podem ser persistidos diretamente. Por exemplo, você não pode declarar uma propriedade do tipo GeoBox.

Estes tipos podem ser utilizados somente como argumentos para queries geoespaciais.

Se você deseja persistir GeoPoint os dados do , eles devem estar em conformidade com a especificação GeoJSON.

Para criar uma classe que esteja em conformidade com a especificação GeoJSON, você:

  1. Crie um objeto de domínio incorporado (uma classe que herda de IEmbeddedObject).

  2. No mínimo, adicione os dois campos exigidos pela especificação GeoJSON:

    • Um campo do tipo IList<double> que mapeia para uma propriedade de "coordenadas" (diferencia maiúsculas de minúsculas) no esquema do Realm.

    • Um campo do tipo string que mapeia para uma propriedade "type". O valor deste campo deve ser "Ponto".

O exemplo seguinte mostra uma classe incorporada denominada "CustomGeoPoint" que é utilizada para persistir os dados do GeoPoint:

public partial class CustomGeoPoint : IEmbeddedObject
{
[MapTo("coordinates")]
public IList<double> Coordinates { get; } = null!;
[MapTo("type")]
private string Type { get; set; } = "Point";
public CustomGeoPoint(double latitude, double longitude)
{
Coordinates.Add(longitude);
Coordinates.Add(latitude);
}
}

Em seguida, você usa a classe GeoPoint personalizada em seu modelo de Realm, conforme mostrado no exemplo a seguir:

public partial class Company : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public Guid Id { get; private set; } = Guid.NewGuid();
public CustomGeoPoint? Location { get; set; }
public Company() { }
}

Em seguida, você adiciona instâncias de sua classe ao domínio como qualquer outro modelo 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)
});
});

A imagem a seguir mostra os resultados da criação desses dois objetos de empresa.

2 GeoPoints
clique para ampliar

Para consultar dados geoespaciais, você pode usar o método GeoWithin ou pode usar o operador geoWithin com RQL. O método GeoWithin usa a propriedade "coordenadas" de um objeto embarcado que define o ponto em que estamos consultando e uma das formas geoespaciais para verificar se esse ponto está contido na forma.

Observação

O formato para consultar dados geoespaciais é o mesmo, independentemente da forma da região geoespacial.

O exemplo a seguir mostra a diferença entre fazer query com o método GeoWithin e o RQL:

var GeoWthinExample = realm.All<Company>()
.Where(c => QueryMethods.GeoWithin(c.Location, circle1));
var RQLExample = realm.All<Company>()
.Filter("Location geoWithin $0", circle2);

Os exemplos a seguir mostram a consulta a várias formas para retornar uma lista de empresas dentro da forma:

Círculo geográfico

var companiesInCircle = realm.All<Company>()
.Where(c => QueryMethods.GeoWithin(c.Location, circle1));
var companiesInSmallerCircle = realm.All<Company>()
.Where(c => QueryMethods.GeoWithin(c.Location, circle2));
Consultando um exemplo do GeoCircle.
clique para ampliar

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));
Consultando um exemplo do GeoBox.

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));
Consultando um exemplo do GeoPolygon.
clique para ampliar

Voltar

RealmInteger

Próximo

Objetos embarcados