Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 |