2012-02-01 34 views
5

Tôi có multipolygon trông giống như một ngôi sao với một lỗ trống ở giữa một: imageLàm thế nào để lấp đầy lỗ hổng trong MULTIPOLYGON trong SQL Server 2008 CLR không gian

Làm thế nào để chuyển đổi multipolygon này thành một đa giác đơn hoặc multipolygon rằng cũng bao gồm các lỗ ở giữa, ví dụ điền vào lỗ (sử dụng SQL Server 2008 CLR)?

WKT của ngôi sao rỗng: 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)))

Cảm ơn bạn.

Trả lời

9

Có lẽ không phải là cách nhanh nhất, nhưng một trong những cách mà bạn có thể làm điều đó:

  1. Tính một hình học có chứa đầu vào của bạn: Sử dụng STConvexHull, mà trả về một đa giác đơn có chứa toàn bộ hình học đầu vào của bạn, bao gồm cả các vùng trống bên trong hình học và các vùng đồng bên ngoài hình học (chẳng hạn như các vùng giữa các điểm của ngôi sao của bạn).
  2. Tìm các vùng trống: Sử dụng STDifference, trừ đầu vào từ thân lồi, sẽ trả về đa giác cho những vùng trống được đề cập trước đó.
  3. Xác định khu vực trống nằm ngoài đầu vào của bạn: Sử dụng STB để lấy các giới hạn của vỏ lồi. Một vùng nằm bên trong hình dạng đầu vào của bạn nếu và chỉ khi nó không chạm vào các giới hạn của vỏ lồi. Sử dụng STTouches để kiểm tra.
  4. Tính toán liên minh hình học của bạn và vùng trống bên trong: Sử dụng STUnion.

Dưới đây là một đoạn mã ví dụ:

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

Cảm ơn bạn Michael cho một giải pháp tuyệt vời! – Ross

+0

@ user1181846 Tuyệt đối - hãy xem xét chấp nhận nó làm câu trả lời nếu bạn hài lòng. –

+0

Đây là vàng tuyệt đối. Cảm ơn bạn! – KOGI

Các vấn đề liên quan