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

时间:2015-01-30 13:46:24

标签: sql-server spatial spatial-query

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

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

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 Server从Polygon中提取点的任何地方?我可以明显地取整个多边形,然后在客户端上完成剩下的工作,但如果可能的话,我宁愿处理SQL。

任何帮助都能指出我正确的方向。

1 个答案:

答案 0 :(得分:4)

我之前answered有一个类似的问题,那时我用一个用户定义的函数来提取点并返回一个表。假设表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