Compartilhar via


Dados espaciais no Provador EF Core do SQLite

Esta página inclui informações adicionais sobre como usar dados espaciais com o provedor de banco de dados SQLite. Para obter informações gerais sobre como usar dados espaciais no EF Core, consulte a documentação principal de Dados Espaciais .

Instalando SpatiaLite

No Windows, a biblioteca nativa mod_spatialite é distribuída como uma dependência de pacote NuGet . Outras plataformas precisam instalá-la separadamente. Normalmente, isso é feito usando um gerenciador de pacotes de software. Por exemplo, você pode usar o APT no Debian e no Ubuntu; e Homebrew no MacOS.

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

# macOS
brew install libspatialite

Infelizmente, as versões mais recentes do PROJ (uma dependência do SpatiaLite) são incompatíveis com o pacote SQLitePCLRaw padrão do EF. Em vez disso, você pode contornar isso usando a biblioteca SQLite do sistema.

Importante

Não use Microsoft.EntityFrameworkCore.Sqlite ou Microsoft.Data.Sqlite com o SpatiaLite no macOS e no Linux. Ambos os pacotes incluem SQLitePCLRaw.bundle_e_sqlite3 por padrão — uma versão empacotada do SQLite que é incompatível com o SQLite instalado pelo sistema. Usá-lo pode resultar em uma falha silenciosa no tempo de execução. Use Microsoft.EntityFrameworkCore.Sqlite.Core ou Microsoft.Data.Sqlite.Core , em vez disso, junto com o provedor SQLite do sistema, conforme mostrado abaixo.

Observe também que a biblioteca SQLite instalada pelo sistema pode ter opções de tempo de compilação diferentes da versão empacotada. Isso pode afetar a disponibilidade de recursos como funções matemáticas e pesquisa de texto completo. Para inspecionar rapidamente as opções no build do SQLite, execute PRAGMA compile_options; e verifique os recursos dos quais seu aplicativo depende.

Substitua Microsoft.EntityFrameworkCore.Sqlite por Microsoft.EntityFrameworkCore.Sqlite.Core e referencie o pacote SQLitePCLRaw.provider.sqlite3 para usar a biblioteca SQLite do 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>

Observação

A partir do EF Core 11 (SQLitePCLRaw 3.0), substitua a SQLitePCLRaw.provider.sqlite3 versão por 3.x.x. Consulte as mudanças radicais para obter detalhes.

Em seguida, adicione a inicialização explícita antes de usar o SQLite:

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

No macOS, você também precisará definir uma variável de ambiente antes de executar seu aplicativo para que ele use a versão do Homebrew do SQLite:

DYLD_LIBRARY_PATH="$(brew --prefix sqlite)/lib"

Configurando o SRID

No SpatiaLite, as colunas precisam especificar um SRID por coluna. O SRID padrão é 0. Especifique um SRID diferente usando o método HasSrid.

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

Observação

4326 refere-se ao WGS 84, um padrão usado em GPS e outros sistemas geográficos.

Dimensão

A dimensão padrão (ou ordena) de uma coluna é X e Y. Para habilitar coordenadas adicionais como Z ou M, configure o tipo de coluna.

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

Mapeamentos de função espacial

Esta tabela mostra quais membros do NetTopologySuite (NTS) são traduzidos para quais funções SQL.

.NET SQL
Geometria. Área Área(@geometry)
geometry.AsBinary() AsBinary(@geometry)
geometry.AsText() AsText(@geometry)
Geometria. Limite Fronteira(@geometry)
Geometria. Buffer(distância) Buffer(@geometry, @distance)
geometry.Buffer(distância, segmentosDoQuadrante) Buffer(@geometry, @distance, @quadrantSegments))
Geometria. Centróide Centroid(@geometry)
Geometria. Contains(g) Contains(@geometry, @g)
Geometria. ConvexHull() ConvexHull(@geometry)
Geometria. CoveredBy(g) CoveredBy(@geometry, @g)
Geometria.Cobre(g) Covers(@geometry, @g)
Geometria. Cruzes(g) Cruzes(@geometry, @g)
Geometria. Diferença(outros) Diferença(@geometry, @other)
Geometria. Dimensão Dimension(@geometry)
Geometria.Disjoint(g) Disjoint(@geometry, @g)
Geometria. Distância(g) Distância(@geometry, @g)
Geometria. Envelope Envelope(@geometry)
Geometria. EqualsTopologically(g) Equals(@geometry, @g)
Geometria. GeometryType TipoDeGeometria(@geometry)
geometry.GetGeometryN(n) GeometryN(@geometry, @n + 1)
Geometria.InteriorPoint PointOnSurface(@geometry)
Geometria. Intersecção(outra) Intersecção(@geometry, @other)
Geometria. Intersecções(g) Intersecções(@geometry, @g)
geometry.IsEmpty IsEmpty(@geometry)
Geometria.IsSimple IsSimple(@geometry)
Geometria.IsValid IsValid(@geometry)
geometria.IsWithinDistance(geom, distance) Distância(@geometria, @geom)<= @distance
Geometria. Comprimento GLength(@geometry)
Geometria. NumGeometries NumGeometries(@geometry)
Geometria. NumPoints NumPoints(@geometry)
Geometria. OgcGeometryType CASE GeometryType(@geometry) QUANDO 'POINT' THEN 1 ... FINAL
Geometria. Sobreposições(g) Sobreposições(@geometry, @g)
Geometria. PointOnSurface PointOnSurface(@geometry)
geometry.Relate(g, padrãoDeInterseção) Relate(@geometry, @g, @intersectionPattern)
Geometria. Reverse() ST_Reverse(@geometry)
geometry.SRID SRID(@geometry)
geometria.SymmetricDifference(outro) SymDifference(@geometry, @other)
geometry.ToBinary() AsBinary(@geometry)
Geometria.ToText() AsText(@geometry)
Geometria. Toques(g) Toques(@geometry, @g)
geometry.Union() UnaryUnion(@geometry)
Geometria. União(outros) GUnion(@geometry, @other)
Geometria. Within(g) Within(@geometry, @g)
geometryCollection[i] GeometryN(@geometryCollection, @i + 1)
geometryCollection.Contagem 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)
Ponto M M(@point)
Ponto. X X(@point)
Ponto. Y Y(@point)
Ponto. Z Z(@point)
Polígono. ExteriorRing ExteriorRing(@polygon)
Polígono.GetInteriorRingN(n) InteriorRingN(@polygon, @n + 1)
Polígono.NumeroDeAneisInteriores NumInteriorRing(@polygon)

Funções de agregação

.NET SQL Adicionado
GeometryCombiner.Combine(group.Select(x => x.Property)) Coletar(Propriedade) 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(Propriedade) EF Core 7.0
EnvelopeCombiner.CombineAsGeometry(group.Select(x => x.Property)) Extent(Property) EF Core 7.0

Recursos adicionais