Можно ли получить отдельные многоугольники в многоугольнике? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть таблица сервера sql, в которой есть столбец, содержащий География экземпляров.Некоторые из этих примеров 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))

с использованием встроенных функций и без какого-либо анализа строк / регулярных выражений?

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Риф принятого ответа, основанного на множестве.Предполагая, что у вас есть таблица чисел (посмотрите здесь , что это такое и другие примеры, где это может быть полезно), вы можете сделать что-то вроде этого:

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();
0 голосов
/ 19 декабря 2018
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
...