Как заполнить дыры в MULTIPOLYGON в SQL Server 2008 пространственной CLR - PullRequest
6 голосов
/ 01 февраля 2012

У меня есть мультиполигон, который выглядит как звезда с пустой дырой в середине: изображение

Как мне преобразовать этот мультиполигон в один полигон или мультиполигон, который также включает в себя отверстие в середине, например, заполнить дыру (используя SQL Server 2008 CLR)?

WKT пустой звезды: MultiPolygon (((-75,850724788384952 39,781027647924496, -75,847514688412119 39,777165541462658, -75,835440819564724 39,781232982437771, -75,850724788384952 +39,781027647924496)), ((-75,861083592601616 +39,772592386436379, -75,836642464570019 39,764081172000729, -75,847514688412119 39,777165541462658, -75,861083592601616 +39,772592386436379, -75,861083592601616 +39,772592386436379)), ((-75,866832035574916 +39,780809081927849, -75,850724788384952 39,781027647924496, -75,857585145413083 +39,78927966926625, -75,866832035574916 39,780809081927849)), ((-75,8843643235475 +39,764740937261692, -75,861083592601616 39,772592386436379, -75,8717486771904 39,776304058191712, -75,8843643235475 39,764740937261692)), ((-75,884021002483152 +39,780573380153484, -75,8717486771904 39,776304058191712, -75,866832035574916 39,780809081927849, -75.884021002483152 39.780573380153484)))

Спасибо.

1 Ответ

11 голосов
/ 01 февраля 2012

Может быть, не самый быстрый способ, но один из способов, которым вы могли бы это сделать:

  1. Вычислить геометрию, содержащую ваш ввод : Использовать STConvexHull, который возвращает один многоугольник, которыйсодержит всю входную геометрию, включая как пустые области внутри геометрии, так и вогнутости за пределами геометрии (например, области между точками вашей звезды).
  2. Поиск пустых областей : использованиеSTDifference, вычитая входные данные из выпуклой оболочки, которая будет возвращать полигоны для тех пустых областей, которые были упомянуты ранее.
  3. Определить, какие пустые области находятся за пределами вашего ввода : Используйте STBoundary, чтобы получить границывыпуклый корпус.Область находится внутри входной геометрии тогда и только тогда, когда она не касается границ выпуклой оболочки.Используйте STTouches для проверки.
  4. Вычислите объединение вашей геометрии и внутренних пустых областей : Используйте STUnion.

Вот пример сценария:

DECLARE @g geometry;
DECLARE @hull geometry;
DECLARE @regions geometry;
DECLARE @boundary geometry;

SET @g = geometry::STGeomFromText(...);
SET @hull = @g.STConvexHull();
SET @regions = @hull.STDifference(@g);
SET @boundary = @hull.STBoundary();

WITH Geoms AS
(
    SELECT 1 i

    UNION ALL 

    SELECT i + 1
    FROM Geoms
    WHERE i < @regions.STNumGeometries()
)
SELECT @g = @g.STUnion(@regions.STGeometryN(i))
FROM Geoms
WHERE @regions.STGeometryN(i).STTouches(@boundary) = 0

SELECT @g
...