Docs Menu
Docs Home
/ /
Datos del modelo

Geoespacial - SDK de Flutter

Nuevo en la versión 1.6.0.

Los datos geoespaciales, o "geodatos", especifican puntos y objetos geométricos en la superficie terrestre. Con los tipos de geodatos, se pueden crear consultas que comprueban si un punto dado está contenido dentro de una forma. Por ejemplo, se pueden encontrar todas las cafeterías en un radio de 15 km de un punto específico.

El SDK de Flutter v1.6.1 y versiones posteriores incorporan compatibilidad con datos geoespaciales en Atlas Device Sync. Esto permite suscribirse a consultas geoespaciales en una base de datos sincronizada. Si intenta suscribirse a una consulta geoespacial con una versión anterior del SDK, recibirá un error de servidor con una escritura compensatoria. Para obtener más información sobre cómo administrar sus suscripciones de sincronización, consulte "Administrar suscripciones de sincronización - SDK de Flutter".

Para obtener más información sobre cómo consultar datos geoespaciales con Device Sync, consulte Datos geoespaciales en la documentación de App Services.

El SDK de Flutter admite consultas geoespaciales utilizando los siguientes tipos de datos:

  • GeoPoint

  • GeoCircle

  • GeoBox

El SDK proporciona estos tipos de datos geoespaciales para simplificar la consulta de datos geoespaciales.No es posible conservar estos tipos de datos directamente.

Para obtener información sobre cómo conservar datos geoespaciales, consulte la sección Conservar datos geoespaciales en esta página.

Un GeoPointDefine una ubicación específica en la superficie terrestre. Todos los tipos de datos geoespaciales utilizan GeoPoints para definir su ubicación.

Un GeoPoint es un objeto con dos propiedades obligatorias:

  • lat: un valor double

  • lon: un valor double

Un GeoPoint se utiliza únicamente como componente básico de las otras formas: GeoCircle y GeoBox. Estas formas, y el tipo GeoPoint, se utilizan en consultas, no para persistencia.

Para guardar datos geoespaciales en la base de datos, consulte Persistir datos geoespaciales.

Un GeoCírculo define un círculo en la superficie terrestre. Se define un GeoCircle proporcionando:

  • Un GeoPoint para el centro del círculo

  • A GeoDistance para la distancia (radio) del círculo

La distancia radial utiliza radianes como unidad de medida, implementados como un doble en el SDK. El SDK proporciona métodos prácticos para crear un GeoDistance a partir de otras unidades de medida:

El siguiente código muestra dos ejemplos de creación de un círculo:

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);
Dos GeoCírculos
haga clic para ampliar

Un GeoBox define un rectángulo en la superficie terrestre. Se define el rectángulo especificando la esquina inferior izquierda (suroeste) y la esquina superior derecha (noreste).

El siguiente ejemplo crea 2 cajas:

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 GeoBoxes
haga clic para ampliar

Importante

No se pueden conservar los tipos de datos geoespaciales

Actualmente, solo se pueden conservar datos geoespaciales. Los tipos de datos geoespaciales no se pueden conservar directamente. Por ejemplo, no se puede declarar una propiedad de GeoBox tipo.

Estos tipos solo pueden utilizarse como argumentos para consultas geoespaciales.

Si desea conservar datos geoespaciales, deben cumplir con la especificación GeoJSON.

Para crear una clase que se ajuste a la especificación GeoJSON, debes:

  1. Cree un objeto incrustado. Para obtener más información sobre objetos incrustados, consulte Objetos incrustados.

  2. Como mínimo, agregue los dos campos requeridos por la especificación GeoJSON:

    • Un campo de tipo double[] que se asigna a una propiedad "coordenadas" (sensible a mayúsculas y minúsculas) en el esquema.

    • Un campo de tipo string que se asigna a una propiedad "tipo". El valor de este campo debe ser "punto".

El siguiente ejemplo muestra una clase incorporada denominada MyGeoPoint que se utiliza para conservar datos geoespaciales:

// 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);
}

Luego, utiliza la clase personalizada MyGeoPoint en tu modelo de datos, como se muestra en el siguiente ejemplo:

// Use the GeoJSON-compatible class as a property in your model.
@RealmModel()
class _Company {
@PrimaryKey()
late ObjectId id;
_MyGeoPoint? location;
}

Añade instancias de tu clase a la base de datos como cualquier otro modelo.

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]),
)
]);
});

La siguiente imagen muestra los resultados de la creación de estos dos objetos de empresa.

2 GeoPuntos
haga clic para ampliar

Para consultar datos geoespaciales, puede usar el geoWithin operador con RQL. El geoWithin operador toma la propiedad "coordenadas" de un objeto incrustado que define el punto consultado y una de las formas geoespaciales para comprobar si dicho punto está contenido en la forma.

Nota

El formato para consultar datos geoespaciales es el mismo, independientemente de la forma de la región de geodatos.

Los siguientes ejemplos muestran una consulta sobre varias formas para devolver una lista de empresas dentro de la forma:

GeoCírculo

final companiesInSmallCircle =
realm.query<Company>("location geoWithin \$0", [smallCircle]);
final companiesInLargeCircle =
realm.query<Company>("location geoWithin \$0", [largeCircle]);
Consulta de un ejemplo de GeoCircle.
haga clic para ampliar

GeoBox

final companiesInLargeBox =
realm.query<Company>("location geoWithin \$0", [largeBox]);
final companiesInSmallBox =
realm.query<Company>("location geoWithin \$0", [smallBox]);
Ejemplo de consulta con GeoBox.

Volver

Actualizar un esquema de objeto de reino

En esta página