在一个理想的世界中,我将在SQL Server 2012上运行并能够使用.ShortestLineTo()函数来查找一行上最近的点,即另一点的点。我目前能够找到最接近我的点的线 - 但现在我需要找到最接近我的点的点的坐标。
不幸的是我被困在SQL Server 2008 R2上,因此没有选择使用.ShortestLineTo()。
其他人如何在SQL Server Spatial Geometry类型中实现此目的?
干杯,
马特
答案 0 :(得分:0)
迟到的答案,但如果它仍有帮助(或对其他任何人),您应该能够使用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)));
基本上,您计算两个几何之间的距离,将其用作应该导致几何图形接触的点的缓冲区,并取相交点(点)。
答案 1 :(得分:0)
注意@Road与地理位置MULTILINESTRING相同
设置初始道路段
SET @Road = geography :: STMLineFromText(' MULTILINESTRING((-79.907603999999992 32.851905999999985,-79.907708999999983 32.851751, - 79.907879999999999 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()。长AS十进制(12,6))
SET @ x2 = CAST(@ Road.STEndPoint()。Lat AS decimal(11,6))
SET @ y2 = CAST(@ Road.STEndPoint()。长AS十进制(12,6))
分配道路中段LAT / LON
SET @MidPointLat = CAST(((@ x1 + @ x2)/ 2)AS nvarchar(11))
SET @MidPointLon = CAST(((@ y1 + @ y2)/ 2)AS nvarchar(12))
设置IN INTITIAL OFF ROAD CENTROID
SET @RoadMidPt = geography :: STPointFromText(' POINT(' + @MidPointLon +'' + @MidPointLat +')&#39 ;,4269)
计算缓冲距离返回道路.STIntersection (添加.02以确保交叉)
SET @RoadMidPtBuffer = @ RoadMidPt.STBuffer(@ RoadMidPt.STDistance(@ Road)+ .02)
可能在多个点交叉!使用与道路相交的第一个点作为质心
SET @RoadCentroid = @ RoadMidPtBuffer.STIntersection(@ Road).STPointN(1);
最新的道路/线路中心的最新/最长
SELECT @ RoadCentroid.Lat,@ RoadCentroid.Long