Condividi tramite


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 nativa mod_spatialite 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.

Importante

Non usare Microsoft.EntityFrameworkCore.Sqlite o Microsoft.Data.Sqlite con SpatiaLite in macOS e Linux. Entrambi i pacchetti includono in SQLitePCLRaw.bundle_e_sqlite3 per impostazione predefinita, cioè una versione in bundle di SQLite che non è compatibile con SQLite installata dal sistema. L'uso di può causare un arresto anomalo invisibile all'utente in fase di esecuzione. Usare Microsoft.EntityFrameworkCore.Sqlite.Core o Microsoft.Data.Sqlite.Core , invece, insieme al provider SQLite di sistema, come illustrato di seguito.

Si noti anche che la libreria SQLite installata dal sistema può avere opzioni in fase di compilazione diverse rispetto alla versione in bundle. Ciò può influire sulla disponibilità di funzionalità come funzioni matematiche e ricerca full-text. Per esaminare rapidamente le opzioni nella compilazione SQLite, eseguire PRAGMA compile_options; e verificare le funzionalità su cui si basa l'applicazione.

Sostituire Microsoft.EntityFrameworkCore.Sqlite con Microsoft.EntityFrameworkCore.Sqlite.Core e fare riferimento al SQLitePCLRaw.provider.sqlite3 pacchetto per usare la libreria SQLite di sistema:

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

Annotazioni

A partire da EF Core 11 (SQLitePCLRaw 3.0), sostituire la SQLitePCLRaw.provider.sqlite3 versione con 3.x.x. Per informazioni dettagliate, vedere le modifiche che causano un'interruzione .

Aggiungere quindi l'inizializzazione esplicita prima di usare SQLite:

SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_sqlite3());

In macOS è anche necessario impostare una variabile di ambiente prima di eseguire l'app in modo che usi la versione di SQLite di Homebrew:

DYLD_LIBRARY_PATH="$(brew --prefix 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);

Annotazioni

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");

Mappature delle funzioni spaziali

Questa tabella mostra in quali funzioni SQL vengono tradotti i membri di NetTopologySuite (NTS).

.NET SQL
Geometria. Zona Area (@geometry)
geometry.AsBinary() AsBinary(@geometry)
geometry.AsText() AsText(@geometry)
Geometria.Limite Limite (@geometry)
Geometria. Buffer(distance) Buffer (@geometry, @distance)
Geometria. Buffer(distance, quadrantSegments) Buffer(@geometry, @distance, @quadrantSegments)
Geometria. Centroide 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) Distanza(@geometry, @g)
Geometria.Involucro Inviluppo(@geometry)
Geometria. EqualsTopologically(g) Uguale(@geometry, @g)
Geometria. GeometryType GeometryType(@geometry)
geometry.GetGeometryN(n) GeometryN(@geometry, @n + 1)
Geometria. InteriorPoint PointOnSurface(@geometry)
Geometria. Intersezione (altro) Intersezione (@geometry, @other)
Geometria. Intersects(g) Intersects(@geometry, @g)
geometry.IsEmpty IsEmpty(@geometry)
geometry.IsSimple IsSimple(@geometry)
geometria.IsValid IsValid(@geometry)
Geometria. IsWithinDistance(geom, distance) Distanza(@geometry, @geom)<= @distance
Geometria. Lunghezza GLength(@geometry)
Geometria.NumGeometrie NumGeometries(@geometry)
Geometria.NumeroPunti NumPoints(@geometry)
Geometria.OgcGeometryType CASO GeometryType(@geometry) QUANDO 'POINT' ALLORA 1 ... END
Geometria. Sovrapposizioni (g) Sovrapposizioni (@geometry, @g)
Geometria. PointOnSurface PointOnSurface(@geometry)
Geometria.Relate(g, pattern di intersezione) Relazione(@geometria, @g, @intersectionPattern))
Geometria. Reverse() ST_Reverse(@geometry)
geometry.SRID SRID(@geometry)
Geometria. SymmetricDifference(other) SymDifference(@geometry, @other)
Geometria. ToBinary() AsBinary(@geometry)
Geometria.ToText() AsText(@geometry)
Geometria. Touches(g) Touches(@geometry, @g)
geometry.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 NumeroPunti(@lineString)
lineString.EndPoint EndPoint(@lineString)
lineString.GetPointN(n) PointN(@lineString, @n + 1)
lineString.IsClosed IsClosed(@lineString)
lineString.IsRing IsRing(@lineString)
lineString.PuntoDiInizio PuntoDiInizio(@lineString)
multiLineString.IsClosed IsClosed(@multiLineString)
Punto. M M(@point)
Punto. X X(@point)
Punto Y Y(@point)
Punto Z Z(@point)
Poligono. AnelloEsterno 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)) Raccolta(Proprietà) 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)) Estensione(Proprietà) EF Core 7.0

Risorse aggiuntive