다음을 통해 공유


SQL Server EF Core 공급자의 공간 데이터

이 페이지에는 Microsoft SQL Server 데이터베이스 공급자와 함께 공간 데이터를 사용하는 방법에 대한 추가 정보가 포함되어 있습니다. EF Core에서 공간 데이터를 사용하는 방법에 대한 일반적인 내용은 기본 공간 데이터 설명서를 참조하세요.

지리 또는 기하 도형

기본적으로 공간 속성은 SQL Server의 geography 열에 매핑됩니다. geometry를 사용하려면 모델에서 열 형식을 구성해야 합니다.

지리 다각형 링

geography 열 형식을 사용하는 경우 SQL Server 외부 링(또는 셸) 및 내부 링(또는 구멍)에 추가 요구 사항을 적용합니다. 외부 링의 방향이 시계 반대 방향이고 내부 링이 시계 방향으로 표시되어야 합니다. NTS(NetTopologySuite)는 데이터베이스에 값을 보내기 전에 이 유효성을 검사합니다.

FullGlobe

SQL Server에는 geography 열 형식을 사용할 때 전체 구문을 나타내는 비표준 기하 도형 형식이 있습니다. 또한 전체 구형(외부 링 없음)를 기반으로 다각형을 나타내는 방법도 있습니다. 둘 다 NTS에서 지원되지 않습니다.

Warning

FullGlobe 및 이를 기반으로 하는 다각형은 NTS에서 지원되지 않습니다.

곡선

기본 공간 데이터 설명서에 설명된 것처럼 NTS는 현재 곡선을 나타낼 수 없습니다. 즉, EF Core에서 사용하기 전에 STCurveToLine 메서드를 사용하여 CircularString, CompoundCurve 및 CurePolygon 값을 변환해야 합니다.

Warning

CircularString, CompoundCurve 및 CurePolygon은 NTS에서 지원되지 않습니다.

공간 함수 매핑

이 표에서는 어떤 NTS 멤버가 어떤 SQL 함수로 변환되는지 보여 줍니다. 변환은 열이 geography 형식인지 기하 도형인지에 따라 달라집니다.

.NET SQL(지리) SQL(기하 도형) 추가된 위치
EF.Functions.CurveToLine(geometry) @geometry.STCurveToLine() @geometry.STCurveToLine() EF Core 7.0
geometry.Area @geometry.STArea() @geometry.STArea()
geometry.AsBinary() @geometry.STAsBinary() @geometry.STAsBinary()
geometry.AsText() @geometry.AsTextZM() @geometry.AsTextZM()
geometry.Boundary @geometry.STBoundary()
geometry.Buffer(distance) @geometry.STBuffer(@distance) @geometry.STBuffer(@distance)
geometry.Centroid @geometry.STCentroid()
geometry.Contains(g) @geometry.STContains(@g) @geometry.STContains(@g)
geometry.ConvexHull() @geometry.STConvexHull() @geometry.STConvexHull()
geometry.Crosses(g) @geometry.STCrosses(@g)
geometry.Difference(other) @geometry.STDifference(@other) @geometry.STDifference(@other)
geometry.Dimension @geometry.STDimension() @geometry.STDimension()
geometry.Disjoint(g) @geometry.STDisjoint(@g) @geometry.STDisjoint(@g)
geometry.Distance(g) @geometry.STDistance(@g) @geometry.STDistance(@g)
geometry.Envelope @geometry.STEnvelope()
geometry.EqualsTopologically(g) @geometry.STEquals(@g) @geometry.STEquals(@g)
geometry.GeometryType @geometry.STGeometryType() @geometry.STGeometryType()
geometry.GetGeometryN(n) @geometry.STGeometryN(@n + 1) @geometry.STGeometryN(@n + 1)
geometry.InteriorPoint @geometry.STPointOnSurface()
geometry.Intersection(other) @geometry.STIntersection(@other) @geometry.STIntersection(@other)
geometry.Intersects(g) @geometry.STIntersects(@g) @geometry.STIntersects(@g)
geometry.IsEmpty @geometry.STIsEmpty() @geometry.STIsEmpty()
geometry.IsSimple @geometry.STIsSimple()
geometry.IsValid @geometry.STIsValid() @geometry.STIsValid()
geometry.IsWithinDistance(geom, distance) @geometry.STDistance(@geom)<= @distance @geometry.STDistance(@geom)<= @distance
geometry.Length @geometry.STLength() @geometry.STLength()
geometry.NumGeometries @geometry.STNumGeometries() @geometry.STNumGeometries()
geometry.NumPoints @geometry.STNumPoints() @geometry.STNumPoints()
geometry.OgcGeometryType CASE @geometry.STGeometryType() WHEN N'Point' THEN 1 ... End CASE @geometry.STGeometryType() WHEN N'Point' THEN 1 ... End
geometry.Overlaps(g) @geometry.STOverlaps(@g) @geometry.STOverlaps(@g)
geometry.PointOnSurface @geometry.STPointOnSurface()
geometry.Relate(g, intersectionPattern) @geometry.STRelate(@g, @intersectionPattern)
geometry.SRID @geometry.STSrid @geometry.STSrid
geometry.SymmetricDifference(other) @geometry.STSymDifference(@other) @geometry.STSymDifference(@other)
geometry.ToBinary() @geometry.STAsBinary() @geometry.STAsBinary()
geometry.ToText() @geometry.AsTextZM() @geometry.AsTextZM()
geometry.Touches(g) @geometry.STTouches(@g)
geometry.Union(other) @geometry.STUnion(@other) @geometry.STUnion(@other)
geometry.Within(g) @geometry.STWithin(@g) @geometry.STWithin(@g)
geometryCollection[i] @geometryCollection.STGeometryN(@i + 1) @geometryCollection.STGeometryN(@i + 1)
geometryCollection.Count @geometryCollection.STNumGeometries() @geometryCollection.STNumGeometries()
lineString.Count @lineString.STNumPoints() @lineString.STNumPoints()
lineString.EndPoint @lineString.STEndPoint() @lineString.STEndPoint()
lineString.GetPointN(n) @lineString.STPointN(@n + 1) @lineString.STPointN(@n + 1)
lineString.IsClosed @lineString.STIsClosed() @lineString.STIsClosed()
lineString.IsRing @lineString.IsRing()
lineString.StartPoint @lineString.STStartPoint() @lineString.STStartPoint()
multiLineString.IsClosed @multiLineString.STIsClosed() @multiLineString.STIsClosed()
point.M @point.M @point.M
point.X @point.Long @point.STX
point.Y @point.Lat @point.STY
point.Z @point.Z @point.Z
polygon.ExteriorRing @polygon.RingN(1) @polygon.STExteriorRing()
polygon.GetInteriorRingN(n) @polygon.RingN(@n + 2) @polygon.STInteriorRingN(@n + 1)
polygon.NumInteriorRings @polygon.NumRings() - 1 @polygon.STNumInteriorRing()

집계 함수

.NET SQL 추가된 위치
GeometryCombiner.Combine(group.Select(x => x.Property)) CollectionAggregate(Property) EF Core 7.0
ConvexHull.Create(group.Select(x => x.Property)) ConvexHullAggregate(Property) EF Core 7.0
UnaryUnionOp.Union(group.Select(x => x.Property)) UnionAggregate(Property) EF Core 7.0
EnvelopeCombiner.CombineAsGeometry(group.Select(x => x.Property)) EnvelopeAggregate(Property) EF Core 7.0

추가 리소스