您是否设法在MULTIPOLYGONS上运行STBuffer?使用SQL Server?

时间:2019-06-03 11:29:12

标签: sql sql-server sqlgeography

在SQL Server地理空间中,我无法为STBuffer运行MULTIPOLYGONS

DECLARE @g geography = geography::STMPolyFromText('MULTIPOLYGON(((1 1, 1 -1, -1 -1, -1 1, 1 1)),((1 1, 3 1, 3 3, 1 1)))', 4326);  

SELECT @g   -- no problem to run
SELECT @g.ToString()  -- no problem to run
SELECT @g.STBuffer(1).ToString();  -- error

返回的错误是:

  

6552消息,第16级,状态1,第64行
  用户定义的执行过程中发生了.NET Framework错误   常规或汇总的“地理”:

     

System.ArgumentException:24144:此操作无法完成   因为实例无效。使用MakeValid转换   实例转换为有效实例。请注意,MakeValid可能会导致积分   几何实例的位置稍微移动。 System.ArgumentException:

1 个答案:

答案 0 :(得分:0)

我认为这是因为您创建的多边形不是有效的geography多边形。尝试使用一组有效的纬度/经度值创建“多边形”。

使用geometry数据类型执行相同的代码似乎可行。

DECLARE @g geometry = geometry::STMPolyFromText('MULTIPOLYGON(((1 1, 1 -1, -1 -1, -1 1, 1 1)),((1 1, 3 1, 3 3, 1 1)))', 4326);  

select 
    geoMultiPolys = @g, 
    geoMultiPolysString = @g.ToString(),
    buffered = @g.STBuffer(1),
    bufferedString = @g.STBuffer(1).ToString(),
    IsValid = @g.STIsValid()

Results

Buffered Spatial Polygon

与此类似,这是地理学作品

DECLARE @g geography = geography::STMPolyFromText('MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)), ((20 35, 10 30, 10 10, 30 5, 45 20, 20 35), (30 20, 20 15, 20 25, 30 20)))', 4326);  

select 
    geoMultiPolys = @g, 
    geoMultiPolysString = @g.ToString(),
    buffered = @g.STBuffer(1),
    bufferedString = @g.STBuffer(1).ToString(),
    IsValid = @g.STIsValid()

valid SQL geography