Datos espaciales en el proveedor de SQLite para EF Core
En esta página se incluye información adicional sobre el uso de datos espaciales con el proveedor de bases de datos SQLite. Para obtener información general sobre el uso de datos espaciales en EF Core, vea la documentación principal de Datos espaciales.
Instalación de SpatiaLite
En Windows, la biblioteca nativa mod_spatialite se distribuye como una dependencia de paquetes NuGet. Otras plataformas deben instalarla por separado. Esto suele hacerse mediante un administrador de paquetes de software. Por ejemplo, puede usar APT en Debian y Ubuntu; y Homebrew en MacOS.
# Debian/Ubuntu
apt-get install libsqlite3-mod-spatialite
# macOS
brew install libspatialite
Desafortunadamente, las versiones más recientes de PROJ (una dependencia de SpatiaLite) no son compatibles con el paquete SQLitePCLRaw predeterminado de EF. Puede solucionar esto usando la biblioteca de SQLite del sistema en su lugar.
<ItemGroup>
<!-- Use bundle_sqlite3 instead with SpatiaLite on macOS and Linux -->
<!--<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.0" />-->
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="3.1.0" />
<PackageReference Include="SQLitePCLRaw.bundle_sqlite3" Version="2.0.4" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.NetTopologySuite" Version="3.1.0" />
</ItemGroup>
En macOS, también necesitará establecer una variable de entorno antes de ejecutar la aplicación para que use la versión de Homebrew de SQLite. En Visual Studio para Mac, puede establecer esto en Proyecto > Opciones del proyecto > Ejecutar > Configuraciones > Predeterminado.
DYLD_LIBRARY_PATH=/usr/local/opt/sqlite/lib
Configuración de un SRID
En SpatiaLite, las columnas deben especificar un SRID por columna. El SRID predeterminado es 0
. Especifique un SRID diferente mediante el método HasSrid.
modelBuilder.Entity<City>().Property(c => c.Location)
.HasSrid(4326);
Nota:
4326 hace referencia a WGS 84, un estándar usado en GPS y otros sistemas geográficos.
Dimensión
La dimensión predeterminada (o las ordenadas) de una columna es X e Y. Para habilitar ordenadas adicionales como Z o M, configure el tipo de columna.
modelBuilder.Entity<City>().Property(c => c.Location)
.HasColumnType("POINTZ");
Asignaciones de funciones espaciales
En esta tabla se muestran los miembros de NetTopologySuite (NTS) traducidos a funciones SQL.
.NET | SQL |
---|---|
geometry.Area | Area(@geometry) |
geometry.AsBinary() | AsBinary(@geometry) |
geometry.AsText() | AsText(@geometry) |
geometry.Boundary | Boundary(@geometry) |
geometry.Buffer(distance) | Buffer(@geometry, @distance) |
geometry.Buffer(distance, quadrantSegments) | Buffer(@geometry, @distance, @quadrantSegments) |
geometry.Centroid | Centroid(@geometry) |
geometry.Contains(g) | Contains(@geometry, @g) |
geometry.ConvexHull() | ConvexHull(@geometry) |
geometry.CoveredBy(g) | CoveredBy(@geometry, @g) |
geometry.Covers(g) | Covers(@geometry, @g) |
geometry.Crosses(g) | Crosses(@geometry, @g) |
geometry.Difference(other) | Difference(@geometry, @other) |
geometry.Dimension | Dimension(@geometry) |
geometry.Disjoint(g) | Disjoint(@geometry, @g) |
geometry.Distance(g) | Distance(@geometry, @g) |
geometry.Envelope | Envelope(@geometry) |
geometry.EqualsTopologically(g) | Equals(@geometry, @g) |
geometry.GeometryType | GeometryType(@geometry) |
geometry.GetGeometryN(n) | GeometryN(@geometry, @n + 1) |
geometry.InteriorPoint | PointOnSurface(@geometry) |
geometry.Intersection(other) | Intersection(@geometry, @other) |
geometry.Intersects(g) | Intersects(@geometry, @g) |
geometry.IsEmpty | IsEmpty(@geometry) |
geometry.IsSimple | IsSimple(@geometry) |
geometry.IsValid | IsValid(@geometry) |
geometry.IsWithinDistance(geom, distance) | Distance(@geometry, @geom)<= @distance |
geometry.Length | GLength(@geometry) |
geometry.NumGeometries | NumGeometries(@geometry) |
geometry.NumPoints | NumPoints(@geometry) |
geometry.OgcGeometryType | CASE GeometryType(@geometry) WHEN 'POINT' THEN 1 ... FIN |
geometry.Overlaps(g) | Overlaps(@geometry, @g) |
geometry.PointOnSurface | PointOnSurface(@geometry) |
geometry.Relate(g, intersectionPattern) | Relate(@geometry, @g, @intersectionPattern) |
geometry.Reverse() | ST_Reverse(@geometry) |
geometry.SRID | SRID(@geometry) |
geometry.SymmetricDifference(other) | SymDifference(@geometry, @other) |
geometry.ToBinary() | AsBinary(@geometry) |
geometry.ToText() | AsText(@geometry) |
geometry.Touches(g) | Touches(@geometry, @g) |
geometry.Union() | UnaryUnion(@geometry) |
geometry.Union(other) | GUnion(@geometry, @other) |
geometry.Within(g) | Within(@geometry, @g) |
geometryCollection[i] | GeometryN(@geometryCollection, @i + 1) |
geometryCollection.Count | NumGeometries(@geometryCollection) |
lineString.Count | NumPoints(@lineString) |
lineString.EndPoint | EndPoint(@lineString) |
lineString.GetPointN(n) | PointN(@lineString, @n + 1) |
lineString.IsClosed | IsClosed(@lineString) |
lineString.IsRing | IsRing(@lineString) |
lineString.StartPoint | StartPoint(@lineString) |
multiLineString.IsClosed | IsClosed(@multiLineString) |
point.M | M(@point) |
point.X | X(@point) |
point.Y | Y(@point) |
point.Z | Z(@point) |
polygon.ExteriorRing | ExteriorRing(@polygon) |
polygon.GetInteriorRingN(n) | InteriorRingN(@polygon, @n + 1) |
polygon.NumInteriorRings | NumInteriorRing(@polygon) |
Funciones de agregado
.NET | SQL | Agregado en |
---|---|---|
GeometryCombiner.Combine(group.Select(x => x.Property)) | Collect(Property) | EF Core 7.0 |
ConvexHull.Create(group.Select(x => x.Property)) | ConvexHull(Collect(Property)) | EF Core 7.0 |
UnaryUnionOp.Union(group.Select(x => x.Property)) | GUnion(Property) | EF Core 7.0 |
EnvelopeCombiner.CombineAsGeometry(group.Select(x => x.Property)) | Extent(Property) | EF Core 7.0 |