从查询中的多边形获取空间点列表
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 |
我确定该功能可以改进,但它应该会给您一些解决此问题的想法。
我有一个数据库,其中包含各种定义的多边形,这些多边形代表商业园区地图上建筑物的外部边界。
如果我在 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 |
我确定该功能可以改进,但它应该会给您一些解决此问题的想法。