Dati spaziali nel provider SQLite EF Core

Questa pagina include informazioni aggiuntive sull'uso dei dati spaziali con il provider di database SQLite. Per informazioni generali sull'uso dei dati spaziali in EF Core, vedere la documentazione principale relativa ai dati spaziali.

Installazione di SpatiaLite

In Windows la libreria di mod_spatialite nativa viene distribuita come dipendenza del pacchetto NuGet. Altre piattaforme devono installarle separatamente. Questa operazione viene in genere eseguita usando una gestione pacchetti software. Ad esempio, è possibile usare APT in Debian e Ubuntu; e Homebrew in MacOS.

# Debian/Ubuntu
apt-get install libsqlite3-mod-spatialite

# macOS
brew install libspatialite

Sfortunatamente, le versioni più recenti di PROJ (una dipendenza di SpatiaLite) non sono compatibili con il bundle SQLitePCLRaw predefinito di EF. È possibile risolvere questo problema usando invece la libreria SQLite di sistema.

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

In macOS è anche necessario impostare una variabile di ambiente prima di eseguire l'app in modo che usi la versione di SQLite di Homebrew. In Visual Studio per Mac, è possibile impostarlo in > Opzioni > progetto Opzioni esecuzione > configurazioni predefinite >

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

Configurazione di SRID

In SpatiaLite le colonne devono specificare un identificatore SRID per colonna. L'identificatore SRID predefinito è 0. Specificare un identificatore SRID diverso usando il metodo HasSrid.

modelBuilder.Entity<City>().Property(c => c.Location)
    .HasSrid(4326);

Nota

4326 si riferisce a WGS 84, uno standard usato in GPS e altri sistemi geografici.

Dimensione

La dimensione predefinita (o le coordinate) di una colonna è X e Y. Per abilitare coordinate aggiuntive come Z o M, configurare il tipo di colonna.

modelBuilder.Entity<City>().Property(c => c.Location)
    .HasColumnType("POINTZ");

Mapping delle funzioni spaziali

Questa tabella mostra i membri netTopologySuite (NTS) convertiti in cui funzioni SQL.

.NET SQL
Geometria. Zona Area (@geometry)
Geometria. AsBinary() AsBinary(@geometry)
Geometria. AsText() AsText(@geometry)
Geometria. Confine Limite (@geometry)
Geometria. Buffer(distance) Buffer (@geometry, @distance)
Geometria. Buffer(distance, quadrantSegments) Buffer(@geometry, @distance, @quadrantSegments)
Geometria. Baricentro Centroid(@geometry)
Geometria. Contains(g) Contains(@geometry, @g)
Geometria. ConvexHull() ConvexHull(@geometry)
Geometria. CoveredBy(g) CoveredBy(@geometry, @g)
Geometria. Cover(g) Cover (@geometry, @g)
Geometria. Crosses(g) Crosses(@geometry, @g)
Geometria. Differenza (altro) Differenza (@geometry, @other)
Geometria. Dimensione Dimensione (@geometry)
Geometria. Disgiunto(g) Disgiunto(@geometry, @g)
Geometria. Distance(g) Distance(@geometry, @g)
Geometria. Busta Busta (@geometry)
Geometria. EqualsTopologically(g) Equals(@geometry, @g)
Geometria. GeometryType GeometryType(@geometry)
Geometria. GetGeometryN(n) GeometryN(@geometry, @n + 1)
Geometria. InteriorPoint PointOnSurface(@geometry)
Geometria. Intersezione (altro) Intersezione (@geometry, @other)
Geometria. Intersects(g) Intersects(@geometry, @g)
Geometria. Isempty IsEmpty(@geometry)
Geometria. IsSimple IsSimple(@geometry)
Geometria. IsValid IsValid(@geometry)
Geometria. IsWithinDistance(geom, distance) Distance(@geometry, @geom)<= @distance
Geometria. Lunghezza GLength(@geometry)
Geometria. NumGeometries NumGeometries(@geometry)
Geometria. NumPoint NumPoints(@geometry)
Geometria. OgcGeometryType CA edizione Standard GeometryType(@geometry) WHEN 'POINT' THEN 1 ... FINE
Geometria. Sovrapposizioni (g) Sovrapposizioni (@geometry, @g)
Geometria. PointOnSurface PointOnSurface(@geometry)
Geometria. Relate(g, intersezionePattern) Relate(@geometry, @g, @intersectionPattern)
Geometria. Reverse() ST_Reverse(@geometry)
Geometria. SRID SRID(@geometry)
Geometria. SymmetricDifference(other) SymDifference(@geometry, @other)
Geometria. ToBinary() AsBinary(@geometry)
Geometria. ToText() AsText(@geometry)
Geometria. Touches(g) Touches(@geometry, @g)
Geometria. Union() UnaryUnion(@geometry)
Geometria. Union(altro) GUnion(@geometry, @other)
Geometria. 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)
Punto. M M(@point)
Punto. X X(@point)
Punto. Y Y(@point)
Punto. Z Z(@point)
Poligono. ExteriorRing ExteriorRing(@polygon)
Poligono. GetInteriorRingN(n) InteriorRingN(@polygon, @n + 1)
Poligono. NumInteriorRings NumInteriorRing(@polygon)

Funzioni di aggregazione

.NET SQL Aggiunta 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

Risorse aggiuntive