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