转换单个多边形节点协调SQL Server 2008(空间地理)

时间:2015-09-24 13:35:05

标签: sql-server-2008 loops parsing polygon spatial

我在SQL Server 2008中有一组存储为Geography类型的多边形。我的目标是将这些多边形的坐标转换为不同的投影。

我有一个存储过程可以转换一组坐标,但这只能转换具有X和Y值的各个点。

使用WKT我从多边形中提取了各个节点,然后我想分别转换每个节点。然后我可以用我新的变换坐标重建WKT。

有没有人知道解析每个节点的方法,以便我可以逐个转换它们?我的节点字符串看起来像这样(单个点用逗号分隔,空格分隔x和y值):

POLYGON((113.26456971466541 23.094733481094721,113.26615758240223 23.091891178768353,113.27456898987293 23.095562474614567,113.27557750046253 23.093292599234712,113.27634997665882 23.09356893393959,113.27379651367664 23.099440912063049,113.27501960098743 23.102179435943992,113.27381797134876 23.103023186104451,113.27116794884205 23.100940939266334,113.27231593430042 23.098562598885763,113.27319569885731 23.096588840457258,113.26798148453236 23.0943781965919,113.26761670410633 23.095024616306429,113.26671548187733 23.094624922040744,113.26613612473011 23.095503260961348 ,113.26456971466541 23.094733481094721))

1 个答案:

答案 0 :(得分:1)

我看起来像一个SQL游标和一个while循环来取消多边形中的点是你要求的

CREATE PROCEDURE [dbo].[ReprojectPolygons]

AS
 DECLARE geography_cursor CURSOR
 FOR SELECT id, data FROM [MyPolygons] -- where [data] column contains geography data

 -- variables to store data cursor points to
 DECLARE @id INTEGER
 DECLARE @data sys.geography

 -- variables to loop through points in polygon
 DECLARE @pointcount INTEGER
 DECLARE @pointindex INTEGER
 DECLARE @point sys.geography

 -- result WKT from your reprojection
 DECLARE @result VARCHAR(MAX)

 OPEN geography_cursor

 FETCH NEXT FROM geography_cursor 
 INTO @id, @data

 -- loop through polygons    
 WHILE @@FETCH_STATUS = 0
 BEGIN
    SET @pointcount = @data.STNumPoints()
    SET @pointindex = 1 
    SET @result = ''
    -- iterate points in polygon
    WHILE @pointindex <= @pointcount
    BEGIN
        SET @point = @data.STPointN(@pointindex)
        -- process point reprojection here by calling your stored procedure
        -- assuming you're passing the point as an OUTPUT parameter, this example continues using @point as the reprojected value
        if(@pointindex > 1)
            SET @result = @result + ','
        SET @result = @result + CONVERT(VARCHAR, @point.Long) + ' ' + CONVERT(VARCHAR, @point.Lat)
        SET @pointindex = @pointindex + 1
    END
    SET @result = 'POLYGON((' + @result + '))'
    -- do something with reprojected polygon WKT in @result
    FETCH NEXT FROM geography_cursor 
    INTO @id, @data
 END
 CLOSE geography_cursor
 DEALLOCATE geography_cursor
RETURN 0