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

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

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

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

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

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

类似于:

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

最佳答案

假设我们有一张表,其中充满了有序的长线和拉特线:

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

一些注意事项:

  • 多边形需要闭合。 IE。第一点和最后一点应该相同。
  • 应至少获得 4 分。
  • 要点的顺序很重要。它应该遵循“左手/脚规则”(位于点之间所画线左侧的区域被视为在多边形内部)

关于sql-server - 从 T-SQL 中的点创建地理多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9739433/

相关文章:

python - linux pyodbc 连接错误 "Can' t 打开 lib 'SQL Server Native Client11.0'“

sql - 查询以在 SSRS 图表的事务表上设置固定月份

sql-server - SQL Server 唯一 GUID

c++ - 为什么 SQL Server 将值传递给存储过程中的 OUTPUT 变量?

sql - 获取 SQL 中两个日期之间月份的开始日期和结束日期?

sql-server - 如何检索从 SQL Server 到 VB.NET 受影响的行数?

sql-server - SSRS 并忽略 "having"子句

sql-server - 如何回滚存储过程中的事务?

asp.net - 添加 Pooling=True 和 Integrated Security 会产生什么后果?

sql - 应该在父表还是子表上创建外键?