TSQL - 获取线串上与点的最近坐标

时间:2017-09-08 03:29:06

标签: sql-server tsql gis

考虑过于简单的例子:POINT(0 0)和LINESTRING(1 -10,110)

到POINT线的最近点是1,0。

如何在TSQL中确定这一点?我的简单,不完全准确的方法是制作线串(POINT POINT)并延伸出一个坐标的X坐标,直到两个线串相交。

所以:

  1. 线串(0 0,0.25 0)(无交叉)
  2. 线串(0 0,0.5 0)(不相交)
  3. 线串(0 0,0.75 0)(无交叉)
  4. 线串(0 0,1 0)(交点 - 所以1 0是最接近POINT的点
  5. 这种准效果,但似乎并不是最优秀/更高效的方式来实现这一目标。

    例如,一个低效率是我向一个方向移动(正增量),如果没有匹配(在x尝试之后),那么我将重新开始,但是以负增量。

    为了优化,我尝试移动更大的步骤,然后当相交时(可能已超过该点),我退出1增量并从那里以较小的增量开始。我这样做了几次 - 而不是以微小的增量进行,以免过度超调。

    基于我的处理,一个可接受的假设是POINT将位于LINESTRING的旁边(左/右)。

    另一个可接受的假设是LINESTRING与POINT相当“垂直”。

1 个答案:

答案 0 :(得分:2)

我认为你可以用数学方法做到这一点,而不是用蛮力迭代算法。

get closest point to a line的帖子描述了该方法。

我将此方法转换为SQL,返回正确的值(1,0)。你的“琐碎”例子实际上是一个边缘情况(具有无限斜率的垂直线)所以它看起来很健壮。

我还用这个例子测试了源代码:https://www.desmos.com/calculator/iz07az84f5并使用(-1,2)(3,0)行的输入和(2,2)处的点得到了正确的答案(1.4,0.8)。

SQL代码(同样在http://sqlfiddle.com/#!6/d87aa/15的SQL小提琴中)

systemctl daemon-reload
systemctl restart docker