SQLite EF Core 공급자의 공간 데이터
이 페이지에는 SQLite 데이터베이스 공급자와 함께 공간 데이터를 사용하는 방법에 대한 추가 정보가 포함되어 있습니다. EF Core에서 공간 데이터를 사용하는 방법에 대한 일반적인 내용은 기본 공간 데이터 설명서를 참조하세요.
SpatiaLite 설치
Windows에서 네이티브 mod_spatialite 라이브러리는 NuGet 패키지 종속성으로 배포됩니다. 다른 플랫폼은 별도로 설치해야 합니다. 이 작업은 일반적으로 소프트웨어 패키지 관리자를 사용하여 수행됩니다. 예를 들어 Debian 및 Ubuntu에서 APT를 사용할 수 있습니다. 및 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를 사용할 수 있도록 앱을 실행하기 전에 환경 변수를 설정해야 합니다. Mac용 Visual Studio 프로젝트 > 프로젝트 옵션 > 실행 > 구성 > 기본값에서 설정할 수 있습니다.
DYLD_LIBRARY_PATH=/usr/local/opt/sqlite/lib
SRID 구성
SpatiaLite에서 열은 열당 SRID를 지정해야 합니다. 기본 SRID는 0
입니다. HasSrid 메서드를 사용하여 다른 SRID를 지정합니다.
modelBuilder.Entity<City>().Property(c => c.Location)
.HasSrid(4326);
참고 항목
4326은 GPS 및 기타 지리적 시스템에 사용되는 표준인 WGS 84를 나타냅니다.
Dimension
열의 기본 차원(또는 좌표)은 X 및 Y입니다. Z 또는 M과 같은 추가 좌표를 사용하도록 설정하려면 열 형식을 구성합니다.
modelBuilder.Entity<City>().Property(c => c.Location)
.HasColumnType("POINTZ");
공간 함수 매핑
이 표에서는 어떤 NTS(NetTopologySuite) 멤버가 어떤 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 | Added in |
---|---|---|
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