Räumliche Daten im SQLite-EF Core-Anbieter

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 zu räumlichen Daten.

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 auf 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-Bundle von EF kompatibel. Sie können dies umgehen, indem Sie stattdessen die System SQLite-Bibliothek verwenden.

<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>

Auf macOS müssen Sie auch eine Umgebungsvariable festlegen, bevor Sie Ihre App ausführen, sodass die Homebrew-Version von SQLite verwendet wird. In Visual Studio für Mac können Sie dies unter Projekt > Projektoptionen > Ausführen > Konfigurationen > Standard festlegen.

DYLD_LIBRARY_PATH=/usr/local/opt/sqlite/lib

Konfigurieren von SRID

In SpatiaLite müssen Spalten eine SRID pro Spalte angeben. 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);

Hinweis

4326 bezieht sich auf WGS 84, einen Standard, der in GPS und anderen geografischen Systemen verwendet wird.

Dimension

Die Standarddimensionen (oder Ordinaten) einer Spalte sind 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");

Zuordnungen räumlicher Funktionen

Diese Tabelle zeigt, 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 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 ... ENDE
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)

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

Zusätzliche Ressourcen