SQL WKT使用几何图形绘制得很好,但是不能使用地理数据类型绘制

时间:2018-07-24 08:23:26

标签: sql-server geometry geography sqlgeography wkt

我有以下一段代码

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:https://justpaste.it/6qw0a

有人可以向我解释一下,为什么当我将其绘制为几何图形时,它显示得很好,但是当我尝试将其绘制为地理图形时,它却显示了整个世界,而不是一小部分岛屿。

这是屏幕截图: enter image description here

2 个答案:

答案 0 :(得分:1)

您有环向问题。对于地理形状,在边界上指定点的顺序很重要。也就是说,假设一个具有角A,B,C和D的正方形。(A,B,C,D,A)与(A,D,C,B,A)不同。其中一个指定了您的想法,而另一个则定义了一个带有方孔的世界!但是不要难过,这是一个非常常见的“陷阱”!地理数据中。

您的数据在定义其点时不一致。也就是说,有些将岛边界指定为顺时针方向,而另一些则指定为逆时针方向。虽然一切都没有丢失。相信使用您的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();

通过解释,我从索引中从几何集合中挑选出每个单独的几何,同时指定它们,然后通过交叉应用对其进行重新定向,然后使用“如果包络角为地理位置大于90°,​​那么选择(可能是)正确的地理位置可能是错误的。从那里,我将它们全部放入一个UnionAggregate中,将它们全部塞回到一个地理实例中。

最后,在不明显的情况下,Numbers只是我在诸如此类情况下所使用的整数表。

答案 1 :(得分:0)

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

This主题回答了我的问题