可以在多多边形中获得单个多边形吗?
Possible to get individual polygons in a multipolygon?
我有一个 sql 服务器 table,其中有一列包含 Geography instances. Some of these instances are MultiPolygons。
有什么方法可以从多边形中提取单个多边形吗?
例如 - 如果我有以下多面体:
MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)), ((20 35, 10 30, 10 10, 30 5, 45 20, 20 35), (30 20, 20 15, 20 25, 30 20)))
是否可以获取单个多边形:
POLYGON((40 40, 20 45, 45 30, 40 40))
POLYGON((20 35, 10 30, 10 10, 30 5, 45 20, 20 35), (30 20, 20 15, 20 25, 30 20))
使用内置函数而不做某种字符串 parsing/regex?
Declare @MultiGeom Geometry
Set @MultiGeom = 'MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)), ((20 35, 10 30, 10 10, 30 5, 45 20, 20 35), (30 20, 20 15, 20 25, 30 20)))'
DECLARE @n int = 1;
WHILE (@n <= @MultiGeom.STNumGeometries())
BEGIN
Print Convert(VarChar(4000), (@MultiGeom.STGeometryN(@n)))
SET @n = @n + 1;
END
基于集合的已接受答案的重复。假设您有一个数字 table(查看 here 这是什么以及其他可能有用的示例),您可以这样做:
declare @g geometry = geometry::STGeomFromText('
MULTIPOLYGON (
((40 40, 20 45, 45 30, 40 40)),
((20 35, 10 30, 10 10, 30 5, 45 20, 20 35), (30 20, 20 15, 20 25, 30 20))
)', 0);
select @g.STGeometryN(n.n).ToString()
from dbo.Numbers as n
where n <= @g.STNumGeometries();
我有一个 sql 服务器 table,其中有一列包含 Geography instances. Some of these instances are MultiPolygons。
有什么方法可以从多边形中提取单个多边形吗?
例如 - 如果我有以下多面体:
MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)), ((20 35, 10 30, 10 10, 30 5, 45 20, 20 35), (30 20, 20 15, 20 25, 30 20)))
是否可以获取单个多边形:
POLYGON((40 40, 20 45, 45 30, 40 40))
POLYGON((20 35, 10 30, 10 10, 30 5, 45 20, 20 35), (30 20, 20 15, 20 25, 30 20))
使用内置函数而不做某种字符串 parsing/regex?
Declare @MultiGeom Geometry
Set @MultiGeom = 'MULTIPOLYGON (((40 40, 20 45, 45 30, 40 40)), ((20 35, 10 30, 10 10, 30 5, 45 20, 20 35), (30 20, 20 15, 20 25, 30 20)))'
DECLARE @n int = 1;
WHILE (@n <= @MultiGeom.STNumGeometries())
BEGIN
Print Convert(VarChar(4000), (@MultiGeom.STGeometryN(@n)))
SET @n = @n + 1;
END
基于集合的已接受答案的重复。假设您有一个数字 table(查看 here 这是什么以及其他可能有用的示例),您可以这样做:
declare @g geometry = geometry::STGeomFromText('
MULTIPOLYGON (
((40 40, 20 45, 45 30, 40 40)),
((20 35, 10 30, 10 10, 30 5, 45 20, 20 35), (30 20, 20 15, 20 25, 30 20))
)', 0);
select @g.STGeometryN(n.n).ToString()
from dbo.Numbers as n
where n <= @g.STNumGeometries();