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

Gen*_*ene 8 t-sql sql-server geography sql-server-2008-r2

在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)
)
Run Code Online (Sandbox Code Playgroud)

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

是否有一种原生的快速方法从T-SQL中的给定点构建多边形?我找到的解决方案是使用STGeomFromText/ STGeomFomWKB方法创建一个多边形,这对我来说似乎非常麻烦和缓慢.

就像是:

SET @POLY = geometry::STPolyFromPoints(SELECT Position FROM MyPoints)
Run Code Online (Sandbox Code Playgroud)

g2s*_*ver 8

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

CREATE TABLE [dbo].[LongAndLats](
    [Longitude] [decimal](9, 6) NULL,
    [Latitude] [decimal](9, 6) NULL,
    [SortOrder] [int] NULL
    )
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

一些说明:

  • 需要关闭多边形.即.第一点和最后一点应该是相同的.
  • 应该有最低4分.
  • 点的顺序很重要.它应该遵循"左手/英尺规则"(骗来的点之间绘制的线的左侧区域被认为是多边形内)


Tom*_*day 3

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

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

将列连接到 CSV 字符串的 UDF

MSDN - STPolyFromText

  • 我们使用一个函数来连接二进制表示中的点,并在该字符串上调用“STGeomFromWKB”。对于我们的目的来说它已经足够快了,但它仍然很丑陋。 (2认同)