【问题标题】:Getting list of spatial points from polygon within query从查询中的多边形获取空间点列表
【发布时间】:2015-01-30 13:46:24
【问题描述】:

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

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

感谢您为我指明正确方向的任何帮助。

【问题讨论】:

  • 只是好奇您是否有机会尝试我的答案?
  • @jpw - 很抱歉没有回复你 - 我保证明天我会试一试,让你知道进展如何!
  • 不用担心,就像我说的,我只是想看看它是否适合你。

标签: sql-server spatial spatial-query


【解决方案1】:

我之前有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

【讨论】:

  • 添加OPTION (MAXRECURSION 0)以防止几何体超过100点时出现“语句完成前最大递归100已用完”错误。
猜你喜欢
  • 1970-01-01
  • 2012-08-23
  • 2021-10-13
  • 2016-06-11
  • 2018-12-13
  • 2012-06-19
  • 1970-01-01
  • 2017-05-12
  • 2020-02-11
相关资源
最近更新 更多