Thay đổi độ đa giác của chế độ truyền tay nhau cho SQL 2008 (thứ tự đỉnh đa giác đảo ngược)


11

Tôi có vài trăm hình dạng polygonmultipolygonmỗi hình bao gồm hàng chục nghìn điểm mà tôi đang cố gắng truy cập vào SQL 2008.

Thật không may, các hình dạng mà tôi đã cố gắng nhập là "thuận tay phải" (chu vi của mỗi hình được vẽ theo chiều kim đồng hồ xung quanh các điểm mà nó chứa). Máy chủ SQL giả định hình dạng "thuận tay trái" (ngược chiều kim đồng hồ xung quanh bên trong), ít nhất là cho geographycác loại. Điều này có nghĩa là SQL giả định rằng tôi đang cố gắng chọn toàn bộ trái đất ngoại trừ hình dạng của tôi. Một số người mô tả đây là hình dạng "từ trong ra ngoài".

Từ MSDN , một cách bực bội không nói nên sử dụng định hướng vòng nào:

Nếu chúng ta sử dụng geographykiểu dữ liệu để lưu trữ thể hiện không gian, chúng ta phải chỉ định hướng của vòng và mô tả chính xác vị trí của thể hiện.

Nếu bạn sử dụng hướng vòng sai trong SQL 2008, nó sẽ gặp lỗi sau (nhấn mạnh vào tôi):

Đã xảy ra lỗi .NET Framework trong khi thực hiện quy trình do người dùng xác định hoặc tổng hợp "địa lý": Microsoft.SqlServer.Types.GLArgumentException: 24205: Đầu vào được chỉ định không đại diện cho một trường hợp địa lý hợp lệ vì nó vượt quá một bán cầu duy nhất. Mỗi trường hợp địa lý phải phù hợp bên trong một bán cầu. Một lý do phổ biến cho lỗi này là một đa giác có hướng vòng sai.

Nhập các hình dạng geometrythay vì geographyhoạt động tốt, nhưng tôi muốn sử dụng geographynếu có thể.

Trong SQL 2012, nó có vẻ khá tầm thường để khắc phục vấn đề này, nhưng tôi bị ràng buộc với năm 2008.

Làm thế nào tôi nên chuyển đổi các hình dạng?


1
+1 câu hỏi tuyệt vời ... bạn có một liên kết trong đó nói rằng máy chủ Sql giả định hình dạng thuận tay trái?
Kirk Kuykendall

@Kirk Cảm ơn. Tôi gặp khó khăn khi tìm tài liệu chính thức, nhưng tôi có thể liên kết với MSDN nơi có thông báo "định hướng vòng" (mặc dù nó không nói cách sử dụng nào). Tôi cũng sẽ gặp lỗi khi gặp sự cố.
Michael - Clay Shirky

Câu trả lời:


14

Blog của Spatial Ed đã có một giải pháp ngắn gọn. Đây là một số SQL biểu thị biến đổi:

DECLARE @geom GEOMETRY = 'POLYGON ((0 0, 10 0, 10 10, 0 10, 0 0))';
DECLARE @geog GEOGRAPHY = @geom.MakeValid().STUnion(@geom.STStartPoint()).STAsText()

Và một đoạn trích từ bài viết của Ed:

Chìa khóa cho hành vi này là STUnion()phương pháp. Vì đây là một phương thức dựa trên OGC, hoạt động trên toàn bộ hình học cho một tính năng nhất định, nó buộc các đa giác vào hướng cần thiết cho phương thức mà chỉ là phương thức được sử dụng cho Geographyloại [...]. Phương pháp này được minh họa là khá hiệu quả, giữ cho chi phí nhỏ [...].


2
Trên SQL Server 2008 r2, tôi đã phải đặt .MakeValid () vào bên trong STUnion () để làm việc này hoạt động: .STUnion (@ geom.MakeValid (). STStartPoint ())
Chris Smith

@Smitty Điều đó có ý nghĩa đối với các trường hợp SQL không thể xác định điểm bắt đầu. Có lẽ nếu hình dạng tăng gấp đôi trở lại chính nó hoặc các trường hợp kỳ lạ khác?
Michael - Clay Shirky ở đâu

Vâng, trong hoàn cảnh của tôi, hình dạng là hoàn hảo và chồng chéo lên nhau.
Chris Smith

0

Trong> = SQL Server 2012, phương thức ReorientObject () sẽ thực hiện điều này. Đối với <SQL Server 2012, bên dưới là một phương pháp thay thế.

Đối với một @g SQL địa lý hiện có, mã dưới đây sẽ trích xuất các điểm và tái tạo một đa giác với điểm (đỉnh) theo thứ tự ngược:
(Chú ý 1: hoạt động cho đa giác đơn giản, không phải cho multipolygons hoặc đa giác với vòng / centroids)
(Chú ý 2: sử dụng hệ tọa độ SRID 4326 (WGS 84))

--For existing geography @g
DECLARE @GeometryText varchar(max), @ReversedPolygon geography
DECLARE @GeometryType varchar(20) = 'POLYGON', @Count int
SET @Count = @g.STNumPoints()
WHILE @Count > 0
BEGIN
    SET @GeometryText = @GeometryText + CONVERT(varchar(30),CONVERT(decimal(12,8),@g.STPointN(@Count).Long)) + ' ' + CONVERT(varchar(30),CONVERT(decimal(12,8),@g.STPointN(@Count).Lat))
    SET @Count = @Count - 1
    IF @Count > 0 SET @GeometryText = @GeometryText + ','
END
SET @GeometryText = @GeometryType +'((' + @GeometryText + '))'
SET @ReversedPolygon = geography::STGeomFromText(@GeometryText, 4326); 

0

Có vẻ như tôi có thể sử dụng một số phép lai giữa SQL và C # từ SQL Server Spatial Tools , như được đề xuất trên Stack Overflow .

Lưu ý: Tại thời điểm câu trả lời này được đăng, không có nhiều thông tin ngoài kia. Vui lòng không thử phương pháp này trừ khi bạn đã cần Công cụ không gian SQL Server cho thứ khác. Thay vào đó, hãy thử một trong những câu trả lời khác tại đây hoặc trên Stack Overflow .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.