在理想情况下,我将在 SQL Server 2012 上运行,并且能够使用 .ShortestLineTo() 函数来查找一条线上与另一点最近的点。我目前能够找到离我的点最近的线 - 但现在我需要找到离我的点最近的点的坐标。
不幸的是,我被困在 SQL Server 2008 R2 上,所以没有使用 .ShortestLineTo() 的选项。
其他人如何在 SQL Server 空间几何类型中实现这一点?
干杯,
马特
在理想情况下,我将在 SQL Server 2012 上运行,并且能够使用 .ShortestLineTo() 函数来查找一条线上与另一点最近的点。我目前能够找到离我的点最近的线 - 但现在我需要找到离我的点最近的点的坐标。
不幸的是,我被困在 SQL Server 2008 R2 上,所以没有使用 .ShortestLineTo() 的选项。
其他人如何在 SQL Server 空间几何类型中实现这一点?
干杯,
马特
迟到的答案,但如果它仍然有帮助(或对其他任何人),您应该能够使用 SQL 2008 执行以下操作。
DECLARE @point GEOMETRY = GEOMETRY::STPointFromText('POINT(0 0)', 0);
DECLARE @line GEOMETRY = GEOMETRY::STLineFromText('POINT(10 10, 20 20)', 0);
SELECT STIntersection(@point.STBuffer(@point.STDistance(@line)));
本质上,您计算两个几何之间的距离,将其用作应该导致几何接触的点上的缓冲区,然后取其交点(点)。
注意@Road 与 geography MULTILINESTRING 相同
SET INITIAL ROAD SEGMENT
SET @Road = geography::STMLineFromText('MULTILINESTRING ((-79.907603999999992 32.851905999999985, -79.907708999999983 32.851751, -79.907879999999992 32.851555999999995, -79.907889999999981 32.851542999999992, -79.907995999999983 32.851461, -79.90813399999999 32.851373999999986, -79.90833499999998 32.851286999999992, -79.908529 32.85121, - 79.909110999999982 32.850974))', 4269);
为新的中点计算获取路段的起点/终点
SET @x1 = CAST(@Road.STStartPoint().Lat AS decimal(11,6))
SET @y1 = CAST(@Road.STStartPoint().Long AS decimal (12,6))
SET @x2 = CAST(@Road.STEndPoint().Lat AS 十进制(11,6))
SET @y2 = CAST(@Road.STEndPoint().Long AS 十进制(12,6))
分配路段中点 LAT/LON
SET @MidPointLat = CAST( ((@x1 + @x2) / 2) AS nvarchar(11))
SET @MidPointLon = CAST( ((@y1 + @y2) / 2) AS nvarchar( 12))
设置初始越野中心
SET @RoadMidPt = geography::STPointFromText('POINT(' + @MidPointLon + ' ' + @MidPointLat + ')', 4269)
计算 .STIntersection 回到道路的缓冲区距离(添加 .02 以确保相交)
SET @RoadMidPtBuffer = @RoadMidPt.STBuffer(@RoadMidPt.STDistance(@Road) + .02)
可能在多个点相交!使用与道路相交的第一个点作为质心
SET @RoadCentroid = @RoadMidPtBuffer.STIntersection(@Road).STPointN(1);
最近道路/线中心
选择的最终新纬度/经度@RoadCentroid.Lat, @RoadCentroid.Long