sql - 从 SQL Server 2012 中具有几何数据的表中将坐标划分为 X 和 Y 坐标

标签 sql sql-server tsql split sqlgeometry

我有一个表,其中有一列 Shapegeometry 数据类型。

这是 Shape 中的数据:

POLYGON ((565542.98375 2127263.4997410, 565538.48450 2127261.3187302, 565541.96658 2127254.1162, 565546.465835 2127256.297297, 565542.9837 2127263.49974102))
POLYGON ((565547.281621307 2127097.9410014, 565549.457915 2127093.43948425, 565553.577449391 2127084.9189882, 565568.882475 2127092.31709055, 565562.586805441 2127105.3404182, 565547.2816807 2127097.94105044))

等等....

我需要输出为

ID | X               | Y 
---+-----------------+-----------------
1  | 565542.98375    | 2127263.4997410
1  | 565538.48450    | 2127261.3187302 
1  | 565541.96658    | 2127254.1162 
1  | 565546.465835   | 2127256.297297 
1  | 565542.9837     | 2127263.49974102 
2  | 565547.281627   | 2127097.9410014 
2  | 565549.457915   | 2127093.43948425 
2  | 565553.5774391  | 2127084.9189882

以表格形式依此类推

最佳答案

如果您首先创建一个 Numbers 表,其中包含从 1 向上的连续整数,并且行数至少与您将要处理的最大点数一样多,那么这很简单。

SELECT S.id,
       X = S.GeomCol1.STPointN(N.number).STX,
       Y = S.GeomCol1.STPointN(N.number).STY
FROM   SpatialTable S
JOIN   Numbers N
ON     N.number <= S.GeomCol1.STNumPoints()

创建和填充数字表的代码如下。

CREATE TABLE dbo.Numbers(Number INT PRIMARY KEY);

WITH E1(N) AS 
(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
)                                       -- 1*10^1 or 10 rows
, E2(N) AS (SELECT 1 FROM E1 a, E1 b)   -- 1*10^2 or 100 rows
, E4(N) AS (SELECT 1 FROM E2 a, E2 b)   -- 1*10^4 or 10,000 rows
, E8(N) AS (SELECT 1 FROM E4 a, E4 b)   -- 1*10^8 or 100,000,000 rows
, Nums AS (SELECT TOP (10000000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS N FROM E8)
INSERT INTO dbo.Numbers
SELECT N
FROM Nums 

关于sql - 从 SQL Server 2012 中具有几何数据的表中将坐标划分为 X 和 Y 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53969873/

相关文章:

mysql - 扩展以根据数据范围选择

sql - 对于多个 sql order by 子句,即使之前的 order by 已经证明行不相等,所有的 order bys 是否都运行?

sql - T-SQL : How to Select Values in Value List that are NOT IN the Table?

sql - 如何选择每个类别中价格最高的产品?

sql - 如何按列的一部分排序?

sql - 合并主键 - 级联更新

sql - 2 个错误 : The multi-part identifier "inserted.name" could not be bound

sql-server - 在数据仓库场景中使用WITH(NOLOCK)有什么缺点

c# - 从存储过程中以SQL返回字符串

sql - 如何使用 t-sql 检查逻辑项组合?