Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Diese Seite enthält zusätzliche Informationen zur Verwendung von räumlichen Daten mit dem SQLite-Datenbankanbieter. Allgemeine Informationen zur Verwendung von räumlichen Daten in EF Core finden Sie in der Hauptdokumentation Spatial Data.For general information about using spatial data in EF Core, see the main Spatial Data documentation.
Installieren von SpatiaLite
Unter Windows wird die native mod_spatialite-Bibliothek als NuGet-Paketabhängigkeit verteilt. Andere Plattformen müssen sie separat installieren. Dies erfolgt in der Regel mithilfe eines Softwarepaket-Managers. Beispielsweise können Sie APT auf Debian und Ubuntu verwenden; und Homebrew unter MacOS.
# Debian/Ubuntu
apt-get install libsqlite3-mod-spatialite
# macOS
brew install libspatialite
Leider sind neuere Versionen von PROJ (eine Abhängigkeit von SpatiaLite) nicht mit dem Standardmäßigen SQLitePCLRaw-Bundlevon EF kompatibel. Sie können dies umgehen, indem Sie stattdessen die System SQLite-Bibliothek verwenden.
Von Bedeutung
Verwenden Sie Microsoft.EntityFrameworkCore.Sqlite oder Microsoft.Data.Sqlite nicht mit SpatiaLite unter macOS und Linux. Beide Pakete binden standardmäßig SQLitePCLRaw.bundle_e_sqlite3 ein – eine gebündelte Version von SQLite, die nicht mit dem systemweit installierten SQLite kompatibel ist. Die Verwendung kann zu einem leisen Absturz zur Laufzeit führen. Verwenden Sie entweder Microsoft.EntityFrameworkCore.Sqlite.Core oder Microsoft.Data.Sqlite.Core zusammen mit dem System-SQLite-Anbieter, wie unten gezeigt.
Beachten Sie außerdem, dass die vom System installierte SQLite-Bibliothek möglicherweise andere Kompilierungsoptionen als die gebündelte Version aufweist. Dies kann sich auf die Verfügbarkeit von Features wie mathematische Funktionen und die Volltextsuche auswirken. Führen Sie PRAGMA compile_options; aus, um die Optionen in Ihrem SQLite-Build schnell zu überprüfen und die Features zu prüfen, auf die Ihre Anwendung angewiesen ist.
Ersetzen Sie Microsoft.EntityFrameworkCore.Sqlite durch Microsoft.EntityFrameworkCore.Sqlite.Core und verweisen Sie auf das SQLitePCLRaw.provider.sqlite3-Paket, um die System-SQLite-Bibliothek zu verwenden.
<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>
Anmerkung
Ersetzen Sie ab EF Core 11 (SQLitePCLRaw 3.0) die SQLitePCLRaw.provider.sqlite3 Version durch 3.x.x. In den grundlegenden Änderungen finden Sie weitere Details.
Fügen Sie dann vor der Verwendung von SQLite explizite Initialisierung hinzu:
SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_sqlite3());
Unter macOS müssen Sie auch eine Umgebungsvariable festlegen, bevor Sie Ihre App ausführen, damit die Homebrew-Version von SQLite verwendet wird:
DYLD_LIBRARY_PATH="$(brew --prefix sqlite)/lib"
Konfigurieren von SRID
In SpatiaLite muss in jeder Spalte eine SRID angegeben sein. Die standardmäßige SRID ist 0. Geben Sie eine andere SRID mithilfe der HasSrid-Methode an.
modelBuilder.Entity<City>().Property(c => c.Location)
.HasSrid(4326);
Anmerkung
4326 bezieht sich auf WGS 84, einen Standard, der in GPS und anderen geografischen Systemen verwendet wird.
Dimension
Die Standarddimension (ordinates) einer Spalte ist X und Y. Um zusätzliche Ordinaten wie Z oder M zu aktivieren, konfigurieren Sie den Spaltentyp.
modelBuilder.Entity<City>().Property(c => c.Location)
.HasColumnType("POINTZ");
Räumliche Funktionszuordnungen
In dieser Tabelle ist zu sehen, welche NetTopologySuite-Member (NTS) in welche SQL-Funktionen übersetzt werden.
| .NET | SQL |
|---|---|
| geometry.Area | Area(@geometry) |
| geometry.AsBinary() | AsBinary(@geometry) |
| geometry.AsText() | AsText(@geometry) |
| geometry.Boundary | Grenze(@geometry) |
| geometry.Buffer(distance) | Buffer(@geometry, @distance) |
| Geometrie. Buffer(distance, quadrantSegments) | Buffer(@geometry, @distance, @quadrantSegments)) |
| geometry.Centroid | Centroid(@geometry) |
| geometry.Contains(g) | Enthält(@geometry, @g) |
| geometry.ConvexHull() | ConvexHull(@geometry) |
| geometry.CoveredBy(g) | CoveredBy(@Geometrie, @g) |
| geometry.Covers(g) | Bedeckungen(@geometry; @g) |
| geometry.Crosses(g) | Kreuze(@geometry, @g) |
| geometry.Difference(other) | Unterschied(@geometry, @other) |
| geometry.Dimension | Dimension(@geometry) |
| geometry.Disjoint(g) | Disjoint(@geometry, @g) |
| geometry.Distance(g) | Abstand(@geometry; @g) |
| geometry.Envelope | Envelope(@geometry) |
| geometry.EqualsTopologically(g) | Gleich(@geometry, @g) |
| geometry.GeometryType | GeometryType(@geometry) |
| geometry.GetGeometryN(n) | GeometryN(@geometry, @n + 1) |
| geometry.InteriorPoint | PointOnSurface(@geometry) |
| geometry.Intersection(other) | Schnittmenge(@geometry, @other) |
| geometry.Intersects(g) | Intersects(@geometry, @g) |
| geometry.IsEmpty | IsEmpty(@geometry) |
| geometry.IsSimple | IsSimple(@geometry) |
| geometry.IsValid | IsValid(@geometry) |
| Geometrie. IsWithinDistance(geom, Distance) | Abstand(@geometry, @geom)<= @distance |
| geometry.Length | GLength(@geometry) |
| geometry.NumGeometries | NumGeometries(@geometry) |
| geometry.NumPoints | NumPoints(@geometry) |
| geometry.OgcGeometryType | CASE GeometryType(@geometry) WHEN 'POINT' THEN 1 ... ENDE |
| geometry.Overlaps(g) | Überlappungen(@geometry; @g) |
| geometry.PointOnSurface | PointOnSurface(@geometry) |
| Geometrie.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) | Innerhalb(@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) |
Aggregatfunktionen
| .NET | SQL | Hinzugefügt in |
|---|---|---|
| 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 |