2014-09-04 31 views
3

我在SQL Server中创建以下查询迭代查询的空间记录

declare @x XML 
set @x='<Dataset_Extent> 
     <EXTENT_TYPE>Bounding_Polygon</EXTENT_TYPE> 
     <Vertex> 
     <LON>66.91292909247741</LON> 
     <LAT>30.27001012181008</LAT> 
     <X>299232</X> 
     <Y>3350549</Y> 
     <COL>1</COL> 
     <ROW>1</ROW> 
     </Vertex> 
     <Vertex> 
     <LON>66.99456841960638</LON> 
     <LAT>30.27128639618252</LAT> 
     <X>307089.5</X> 
     <Y>3350549</Y> 
     <COL>15715</COL> 
     <ROW>1</ROW> 
     </Vertex> 
     <Vertex> 
     <LON>66.99700791329992</LON> 
     <LAT>30.1509623521339</LAT> 
     <X>307089.5</X> 
     <Y>3337207.5</Y> 
     <COL>15715</COL> 
     <ROW>26683</ROW> 
     </Vertex> 
     <Vertex> 
     <LON>66.91546772378466</LON> 
     <LAT>30.14969219541345</LAT> 
     <X>299232</X> 
     <Y>3337207.5</Y> 
     <COL>1</COL> 
     <ROW>26683</ROW> 
     </Vertex> 
     <Center> 
     <LON>66.9549932872921</LON> 
     <LAT>30.21048776638499</LAT> 
     <X>303160.75</X> 
     <Y>3343878.25</Y> 
     <COL>7858</COL> 
     <ROW>13342</ROW> 
     </Center> 
    </Dataset_Extent>'; 
declare @wkt varchar(8000); 
select @wkt=CONVERT(varchar(7000),@x.query('distinct-values(
for $lon in /Dataset_Extent/Vertex/LON/text() 
for $lat in /Dataset_Extent/Vertex/LAT/text() 
return ($lon cast as xs:string?,$lat cast as xs:string?,",")) 
')); 

--concatenate the word POLYGON 
set @wkt='POLYGON(('[email protected] +'))'; 
print @wkt 

这给了我下面的输出:

POLYGON((66.91292909247741 66.99456841960638 30.27128639618252 66.99700791329992 66.91546772378466 30.27001012181008,30.1509623521339 30.14969219541345)) 

每个经度/纬度对不按照正确的顺序,我需要输出格式如下:

POLYGON((66.91292909247741 30.27001012181008,66.99456841960638 30.27128639618252,66.99700791329992 30.1509623521339,66.91546772378466 30.14969219541345,66.91292909247741 30.27001012181008)) 

起始顶点Lon/Lat也应该在结尾重复以使多边形关闭。

我需要做什么来解决这些问题?

回答

1

这将做的工作......

DECLARE @wkt NVARCHAR(MAX) 
SELECT @wkt = COALESCE(@wkt + ',' + char(13), '') 
+ concat(convert(varchar, x.query('./LON/text()')),' ', convert(varchar,x.query('./LAT/text()'))) 
from @x.nodes('/Dataset_Extent/Vertex') as t(x) 

select @wkt = COALESCE(@wkt + ',' + char(13), '') 
+ concat(convert(varchar, x.query('./LON/text()')),' ', convert(varchar,x.query('./LAT/text()'))) 
from @x.nodes('/Dataset_Extent/Vertex[1]') as t(x) 

set @wkt='POLYGON(('[email protected] +'))'; 
print @wkt 

不完全是美丽的,但我不能弄清楚如何子查询中的第一个节点...祝你好运!我尽量避免xpath,如果我可以:)

1

/Dataset_Extent/Vertex上粉碎XML并使用for xml path技巧构建字符串。

declare @wkt varchar(8000); 

set @wkt = 'POLYGON((' + 
      stuff((select ','+T.X.value('(LON/text())[1]', 'varchar(50)')+ 
         ' '+T.X.value('(LAT/text())[1]', 'varchar(50)') 
        from @x.nodes('/Dataset_Extent/Vertex') as T(X) 
        for xml path('')), 1, 1, '')+ 
      ','[email protected]('(/Dataset_Extent/Vertex/LON/text())[1]', 'varchar(50)')+ 
      ' '[email protected]('(/Dataset_Extent/Vertex/LAT/text())[1]', 'varchar(50)')+ 
      '))'; 

对一张桌子,它会看起来像这样。

select 'POLYGON((' + 
     stuff((select ','+T.X.value('(LON/text())[1]', 'varchar(50)')+ 
         ' '+T.X.value('(LAT/text())[1]', 'varchar(50)') 
       from X.XMLData.nodes('/Dataset_Extent/Vertex') as T(X) 
       for xml path('')), 1, 1, '')+ 
     ','+X.XMLData.value('(/Dataset_Extent/Vertex/LON/text())[1]', 'varchar(50)')+ 
     ' '+X.XMLData.value('(/Dataset_Extent/Vertex/LAT/text())[1]', 'varchar(50)')+ 
     '))' 
from XMLFiles as X; 
+0

这很好。它以POLYGON格式((LON LAT,LON LAT,LON LAT,LON LAT))给我所有的POLYGONS。它约有300行,未来可能会随着插入数据而增加。现在我想对我提供的多边形应用每个结果行的STIntersects()函数,例如POLYGON((66.9214310204 30.1191654521,66.9724466643 30.1273507980,66.9612156084 30.1614246796,66.9324717194 30.1540007613,66.9214310204 30.1191654521)),以检查它是否与它们中的任何一个相交。我必须返回STIntersects()结果= 1的所有记录。谢谢 – user3125776 2014-09-05 12:03:44