2012-03-16 18 views
6

Trong SQL Server của tôi (2008 R2) trên Azure, có một bảng chứa rất nhiều địa lý Points (vĩ độ/kinh độ):Tạo hình đa giác địa lý từ điểm trong T-SQL

CREATE TABLE MyPoints 
(
    Region uniqueidentifier NOT NULL, 
    Number int NOT NULL, 
    Position geography NOT NULL, 
    CONSTRAINT PK_MyPoints PRIMARY KEY(Region, Number) 
) 

Bây giờ tôi muốn tạo a Polygon từ điểm này để xác định, cửa hàng nào của tôi nằm trong khu vực được xác định bởi các điểm.

Có cách nào nhanh và bản địa để xây dựng đa giác từ các điểm đã cho trong T-SQL không? The solutions I found đang sử dụng các phương pháp STGeomFromText/STGeomFomWKB để tạo đa giác, có vẻ rất cồng kềnh và chậm đối với tôi.

Cái gì như:

SET @POLY = geometry::STPolyFromPoints(SELECT Position FROM MyPoints) 

Trả lời

3

Theo như tôi biết, không có chức năng tự nhiên mà phải mất một bảng như tham số và chuyển đổi đó để một đa giác.

Tốt nhất là kết hợp một hàm vô hướng do người dùng xác định để nối một cột kết quả thành một chuỗi được tách riêng bằng dấu phẩy với STPolyFromText mà bạn đã đọc.

UDF to Concatenate Column to CSV String

MSDN - STPolyFromText

+1

Chúng tôi đang sử dụng một chức năng liên kết các điểm trong biểu diễn nhị phân của chúng và gọi 'STGeomFromWKB' trên chuỗi đó. Nó đủ nhanh cho mục đích của chúng tôi, nhưng nó vẫn xấu xí. – Gene

+0

Một gợi ý khác sẽ là viết hàm .NET CLR do người dùng định nghĩa của bạn mà lấy tham số bảng (cột của các điểm Geo thực tế) và trả về một hình học. Tôi đã không làm việc với nó được nêu ra, nhưng SqlGeometryBuilder trông đầy hứa hẹn: http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.types.sqlgeometrybuilder.aspx –

+0

AFAIK không có hỗ trợ cho các chức năng CLR trên SQL Azure. Tôi cũng nghĩ về khả năng đó. – Gene

3

Giả sử chúng ta có một bảng đầy chờ đợi lệnh và lats trong bảng này:

CREATE TABLE [dbo].[LongAndLats](
    [Longitude] [decimal](9, 6) NULL, 
    [Latitude] [decimal](9, 6) NULL, 
    [SortOrder] [int] NULL 
    ) 

này sẽ chuyển đổi những điểm thành một đa giác:

DECLARE @BuildString NVARCHAR(MAX) 
SELECT @BuildString = COALESCE(@BuildString + ',', '') + CAST([Longitude] AS NVARCHAR(50)) + ' ' + CAST([Latitude] AS NVARCHAR(50)) 
FROM dbo.LongAndLats 
ORDER BY SortOrder 

SET @BuildString = 'POLYGON((' + @BuildString + '))'; 
DECLARE @PolygonFromPoints geography = geography::STPolyFromText(@BuildString, 4326); 
SELECT @PolygonFromPoints 

Một số ghi chú:

  • Đa giác cần được đóng. I E. điểm đầu tiên và cuối cùng phải giống nhau.
  • Nên có tối thiểu 4 điểm.
  • Thứ tự của các điểm quan trọng. Nó phải tuân thủ "quy tắc bàn tay/chân trái" (các khu vực nằm ở bên trái của đường kẻ được vẽ giữa các điểm được coi là nằm trong Đa giác)
+0

Tôi sẽ tò mò muốn biết làm thế nào để làm phần phân loại thực tế kể từ khi giải pháp trên của bạn là rất tốt. Cúp của tôi là cách sắp xếp các điểm trong "quy tắc bàn tay/chân trái". Tôi đang kết thúc với một đa giác được chồng lên nhau bởi vì thứ tự lat/long của tôi không đúng. –

+0

ví dụ: 'DECLARE @geom GEOMETRY = ' POLYGON (( -116.77953600883484 \t 33,103710174560547 , -117,03299999237061 \t 32,547900199890137 , -117,11846709251404 \t 33,469111442565918 , -117,38499999046326 \t 33,202700138092041 , -117,38700008392334 \t 33,206999778747559 , -117,39700007438660 \t 33,209300041198730 , -116,77953600883484 \t 33,103710174560547 ))' DECLARE @geog ĐỊA LÝ = @ geom.MakeValid(). STUnion (@ geom.MakeValid(). STStartPoint()). STAsText() chọn @ geog' –

+0

@Smitty, thứ tự nên được biết trước khi chèn vào bảng '[dbo]. [LongAndLats]'. Tôi không biết bất kỳ cách nào để xác định một thứ tự sắp xếp không giao nhau đáng tin cậy nếu các điểm không được đặt hàng, tôi không nghĩ rằng nó có thể bởi vì có thể có n thứ tự sắp xếp có thể. – g2server