可以在多多边形中获得单个多边形吗?

Posted

技术标签:

【中文标题】可以在多多边形中获得单个多边形吗?【英文标题】:Possible to get individual polygons in a multipolygon? 【发布时间】:2018-12-19 17:27:55 【问题描述】:

我有一个 sql server 表,其中有一列包含 Geography 实例。其中一些实例是MultiPolygons。

有什么方法可以从 Multipolygon 中提取单个多边形?

例如 - 如果我有以下多面体:

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))

使用内置函数而不进行某种字符串解析/正则表达式?

【问题讨论】:

【参考方案1】:
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

【讨论】:

【参考方案2】:

基于集合的已接受答案的即兴演奏。假设您有一个数字表(查看 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();

【讨论】:

以上是关于可以在多多边形中获得单个多边形吗?的主要内容,如果未能解决你的问题,请参考以下文章

求问Matlab里inpolygon函数的数学原理。

如何获得多边形的隐藏状态

QPolygon:如何获得多边形的边缘

用户有啥办法可以通过在 c++ 中使用 opengl 来决定他想要绘制的多边形吗?

如何对二维多边形进行二次采样?

单击多边形,然后缩放和居中地图