Sql server 2008 r2 使用SQL Spatial更改行的STEndPoint或STStartpoint

Sql server 2008 r2 使用SQL Spatial更改行的STEndPoint或STStartpoint,sql-server-2008-r2,geometry,line,spatial,point,Sql Server 2008 R2,Geometry,Line,Spatial,Point,我已经构建了SQL空间触发器,这样,如果我们的GIS用户移动一个坑点,那么在坑处结束或开始的管线的端点/起点都会发生改变。我基本上替换了整个几何体 问题是,有些管道不止一个点。在这种情况下,我只想改变端点或起始点,并保持其他点不变,否则其他顶点将丢失。你能设置速记点/标准开始点吗?或者有没有其他方法只改变直线的这些点 下面的代码是我到目前为止的尝试,在尝试递归CTE之后,我放弃了它,因为我无法在该CTE中引用表变量。相反,我建立了一个临时表来存储x和y值。这将是很好的,不必重复脚本4次,但它的工

我已经构建了SQL空间触发器,这样,如果我们的GIS用户移动一个坑点,那么在坑处结束或开始的管线的端点/起点都会发生改变。我基本上替换了整个几何体

问题是,有些管道不止一个点。在这种情况下,我只想改变端点或起始点,并保持其他点不变,否则其他顶点将丢失。你能设置速记点/标准开始点吗?或者有没有其他方法只改变直线的这些点

下面的代码是我到目前为止的尝试,在尝试递归CTE之后,我放弃了它,因为我无法在该CTE中引用表变量。相反,我建立了一个临时表来存储x和y值。这将是很好的,不必重复脚本4次,但它的工程管道将有2至4点。现在,我需要在用户移动坑后,仅更改管道端点/起点的几何体x/y。我明天再看这个

--Create temp table to store X and Y values of pipe vertices
CREATE table #PipeGeom
(
    ID int IDENTITY(1,1) NOT NULL,
    N int,
    X float,
    Y float,
    PipeGMSCKey int 
)

--insert vertices. Most pipes have two points. A few have 4.
DECLARE @VertexCount INT
SET @VertexCount = 1    
INSERT INTO #PipeGeom (N, X, Y, PipeGMSCKey)
SELECT N=@VertexCount, pipe.Geometry_SPA.STPointN(1).STX AS X, pipe.Geometry_SPA.STPointN(1).STY AS Y, pipe.GMSC_Key FROM [Assets_GMSC_Dev].[dbo].[vw_Pipes] pipe
    INNER JOIN [Assets_GMSC_Dev].[dbo].[vw_Pits] pit ON pipe.Geometry_SPA.STDistance(pit.Geometry_SPA) <0.1
    WHERE pit.GMSC_Key = '1481532'
    --UNION ALL
INSERT INTO #PipeGeom (N, X, Y, PipeGMSCKey)    
SELECT N=2, pipe.Geometry_SPA.STPointN(2).STX AS X, pipe.Geometry_SPA.STPointN(2).STY AS Y, pipe.GMSC_Key FROM [Assets_GMSC_Dev].[dbo].[vw_Pipes] pipe
    INNER JOIN [Assets_GMSC_Dev].[dbo].[vw_Pits] pit ON pipe.Geometry_SPA.STDistance(pit.Geometry_SPA) <0.1
    WHERE pit.GMSC_Key = '1481532'
    --UNION ALL
INSERT INTO #PipeGeom (N, X, Y, PipeGMSCKey)    
SELECT N=3, pipe.Geometry_SPA.STPointN(3).STX AS X, pipe.Geometry_SPA.STPointN(3).STY AS Y, pipe.GMSC_Key FROM [Assets_GMSC_Dev].[dbo].[vw_Pipes] pipe
    INNER JOIN [Assets_GMSC_Dev].[dbo].[vw_Pits] pit ON pipe.Geometry_SPA.STDistance(pit.Geometry_SPA) <0.1
    WHERE pit.GMSC_Key = '1481532'
    --UNION ALL
