首页 > 解决方案 > 您是否设法在 MULTIPOLYGONS 上运行 STBuffer ?使用 SQL Server?

问题描述

在 SQL Server 地理空间中,我无法运行STBufferfor 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

返回的错误是:

消息 6522,级别 16,状态 1,第 64
行在执行用户定义的例程或聚合“地理”期间发生 .NET Framework 错误:

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

标签: sqlsql-serversqlgeography

解决方案


我认为这是因为您创建的多边形不是有效的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()

结果

缓冲空间多边形

同样,这个适用于地理

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()

有效的 SQL 地理


推荐阅读