Dados espaciais no provedor EF Core do SQL Server
Essa página inclui informações adicionais sobre como usar dados espaciais com o provedor de banco de dados do Microsoft SQL Server. Para obter informações gerais sobre como usar dados espaciais no EF Core, consulte a documentação principal de Dados Espaciais.
Geografia ou geometria
Por padrão, as propriedades espaciais são mapeadas para colunas geography
no SQL Server. Para usar geometry
, configure o tipo de coluna em seu modelo.
Anéis de Polígono de geografia
Ao usar o tipo de coluna, o geography
SQL Server impõe requisitos adicionais ao anel exterior (ou shell) e anéis interiores (ou orifícios). O anel exterior deve ser orientado no sentido anti-horário e os anéis interiores no sentido horário. NetTopologySuite (NTS) valida isso antes de enviar valores para o banco de dados.
FullGlobe
O SQL Server tem um tipo de geometria não padrão para representar o globo completo ao usar o tipo de coluna geography
. Ele também tem uma maneira de representar polígonos baseados no globo completo (sem um anel exterior). Nenhum deles tem suporte do NTS.
Aviso
FullGlobe e polígonos baseados nele não são compatíveis com o NTS.
Curvas
Conforme mencionado na documentação principal de Dados Espaciais, o NTS atualmente não pode representar curvas. Isso significa que você precisará transformar os valores CircularString, CompoundCurve e CurePolygon usando o método STCurveToLine antes de usá-los no EF Core.
Aviso
CircularString, CompoundCurve e CurePolygon não são compatíveis com o NTS.
Mapeamentos de função espacial
Esta tabela mostra quais membros do NTS são convertidos em quais funções SQL. Observe que as traduções variam dependendo se a coluna é do tipo geografia ou geometria.
.NET | SQL (geografia) | SQL (geometria) | Adicionado |
---|---|---|---|
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() |
Funções de agregação
.NET | SQL | Adicionado |
---|---|---|
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 |