Données spatiales dans le fournisseur SQLite EF Core
Cette page contient des informations supplémentaires sur l'utilisation des données spatiales avec le fournisseur de base de données SQLite. Pour plus d’informations sur l’utilisation de données spatiales dans EF Core, consultez la documentation principale sur les données spatiales.
Installation de SpatiaLite
Sous Windows, la bibliothèque native mod_spatialite est distribuée en tant que dépendance d'un package NuGet. D’autres plateformes doivent l’installer séparément. Cette opération s'effectue généralement à l'aide d'un gestionnaire de package de logiciels. Par exemple, vous pouvez utiliser APT sur Debian et Ubuntu, et Homebrew sur MacOS.
# Debian/Ubuntu
apt-get install libsqlite3-mod-spatialite
# macOS
brew install libspatialite
Malheureusement, les versions plus récentes de PROJ (une dépendance de SpatiaLite) ne sont pas compatibles avec l’offre groupée SQLitePCLRaw par défaut d’EF. Vous pouvez contourner ce problème en utilisant la bibliothèque SQLite du système.
<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>
Sur macOS, vous devez également définir une variable d’environnement avant d’exécuter votre application afin qu’elle utilise la version de Homebrew de SQLite. Dans Visual Studio pour Mac, vous pouvez définir cette option sous Projet > Options de projet > Exécuter > Configurations > Par défaut
DYLD_LIBRARY_PATH=/usr/local/opt/sqlite/lib
Configuration du SRID
Dans SpatiaLite, les colonnes doivent spécifier un SRID par colonne. Le SRID par défaut est 0
. Spécifiez un SRID différent à l’aide de la méthode HasSrid.
modelBuilder.Entity<City>().Property(c => c.Location)
.HasSrid(4326);
Remarque
4326 fait référence à WGS 84, norme utilisée dans les GPS et autres systèmes de localisation.
Dimension
Les dimensions (ou ordonnées) par défaut d'une colonne sont X et Y. Pour activer des ordonnées supplémentaires telles que Z ou M, configurez le type de colonne.
modelBuilder.Entity<City>().Property(c => c.Location)
.HasColumnType("POINTZ");
Mappages de fonctions spatiales
Ce tableau indique quels membres NetTopologySuite (NTS) sont traduits dans les fonctions 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) |
Fonctions d’agrégation
.NET | SQL | Ajouté à |
---|---|---|
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 |