SQL WKT 可以很好地绘制几何图形,但不能绘制地理数据类型

SQL WKT draws well with geometry, but not with geography data type

我有如下一段代码

DECLARE @g geometry;
DECLARE @borders geography;   
SET @g = geometry::STGeomFromText('SOME WKT', 0); 
SET @borders = GEOGRAPHY::STGeomFromText(@g.MakeValid().STAsText(),4326)
SELECT @g;
SELECT @borders;

由于太长就不贴了,WKT 可以点赞link:https://justpaste.it/6qw0a

谁能给我解释一下,为什么当我把它画成几何图形时它显示得很好,但是当我试着把它画成地理图形时,它显示的是整个世界而不是一小群岛屿。

截图如下:

您的戒指方向有问题。对于地理形状,您在边界上指定点的顺序很重要。也就是说,想象一个有角 A、B、C 和 D 的正方形。(A, B, C, D, A) 与 (A, D, C, B, A) 不同。其中一个指定了您的想法,而另一个则用一个方形孔定义了世界其他地方!不过别难过,这在地理数据中是很常见的"gotcha!"。

您的数据在定义点的方式上不一致。也就是说,有些将岛屿边界指定为顺时针方向,而另一些则指定为逆时针方向。尽管如此,一切都没有丢失。使用您的 WKT,我相信我能够恢复所需的形状。

DECLARE @wkt varchar(max) = '«your wkt here»';
DECLARE @borders geography;   
SET @borders = GEOGRAPHY::STGeomFromText(@wkt, 4326);

select geography::UnionAggregate(b2.g)
from Util.dbo.Numbers as n
cross apply (
    select @borders.STGeometryN(n.n) as g1,
        @borders.STGeometryN(n.n).ReorientObject() as g2
) as b
cross apply (
    select case when g1.EnvelopeAngle() > 90 then g2 else g1 end as g
) as b2
where n.n <= @borders.STNumGeometries();

作为解释,我通过索引从几何集合中挑选出每个单独的几何图形,指定它,并通过交叉应用重新定向版本,然后使用启发式 "if the envelope angle of the geography is greater than 90°, it's probably mis-oriented" 选择(可能)正确的一个。从那里,我将它们全部放入一个 UnionAggregate 中,以便将它们全部塞回一个地理实例中。

最后,如果不是很明显的话,Numbers 只是 table 个整数,我在诸如此类的情况下使用它。

DECLARE @geom GEOMETRY = 'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))';
DECLARE @geog GEOGRAPHY = @geom.MakeValid().STUnion(@geom.STStartPoint()).STAsText()

This 主题回答了我的问题