从查询中的多边形获取空间点列表

Getting list of spatial points from polygon within query

我有一个数据库,其中包含各种定义的多边形,这些多边形代表商业园区地图上建筑物的外部边界。

如果我在 Management Studio 中执行 Select,我会得到类似于以下内容的结果:

LocationCode    LocationPolygon
1               POLYGON((1 1, 2 1, 2 2, 1 2, 1 1))
2               POLYGON((10 10, 20 10, 20 20, 10 20, 10 10))

我想得到的是:

LocationCode    PointX    PointY
1               1         1
1               2         1
1               2         2
1               1         2
2               10        10
etc             etc       etc

我看不到可以在 SQL 查询中使用 SQL 服务器从多边形中提取点的任何地方?我显然可以获取整个多边形,然后在客户端完成其余的工作,但如果可能的话,我宁愿处理 SQL。

如果能为我指明正确的方向,我将不胜感激。

我之前 answered 有过类似的问题,那次我使用用户定义的函数来提取点和 return table。假设 table Locations 定义为:(LocationCode int, LocationPolygon geometry) 那么下面的函数:

CREATE FUNCTION dbo.GetPoints()
RETURNS @ret TABLE (LocationCode INT, PointX INT, PointY INT)
AS
BEGIN
    DECLARE @max INT
    SET @max = (SELECT MAX(LocationPolygon.STNumPoints()) FROM Locations) 

    ;WITH Sequence(Number) AS
    (
        SELECT 1 AS Number
        UNION ALL
        SELECT Number + 1
        FROM Sequence
        WHERE Number < @max
    )
    INSERT INTO @ret 
    SELECT
        l.LocationCode
        ,l.LocationPolygon.STPointN(nums.number).STX AS PointX
        ,l.LocationPolygon.STPointN(nums.number).STY AS PointY
    FROM Locations l, Sequence nums
    WHERE nums.number <= l.LocationPolygon.STNumPoints()
    RETURN
END;

当执行为 SELECT DISTINCT * FROM dbo.GetPoints() ORDER BY LocationCode; 时将给出以下结果(使用您的样本数据):

| LOCATIONCODE | POINTX | POINTY |
|--------------|--------|--------|
|            1 |      1 |      1 |
|            1 |      1 |      2 |
|            1 |      2 |      1 |
|            1 |      2 |      2 |
|            2 |     10 |     10 |
|            2 |     10 |     20 |
|            2 |     20 |     10 |
|            2 |     20 |     20 |

我确定该功能可以改进,但它应该会给您一些解决此问题的想法。

Sample SQL Fiddle