Data Spasial di Penyedia Inti SQLite EF

Halaman ini mencakup informasi tambahan tentang menggunakan data spasial dengan penyedia database SQLite. Untuk informasi umum tentang menggunakan data spasial di EF Core, lihat dokumentasi Data Spasial utama.

Menginstal SpatiaLite

Di Windows, pustaka mod_spatialite asli didistribusikan sebagai dependensi paket NuGet . Platform lain perlu menginstalnya secara terpisah. Ini biasanya dilakukan menggunakan manajer paket perangkat lunak. Misalnya, Anda dapat menggunakan APT pada Debian dan Ubuntu; dan Homebrew di MacOS.

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

# macOS
brew install libspatialite

Sayangnya, versi PROJ yang lebih baru (dependensi SpatiaLite) tidak kompatibel dengan bundel default EF SQLitePCLRaw. Anda dapat mengatasinya dengan menggunakan pustaka SQLite sistem sebagai gantinya.

Penting

Jangan gunakan Microsoft.EntityFrameworkCore.Sqlite atau Microsoft.Data.Sqlite dengan SpatiaLite di macOS dan Linux. Kedua paket menggunakan SQLitePCLRaw.bundle_e_sqlite3 secara default—versi SQLite paket bawaan yang tidak kompatibel dengan SQLite yang diinstal sistem. Penggunaannya dapat mengakibatkan kerusakan yang tidak terlihat saat dijalankan. Gunakan Microsoft.EntityFrameworkCore.Sqlite.Core atau Microsoft.Data.Sqlite.Core sebagai gantinya, bersama dengan penyedia SQLite sistem seperti yang ditunjukkan di bawah ini.

Perhatikan juga bahwa pustaka SQLite yang diinstal sistem mungkin memiliki opsi waktu kompilasi yang berbeda dari versi yang dibundel. Ini dapat memengaruhi ketersediaan fitur seperti fungsi matematika dan pencarian teks lengkap. Untuk memeriksa opsi dalam build SQLite Anda dengan cepat, jalankan PRAGMA compile_options; dan periksa fitur yang diandalkan aplikasi Anda.

Ganti Microsoft.EntityFrameworkCore.Sqlite dengan Microsoft.EntityFrameworkCore.Sqlite.Core dan referensikan SQLitePCLRaw.provider.sqlite3 paket untuk menggunakan pustaka SQLite sistem:

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

Nota

Dimulai dengan EF Core 11 (SQLitePCLRaw 3.0), ganti SQLitePCLRaw.provider.sqlite3 versi dengan 3.x.x. Lihat perubahan signifikan untuk detailnya.

Kemudian tambahkan inisialisasi eksplisit sebelum menggunakan SQLite:

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

Di macOS, Anda juga harus mengatur variabel lingkungan sebelum menjalankan aplikasi sehingga menggunakan SQLite versi Homebrew:

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

Mengonfigurasi SRID

Di SpatiaLite, kolom perlu menentukan SRID per kolom. SRID default adalah 0. Tentukan SRID yang berbeda menggunakan metode HasSrid.

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

Nota

4326 mengacu pada WGS 84, standar yang digunakan dalam GPS dan sistem geografis lainnya.

Dimensi

Dimensi default (atau ordinat) kolom adalah X dan Y. Untuk mengaktifkan ordinat tambahan seperti Z atau M, konfigurasikan jenis kolom.

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

Pemetaan fungsi spasial

Tabel ini menunjukkan anggota NetTopologySuite (NTS) yang diterjemahkan ke dalam fungsi SQL mana.

.NET SQL
geometri. Daerah Luas(@geometry)
geometri.AsBinary() AsBinary(@geometry)
geometri. AsText() AsText(@geometry)
geometri. Perbatasan Batas(@geometry)
geometri. Buffer(jarak) Buffer(@geometry, @distance)
geometri. Buffer(jarak, quadrantSegments) Buffer(@geometry, @distance, @quadrantSegments)
geometri. Sentroid Centroid(@geometry)
geometri.Mengandung(g) Contains(@geometry, @g)
geometri.ConvexHull() ConvexHull(@geometry)
geometri.CoveredBy(g) CoveredBy(@geometry, @g)
geometri.Menutupi(g) Menutupi(@geometry, @g)
geometri.Perpotongan(g) Salib(@geometry, @g)
geometri. Perbedaan(lainnya) Perbedaan(@geometry, @other)
geometri. Dimensi Dimensi (@geometry)
geometri.Disjoint(g) Disjoint (@geometry, @g)
Geometri.Jarak(g) Jarak(@geometry, @g)
geometri.Envelope Amplop(@geometry)
geometri. EqualsTopologically(g) Sama dengan(@geometry, @g)
geometri.GeometryType GeometryType(@geometry)
geometri.GetGeometryN(n) GeometriN(@geometry, @n + 1)
geometri.TitikInterior PointOnSurface(@geometry)
geometri.Persilangan(lain) Persimpangan(@geometry, @other)
geometri.Interseksi(g) Intersects(@geometry, @g)
geometri. IsEmpty IsEmpty(@geometry)
geometri.IsSimple IsSimple(@geometry)
geometri.IsValid IsValid(@geometry)
geometri.IsWithinDistance(geom, jarak) Jarak(@geometry, @geom)<= @distance
geometri. Panjangnya GLength(@geometry)
geometri.NumGeometries NumGeometries(@geometry)
geometri. NumPoints NumPoints(@geometry)
geometri.OgcGeometryType CASE GeometryType(@geometry) KETIKA 'POINT' MAKA 1 ... UJUNG
geometri. Tumpang tindih(g) Tumpang tindih(@geometry, @g)
geometri.TitikDiPermukaan PointOnSurface(@geometry)
geometri. Relate(g, intersectionPattern) Relate(@geometry, @g, @intersectionPattern))
geometri.Reverse() ST_Reverse(@geometry)
Geometri.SRID SRID(@geometry)
geometri. SymmetricDifference(lainnya) SymDifference(@geometry, @other))
geometri.ToBinary() AsBinary(@geometry)
geometri.ToText() AsText(@geometry)
geometri. Sentuhan(g) Menyentuh(@geometry, @g)
geometri.Union() UnaryUnion(@geometry)
geometri.Union(lainnya) GUnion(@geometry, @other)
geometri. Dalam(g) Dalam(@geometry, @g)
geometryCollection[i] GeometriN(@geometryCollection, @i + 1)
KoleksiGeometri.Jumlah 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)
titik. M M(@point)
titik.X X(@point)
titik.Y Y(@point)
titik Z Z(@point)
Poligon. EksteriorRing ExteriorRing(@polygon)
Poligon.GetInteriorRingN(n) InteriorRingN(@polygon, @n + 1)
Poligon. NumInteriorRings NumInteriorRing(@polygon)

Fungsi agregat

.NET SQL Ditambahkan dalam
GeometryCombiner.Combine(group. Pilih(x => x.Property)) Kumpulkan(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(Properti) EF Core 7.0
EnvelopeCombiner.CombineAsGeometry(group. Pilih(x => x.Property)) Jangkauan(Proprietas) EF Core 7.0

Sumber daya tambahan