SQL Server-点几何中的线串

如何解决SQL Server-点几何中的线串

是否有一种简便的方法可以在sql中的Points列之外创建Linestring?

例如,我有一个查询

SELECT Geom FROM api.Table WHERE WellId = 'XYZ1234' ORDER BY MeasuredDepth ASC;

返回186点为wkb:

Geom
0xE6100000010CDEB06D5166275AC024B4E55C8A114440
0xE6100000010CE5F21FD26F275AC061FD9FC37C114440
0xE6100000010C4512BD8C62275AC0FCA5457D92114440
0xE6100000010CF33CB83B6B275AC063450DA661144440
0xE6100000010CA56B26DF6C275AC01E32E54350134440
0xE6100000010CBDFBE3BD6A275AC0C1CAA145B6134440
0xE6100000010CB6D617096D275AC03A92CB7F48134440
0xE6100000010CFD82DDB06D275AC04C4F58E201134440
0xE6100000010C9A081B9E5E275AC0041C42959A114440
...

我还可以将这些wkb保存在临时表中,并将其作为文本返回:

POINT (-104.61562 40.137035)
POINT (-104.6162 40.13662)
POINT (-104.61539 40.137283)
POINT (-104.61592 40.15923)
POINT (-104.61602 40.150887)
POINT (-104.61589 40.154)
POINT (-104.61603 40.15065)
POINT (-104.61607 40.148495)
POINT (-104.61515 40.13753)
POINT (-104.61605 40.15017)
...

但是从MSSQL documentation中,我找不到从所有这些点中制作Linestring的任何方法。这是否可能,例如PostGIS ST_MakeLine之类的东西?

解决方法

您可以将Geom列的X和Y属性连接到一个字符串变量中,然后将LINESTRING与该变量中包含的所有点一起使用。

    declare @string varchar(max)

    Select @string = isnull(@string + ',','') + cast(Geom.STX as varchar(20)) + ' ' + cast(Geom.STY as varchar(20))
    from api.Table

    Set @string = 'LINESTRING(' + @string + ')';   

    Select geometry::STLineFromText(@string,4326);
,

接受的答案正是我所要的,但是它会失去升序(基于另一个变量)吗?将其作为输出:

LINESTRING (-104.615 40.1378,-104.615 40.1378,-104.615 40.1377,-104.615 40.1376,...)
,

为订购问题添加第二个答案,您可以遍历带有标识列的表。

在下面的示例中,我将创建一个具有ID标识的表变量,将记录插入该表中,然后迭代并填充字符串。

    declare @points table (Id int identity,Geom geometry)

    Insert into @points (Geom)  
    SELECT Geom 
    FROM api.Table 
    WHERE WellId = 'XYZ1234' 
    ORDER BY MeasuredDepth ASC;

    declare @iterRow    int,@rowCount   int,@string     varchar(max),@x          varchar(20),@y          varchar(20)

    Select  @iterRow = 1,@rowCount = count(1)
    from @points

    While (@iterRow <= @rowCount)
    Begin   
        Select  @x = cast(Geom.STX as varchar(20)),@y = cast(Geom.STY as varchar(20))
        From @points
        where Id = @iterRow
        
        Set @string = isnull(@string + ','') + @x + ' ' + @y

        Set @iterRow += 1
    End

    Set @string = 'LINESTRING(' + @string + ')';   

    Select geometry::STLineFromText(@string,0);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?