从T-SQL中的点创建地理多边形

时间:2012-03-16 14:48:02

标签: sql-server tsql sql-server-2008-r2 geography

在Azure上的SQL Server(2008 R2)中,有一个包含大量地理Points(纬度/经度)的表格:

CREATE TABLE MyPoints
(
  Region uniqueidentifier NOT NULL,
  Number int NOT NULL,
  Position geography NOT NULL,
  CONSTRAINT PK_MyPoints PRIMARY KEY(Region, Number)
)

现在我想从这些点创建一个Polygon来确定我的哪些商店位于由这些点定义的区域。

是否有一种原生且快速的方法来从T-SQL中的给定点构建多边形? The solutions I found正在使用STGeomFromText / STGeomFomWKB方法创建一个多边形,这对我来说似乎非常麻烦和缓慢。

类似的东西:

SET @POLY = geometry::STPolyFromPoints(SELECT Position FROM MyPoints)

2 个答案:

答案 0 :(得分:6)

假设我们在此表中有一个完整的有序长度和拉数表:

CREATE TABLE [dbo].[LongAndLats](
    [Longitude] [decimal](9, 6) NULL,
    [Latitude] [decimal](9, 6) NULL,
    [SortOrder] [int] NULL
    )

这会将这些点转换为多边形:

DECLARE @BuildString NVARCHAR(MAX)
SELECT @BuildString = COALESCE(@BuildString + ',', '') + CAST([Longitude] AS NVARCHAR(50)) + ' ' + CAST([Latitude] AS NVARCHAR(50))
FROM dbo.LongAndLats
ORDER BY SortOrder

SET @BuildString = 'POLYGON((' + @BuildString + '))';  
DECLARE @PolygonFromPoints geography = geography::STPolyFromText(@BuildString, 4326);
SELECT @PolygonFromPoints

一些注意事项:

  • 需要关闭多边形。即。第一点和最后一点应该是相同的。
  • 应该有4分。
  • 点数的顺序很重要。它应该遵循“左手/脚规则”(位于点之间绘制的线左侧的区域被认为是在多边形内)

答案 1 :(得分:3)

据我所知,没有本机函数将表作为参数并将其转换为多边形。

最好的方法是组合一个标量用户定义函数,将一列结果连接成一个逗号分隔的字符串,其中包含您已经阅读过的STPolyFromText。

UDF to Concatenate Column to CSV String

MSDN - STPolyFromText