SQL Server 2008返回开始测量和结束测量之间的一行的一部分

SQL Server 2008返回开始测量和结束测量之间的一行的一部分,sql,sql-server,geometry,spatial,Sql,Sql Server,Geometry,Spatial,是否有一个空间函数将返回起始测量和结束测量之间的一部分直线?我有一个表,其中包含使用几何体数据类型的线-称之为Roads。我还有另一个表,它包含From和To列以及一个行标识符——称之为铺装层 道路: 道路ID-几何 1-LineGeom 2-LineGeom 3线几何 路面: 道路ID-从-到 1 - 0 - 10 2 - 25 - 120 3-10-450 使用上面的示例,我想要一个查询,返回RoadID 1的0到10米之间的部分,RoadID 2的25到120米之间的部分,以及RoadID

是否有一个空间函数将返回起始测量和结束测量之间的一部分直线?我有一个表,其中包含使用几何体数据类型的线-称之为Roads。我还有另一个表,它包含From和To列以及一个行标识符——称之为铺装层

道路: 道路ID-几何 1-LineGeom 2-LineGeom 3线几何

路面: 道路ID-从-到 1 - 0 - 10 2 - 25 - 120 3-10-450


使用上面的示例,我想要一个查询,返回RoadID 1的0到10米之间的部分,RoadID 2的25到120米之间的部分,以及RoadID 3的10到450米之间的部分。

不太了解Spatial SQL,但这家伙确实知道

SQL Spatial本机不支持线性引用。使用Esri或Intergraph之类的工具可能会更好。这就是说,你可以创建一个自制的解决方案,将做同样的事情

可以在每个顶点之间循环,跟踪到第一个顶点的距离,根据需要的距离插值位置,然后绘制新线。 我没有测试它,我只是编写了它,所以它可能需要一些调整才能真正工作:

DECLARE @g GEOMETRY = (SELECT TOP 1 Road FROM Roads)

DECLARE @BeginMeasure DECIMAL(10,5) = 1
DECLARE @EndMeasure DECIMAL(10,5) = 5

DECLARE @ReturnLine GEOGRAPHY = NULL

DECLARE @i INT = 1
DECLARE @CumulativeDistance DECIMAL(10,5) = 0

WHILE @i < @g.STNumPoints()
BEGIN
  IF @BeginMeasure BETWEEN @CumulativeDistance AND @CumulativeDistance + @g.STPointN(@i).STDistance(@g.STPointN(@i+1))
  BEGIN
    SET @ReturnLine = GEOMETRY::STPointFromText('POINT(' + 
                                                CAST(
                                                  (@g.STPointN(@i+1).STX - @g.STPointN(@i).STX) -- Change in X
                                                  *((@BeginMeasure-@CumulativeDistance)/@g.STPointN(@i).STDistance(@g.STPointN(@i+1))) --Percent Change in Distance,
                                                AS VARCHAR(10)) --X
                                                + ' ' +
                                                CAST(
                                                  (@g.STPointN(@i+1).STY - @g.STPointN(@i).STY) -- Change in Y
                                                  *((@BeginMeasure-@CumulativeDistance)/@g.STPointN(@i).STDistance(@g.STPointN(@i+1))) --Percent Change in Distance,
                                                AS VARCHAR(10)) --Y
                                                 + ')',0)
  END

  IF @ReturnLine IS NOT NULL
  BEGIN
    IF @ReturnLine.STGeometryType() = 'Point'
    BEGIN
      IF @EndMeasure BETWEEN @CumulativeDistance AND @CumulativeDistance + @g.STPointN(@i).STDistance(@g.STPointN(@i+1))
      BEGIN
        SET @ReturnLine = @ReturnLine.ShortestLineTo(
          GEOMETRY::STPointFromText('POINT(' + 
                                    CAST(
                                      (@g.STPointN(@i).STX - @g.STPointN(@i-1).STX) -- Change in X
                                      *((@BeginMeasure-@CumulativeDistance)/@g.STPointN(@i-1).STDistance(@g.STPointN(@i))) --Percent Change in Distance,
                                    AS VARCHAR(10)) --X
                                    + ' ' +
                                    CAST(
                                      (@g.STPointN(@i).STY - @g.STPointN(@i-1).STY) -- Change in Y
                                      *((@BeginMeasure-@CumulativeDistance)/@g.STPointN(@i-1).STDistance(@g.STPointN(@i))) --Percent Change in Distance,
                                    AS VARCHAR(10)) --Y
                                      + ')',0)
        )
      END
      ELSE
      BEGIN
        SET @ReturnLine = @ReturnLine.ShortestLineTo(@g.STPointN(@i))
      END
    END
    ELSE
    BEGIN
      IF @EndMeasure BETWEEN @CumulativeDistance AND @CumulativeDistance + @g.STPointN(@i).STDistance(@g.STPointN(@i+1))
      BEGIN
        SET @ReturnLine = @ReturnLine.STUnion(@g.STPointN(@i-1).ShortestLineTo(     
          GEOMETRY::STPointFromText('POINT(' + 
                                    CAST(
                                      (@g.STPointN(@i).STX - @g.STPointN(@i-1).STX) -- Change in X
                                      *((@EndMeasure-@CumulativeDistance)/@g.STPointN(@i-1).STDistance(@g.STPointN(@i))) --Percent Change in Distance,
                                    AS VARCHAR(10)) --X
                                    + ' ' +
                                    CAST(
                                      (@g.STPointN(@i).STY - @g.STPointN(@i-1).STY) -- Change in Y
                                      *((@EndMeasure-@CumulativeDistance)/@g.STPointN(@i-1).STDistance(@g.STPointN(@i))) --Percent Change in Distance,
                                    AS VARCHAR(10)) --Y
                                      + ')',0)
        ))
      END
      ELSE
      BEGIN
        SET @ReturnLine = @ReturnLine.STUnion(@g.STPointN(@i-1).ShortestLineTo(@g.STPointN(@i)))
      END
    END
  END 

  SET @CumulativeDistance = @CumulativeDistance + @g.STPointN(@i).STDistance(@g.STPointN(@i+1))
  SET @i = @i + 1
END

SELECT @ReturnLine