2012-02-01 6 views
5

ho multipoligono che assomiglia a una stella con un buco vuoto in un mezzo: imageCome riempire buchi nel MULTIPOLYGON in SQL Server 2008 CLR spaziale

Come posso trasformare questa multipoligono in un unico poligono o multipoligono che include anche il buco in un centro, ad es riempire il buco (utilizzando SQL Server 2008 CLR)?

WKT della stella vuoto: 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)))

Grazie.

risposta

9

Forse non è il modo più veloce, ma in un modo che si potesse fare:

  1. Compute una geometria che contiene il vostro input: Usa STConvexHull, che restituisce un singolo poligono che contiene l'intera geometria di ingresso, includendo entrambe le regioni vuote all'interno della geometria e le concavità esterne alla geometria (come le regioni tra i punti della stella).
  2. Trova le regioni vuote: Usa STDifferenza, sottraendo l'input dallo scafo convesso, che restituirà i poligoni per quelle regioni vuote precedentemente menzionate.
  3. Determinare quali regioni vuote sono al di fuori il vostro input: Usa STBoundary per ottenere i limiti della convesso. Una regione è all'interno della geometria di input se e solo se non tocca i limiti dello scafo convesso. Utilizzare STTouches per verificare.
  4. Calcola l'unione della geometria e le interne regioni vuote: Usa STUnion.

Ecco uno script di esempio:

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 
+0

Grazie Michael per una soluzione eccellente! – Ross

+0

@ user1181846 Assolutamente - per favore considera di accettarlo come risposta se sei soddisfatto. –

+0

Questo è oro assoluto. Grazie! – KOGI