2012-02-01 18 views
5

tengo varios polígonos que se parece a una estrella con un agujero vacío en un medio: imageCómo llenar agujeros en MULTIPOLYGON en SQL Server 2008 CLR espacial

¿Cómo transformar esta geometría varios en un solo polígono o varios polígonos que también incluye el agujero en un medio, por ejemplo llenar el agujero (utilizando SQL Server 2008 CLR)?

WKT de la estrella vacía: MULTIPOLYGON (((-75,850724788384952 39.781027647924496, 39.777165541462658 -75,847514688412119, -75.835440819564724 39.781232982437771, 39.781027647924496 -75,850724788384952)), ((-75,861083592601616 39.772592386436379, 39.764081172000729 -75,836642464570019, -75.847514688412119 39.777165541462658, 39.772592386436379 -75,861083592601616 , -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)))

Gracias.

Respuesta

9

Quizás no sea la forma más rápida, pero de una manera que podría hacerlo:

  1. Calcular una geometría que contiene su entrada: Uso STConvexHull, que devuelve un único polígono que contiene la geometría de entrada entera, incluidas las regiones vacías dentro de la geometría y las concavidades fuera de la geometría (como las regiones entre los puntos de su estrella).
  2. Encuentra las regiones vacías: Usa STDifference, restando la entrada del casco convexo, que devolverá polígonos para las regiones vacías mencionadas anteriormente.
  3. Determine qué regiones vacías están fuera de su entrada: Use STBoundary para obtener los límites del casco convexo. Una región está dentro de su geometría de entrada si y solo si no toca los límites del casco convexo. Use STTouches para verificar.
  4. Calcule la unión de su geometría y las regiones vacías internas: Use STUnion.

Aquí es un script de ejemplo:

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

Gracias Michael por una solución excelente! – Ross

+0

@ user1181846 Absolutamente, por favor considere aceptarlo como respuesta si está satisfecho. –

+0

Esto es oro absoluto. ¡Gracias! – KOGI