SQLite EF Core プロバイダーでの空間データ
このページには、SQLite データベース プロバイダーでの空間データの使用に関する追加情報が含まれています。 EF Core での空間データの使用に関する一般的な情報については、メインの空間データに関するドキュメントを参照してください。
SpatiaLite のインストール
Windows では、ネイティブ mod_spatialite ライブラリは NuGet パッケージの依存関係として配布されます。 他のプラットフォームでは、それを別にインストールする必要があります。 通常、これはソフトウェア パッケージ マネージャーを使用して行われます。 たとえば、Debian および Ubuntu では APT、MacOS では Homebrew を使用できます。
# Debian/Ubuntu
apt-get install libsqlite3-mod-spatialite
# macOS
brew install libspatialite
残念ながら、新しいバージョンの PROJ (SpatiaLite の依存関係) には EF の既定の SQLitePCLRaw バンドルと互換性がありません。 この問題を回避するには、代わりにシステム SQLite ライブラリを使用します。
<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>
macOS では、Homebrew バージョンの SQLite が使用されるように、アプリを実行する前に環境変数を設定する必要もあります。 Visual Studio for Mac では、[プロジェクト] > [プロジェクト オプション] > [実行] > [構成] > [既定] で設定できます。
DYLD_LIBRARY_PATH=/usr/local/opt/sqlite/lib
SRID の構成
SpatiaLite では、列ごとに SRID を指定する必要があります。 既定の SRID は 0
です。 HasSrid メソッドを使用して、別の SRID を指定します。
modelBuilder.Entity<City>().Property(c => c.Location)
.HasSrid(4326);
Note
4326 は WGS 84 (GPS や他の地理システムで使用されている標準) を表します。
ディメンション
列の既定のディメンション (座標) は、X と Y です。Z や M などの追加の座標を有効にするには、列の型を構成します。
modelBuilder.Entity<City>().Property(c => c.Location)
.HasColumnType("POINTZ");
空間関数のマッピング
次の表は、どの NetTopologySuite (NTS) メンバーがどの SQL 関数に変換されるかを示しています。
.NET | SQL |
---|---|
geometry.Area | Area(@geometry) |
geometry.AsBinary() | AsBinary(@geometry) |
geometry.AsText() | AsText(@geometry) |
geometry.Boundary | Boundary(@geometry) |
geometry.Buffer(distance) | Buffer(@geometry, @distance) |
geometry.Buffer(distance, quadrantSegments) | Buffer(@geometry, @distance, @quadrantSegments) |
geometry.Centroid | Centroid(@geometry) |
geometry.Contains(g) | Contains(@geometry, @g) |
geometry.ConvexHull() | ConvexHull(@geometry) |
geometry.CoveredBy(g) | CoveredBy(@geometry, @g) |
geometry.Covers(g) | Covers(@geometry, @g) |
geometry.Crosses(g) | Crosses(@geometry, @g) |
geometry.Difference(other) | Difference(@geometry, @other) |
geometry.Dimension | Dimension(@geometry) |
geometry.Disjoint(g) | Disjoint(@geometry, @g) |
geometry.Distance(g) | Distance(@geometry, @g) |
geometry.Envelope | Envelope(@geometry) |
geometry.EqualsTopologically(g) | Equals(@geometry, @g) |
geometry.GeometryType | GeometryType(@geometry) |
geometry.GetGeometryN(n) | GeometryN(@geometry, @n + 1) |
geometry.InteriorPoint | PointOnSurface(@geometry) |
geometry.Intersection(other) | Intersection(@geometry, @other) |
geometry.Intersects(g) | Intersects(@geometry, @g) |
geometry.IsEmpty | IsEmpty(@geometry) |
geometry.IsSimple | IsSimple(@geometry) |
geometry.IsValid | IsValid(@geometry) |
geometry.IsWithinDistance(geom, distance) | Distance(@geometry, @geom)<= @distance |
geometry.Length | GLength(@geometry) |
geometry.NumGeometries | NumGeometries(@geometry) |
geometry.NumPoints | NumPoints(@geometry) |
geometry.OgcGeometryType | CASE GeometryType(@geometry) WHEN 'POINT' THEN 1 ... END |
geometry.Overlaps(g) | Overlaps(@geometry, @g) |
geometry.PointOnSurface | PointOnSurface(@geometry) |
geometry.Relate(g, intersectionPattern) | Relate(@geometry, @g, @intersectionPattern) |
geometry.Reverse() | ST_Reverse(@geometry) |
geometry.SRID | SRID(@geometry) |
geometry.SymmetricDifference(other) | SymDifference(@geometry, @other) |
geometry.ToBinary() | AsBinary(@geometry) |
geometry.ToText() | AsText(@geometry) |
geometry.Touches(g) | Touches(@geometry, @g) |
geometry.Union() | UnaryUnion(@geometry) |
geometry.Union(other) | GUnion(@geometry, @other) |
geometry.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) |
point.M | M(@point) |
point.X | X(@point) |
point.Y | Y(@point) |
point.Z | Z(@point) |
polygon.ExteriorRing | ExteriorRing(@polygon) |
polygon.GetInteriorRingN(n) | InteriorRingN(@polygon, @n + 1) |
polygon.NumInteriorRings | NumInteriorRing(@polygon) |
集計関数
.NET | SQL | 追加されたバージョン: |
---|---|---|
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 |
その他のリソース
.NET