다음을 통해 공유


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

추가 리소스