Remarque
L’accès à cette page requiert une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page requiert une autorisation. Vous pouvez essayer de modifier des répertoires.
Cette page inclut des informations supplémentaires sur l’utilisation de données spatiales avec le fournisseur de base de données SQLite. Pour obtenir des informations générales sur l’utilisation de données spatiales dans EF Core, consultez la documentation principale données spatiales.
Installation de SpatiaLite
Sous Windows, la bibliothèque mod_spatialite native est distribuée en tant que dépendance d’un packack NuGet. D’autres plateformes doivent l’installer séparément. Cela est généralement effectué à l’aide d’un gestionnaire de package logiciel. 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 à l’aide de la bibliothèque SQLite système à la place.
Important
N’utilisez pas Microsoft.EntityFrameworkCore.Sqlite ni Microsoft.Data.Sqlite avec SpatiaLite sur macOS et Linux. Les deux packages intègrent SQLitePCLRaw.bundle_e_sqlite3 par défaut, une version groupée de SQLite incompatible avec celle installée par le système. L’utilisation peut entraîner un blocage silencieux au moment de l’exécution. Utilisez Microsoft.EntityFrameworkCore.Sqlite.Core ou Microsoft.Data.Sqlite.Core avec le fournisseur système SQLite comme indiqué ci-dessous.
Notez également que la bibliothèque SQLite installée par le système peut avoir des options de compilation différentes de la version groupée. Cela peut affecter la disponibilité des fonctionnalités telles que les fonctions mathématiques et la recherche en texte intégral. Pour inspecter rapidement les options de votre build SQLite, exécutez PRAGMA compile_options; et recherchez les fonctionnalités sur lesquelles votre application s’appuie.
Remplacez Microsoft.EntityFrameworkCore.Sqlite par Microsoft.EntityFrameworkCore.Sqlite.Core et référencez le paquet SQLitePCLRaw.provider.sqlite3 pour utiliser la bibliothèque système SQLite.
<ItemGroup>
<!-- Use Sqlite.Core with the system SQLite provider instead of Microsoft.EntityFrameworkCore.Sqlite -->
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.Core" Version="10.0.0" />
<PackageReference Include="SQLitePCLRaw.provider.sqlite3" Version="2.1.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite.NetTopologySuite" Version="10.0.0" />
</ItemGroup>
Remarque
À compter d’EF Core 11 (SQLitePCLRaw 3.0), remplacez la SQLitePCLRaw.provider.sqlite3 version par 3.x.x. Voir les incompatibilités pour plus de détails.
Ajoutez ensuite une initialisation explicite avant d’utiliser SQLite :
SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_sqlite3());
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 :
DYLD_LIBRARY_PATH="$(brew --prefix 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 le GPS et d’autres systèmes géographiques.
Dimension
La dimension par défaut (ou ordinates) d’une colonne est X et Y. Pour activer des ordinates supplémentaires comme 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) |
| géométrie. Limite | Limite(@geometry) |
| geometry.Buffer(distance) | Buffer(@geometry, @distance) |
| Géométrie. Buffer(distance, quadrantSegments) | Buffer(@geometry, , @distance@quadrantSegments) |
| géométrie. Centroïde | Centroïde(@geometry) |
| geometry.Contains(g) | Contient(@geometry, @g) |
| geometry.ConvexHull() | ConvexHull(@geometry) |
| geometry.CoveredBy(g) | CoveredBy(@geometry, @g) |
| geometry.Covers(g) | Couvre(@geometry, @g) |
| geometry.Crosses(g) | Croix(@geometry, @g) |
| geometry.Difference(other) | Différence(@geometry, @other) |
| géométrie. Dimension | Dimension(@geometry) |
| geometry.Disjoint(g) | Disjoint(@geometry, @g) |
| géométrie.Distance(g) | Distance(@geometry, @g) |
| geometry.Envelope | Enveloppe(@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(@géométrie, @other) |
| geometry.Intersects(g) | Intersects(@geometry, @g) |
| geometry.IsEmpty | IsEmpty(@geometry) |
| geometry.IsSimple | IsSimple(@geometry) |
| geometry.IsValid | IsValid(@geometry) |
| Géométrie. IsWithinDistance(geom, distance) | Distance(@geometry, @geom)<= @distance |
| géométrie.Longueur | GLength(@geometry) |
| geometry.NumGeometries | NumGeometries(@geometry) |
| geometry.NumPoints | NumPoints(@geometry) |
| geometry.OgcGeometryType | CASE GeometryType(@geometry) WHEN 'POINT' THEN 1 ... FIN CAS |
| geometry.Overlaps(g) | Chevauchements(@geometry, @g) |
| geometry.PointOnSurface | PointOnSurface(@geometry) |
| Géométrie. Relation(g, intersectionPattern) | Relation(@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 | NombreDePoints(@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é dans |
|---|---|---|
| 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)) | Étendue(Propriété) | EF Core 7.0 |