考虑过于简单的例子:POINT(0 0)和LINESTRING(1 -10,110)
到POINT线的最近点是1,0。
如何在TSQL中确定这一点?我的简单,不完全准确的方法是制作线串(POINT POINT)并延伸出一个坐标的X坐标,直到两个线串相交。
所以:
这种准效果,但似乎并不是最优秀/更高效的方式来实现这一目标。
例如,一个低效率是我向一个方向移动(正增量),如果没有匹配(在x尝试之后),那么我将重新开始,但是以负增量。
为了优化,我尝试移动更大的步骤,然后当相交时(可能已超过该点),我退出1增量并从那里以较小的增量开始。我这样做了几次 - 而不是以微小的增量进行,以免过度超调。
基于我的处理,一个可接受的假设是POINT将位于LINESTRING的旁边(左/右)。
另一个可接受的假设是LINESTRING与POINT相当“垂直”。
答案 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