INSERT INTO #PipeGeom (N, X, Y, PipeGMSCKey)    
SELECT N=4, pipe.Geometry_SPA.STPointN(4).STX AS X, pipe.Geometry_SPA.STPointN(4).STY AS Y, pipe.GMSC_Key FROM [Assets_GMSC_Dev].[dbo].[vw_Pipes] pipe
    INNER JOIN [Assets_GMSC_Dev].[dbo].[vw_Pits] pit ON pipe.Geometry_SPA.STDistance(pit.Geometry_SPA) <0.1
    WHERE pit.GMSC_Key = '1481532'

--User moves pit, then get new pit location, which pipe start/endpoint will need to move to.
--New Start and Finish points
DECLARE @PitX FLOAT = (SELECT Geometry_SPA.STX FROM vw_Pits WHERE GMSC_Key = '1481532');
DECLARE @PitY FLOAT = (SELECT Geometry_SPA.STY FROM vw_Pits WHERE GMSC_Key = '1481532');

--need to grab just the endpoint/startpoint of line here and build Geometry String

drop table #PipeGeom

谢谢

这可能不是一个最佳的解决方案,但希望它有用。另外,我在2014/2016年,所以它未在2008年R2上测试

--Initial (Existing) Line
DECLARE @g GEOMETRY =  GEOMETRY::STGeomFromText('LINESTRING(5 5, 20 10, 30 20, 0 50)', 0);

--New Start and Finish points
DECLARE @X1 VARCHAR(2) = '10'
DECLARE @Y1 VARCHAR(2) = '10'
DECLARE @X2 VARCHAR(2) = '20'
DECLARE @Y2 VARCHAR(2) = '20'

DECLARE @Coords NVARCHAR(MAX)
;WITH Points(N, X, Y) AS  
( 
   SELECT 2,  @g.STPointN(2).STX, @g.STPointN(2).STY
   UNION ALL
   SELECT N + 1, @g.STPointN(N + 1).STX, @g.STPointN(N + 1).STY 
   FROM Points GP
   WHERE N < @g.STNumPoints() - 1 
)
SELECT @Coords = COALESCE(@Coords + ', ', '') + CAST(X AS NVARCHAR(50)) + ' ' + CAST(Y AS NVARCHAR(50)) FROM Points


SELECT  GEOMETRY::STGeomFromText('LINESTRING('+@X1+' '+@Y1+', '+@Coords+', '+@X2+' '+@Y2+' '+')', 0) NewGeom

这使用递归CTE将几何体@G的第一个和最后一个单词解析为Nvarchar。将连接新的第一个点和最后一个点,并返回新的几何图形。您可以将其封装在SP或函数中。

能否使用正确的数据库/GIS进行标记?我不知道如何标记。我想用SQL Server 2008标记它,但它似乎不起作用。谢谢。现在就开始测试。我没有在顶部@g声明一个几何体,而是有一个变量表,其中包含与坑相交的管道几何体,因为将有多个结果。我想在下面的点sn,X,Y中引用这个表的结果,这里有@g.STPoint…但是我不能,因为列名不明确。也许您不能从另一个变量引用变量表中的值??用一些示例数据更新问题,我将尝试将代码更改为fitI。我似乎无法发送代码。我得到了唯一一个额外的@user。。。。消息我已经试了一个小时了。单击问题下方的“编辑”并在那里添加示例代码/数据?我几乎可以做到这一点,临时表包含直线的顶点,其中最后一点或第一点是移动点的顶点。有一个问题,我有一个变量,它包含一个几何字符串,该字符串包含顶点减去最后一个或第一个点,以及点顶点。但当使用该变量更新线条几何图形时,SQLServer无法识别它,并表示它至少需要两个参数。当我使用变量中的基础值创建几何体时,它会起作用。我怎样才能避开这件事?设置几何体\u SPA=几何体::STGeomFromText@LINE