我有一个包含各种已定义多边形的数据库,这些多边形代表商业园地图上建筑物的外部边界。
如果我在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。
任何帮助都能指出我正确的方向。
答案 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 |
我确定该功能可以改进,但它应该会就如何解决这个问题提供一些想法。