Sql 空间记录的迭代查询
我在SQLServer中创建了以下查询Sql 空间记录的迭代查询,sql,sql-server,Sql,Sql Server,我在SQLServer中创建了以下查询 declare @x XML set @x='<Dataset_Extent> <EXTENT_TYPE>Bounding_Polygon</EXTENT_TYPE> <Vertex> <LON>66.91292909247741</LON> <LAT>30.27001012181008</LAT>
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(('+@wkt +'))';
print @wkt
每个Lon/lat对顺序不正确,我需要以下格式的输出:
POLYGON((66.91292909247741 30.27001012181008,66.99456841960638 30.27128639618252,66.99700791329992 30.1509623521339,66.91546772378466 30.14969219541345,66.91292909247741 30.27001012181008))
起始顶点Lon/Lat也应在末端重复,以使多边形闭合
我需要做些什么来解决这些问题?这就可以了
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(('+@wkt +'))';
print @wkt
不太漂亮,但我不知道如何子查询第一个节点。。。祝你好运如果可以,我会尽量避免使用xpath:)在
/Dataset\u 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, '')+
','+@x.value('(/Dataset_Extent/Vertex/LON/text())[1]', 'varchar(50)')+
' '+@x.value('(/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;
那很好。它以多边形((LON-LAT,LON-LAT,LON-LAT,LON-LAT))的格式给我表格中的所有多边形。它大约有300行,将来可能会随着数据的插入而增加。现在,我想对提供的多边形(例如多边形((66.9214310204 30.1191654521,66.9724466643 30.1273507980,66.9612156084 30.1614246796,66.9324719430.1540007613,66.9214310204 30.1191654521))的每个结果行应用STIntersects()函数,以检查它是否与其中任何一个相交。我必须返回所有StinerSects()结果为=1的记录。谢谢
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;