线性分段算法实现

上一篇博文介绍了线性分段,现在说说其具体实现,由于项目中使用的是开源的解决方案——geotool,它并没有提供线性分段的解决方案,所以必须自己基于geotool来实现线性分段的功能。

算法很简单,先看图:
线性分段算法实现_第1张图片
如上图,一条线,从点1开始到点6结束,共由五段直线组成,总长为13m,现在的需求是:找出距离起点五米的点的坐标。

  1. 我们可以把五条线段组成一个数组(有顺序的
  2. 然后从第一个线段开始累加比较,一直累加到第三条线段的时候发现当前的长度刚好超出了5米:2m+2m+4m>5m了,所以距离起点五米的点一定位于第三条线段上。
  3. 于是我们以第三条线段的第一个端点也就是点三为圆心,以(2m+2m+4m-5m)为半径画一个圆。
  4. 然后将这个圆和第三条线段做一个相交运算,取得相交点,这个点就是我们要找的点了,如下图:
    线性分段算法实现_第2张图片



第二种需求更进一步,综合一些,用户在公路上点击某个地方,然后判断这个点在哪个线段内,这里要注意的是,别指望用户的鼠标可以很精确地点在线上,绝对会有偏差的,如图:用户点想点击第三个线段,但是鼠标并没有准确地落在线上。
线性分段算法实现_第3张图片

  1. 还是把这条线,打断成一个个线段,段组成一个数组(有顺序的
  2. 然后设定一定的容限(用户的点击虽然会有误差,但是一般不会太离奇)。
  3. 以点击的这个点为圆心,以设定的容限为半径作圆。
  4. 将这个圆和这个线段数组做相交运算,得到和这个圆相交或包含的线段,成为结果集作为下一步的数据源。
  5. 遍历这个结果集,对于每条线段,都做一条与它垂直而且经过这个点(就是只用户点击的这个点)的直线。
  6. 如果这个直线和当前这条线段有交点,那么说明,这个线段就是离这个点最近的线段了,如图,我这里夸张一下,把容限设得很大,这种情况是很有可能出现的,只要你的线的线段分得很细很细线性分段算法实现_第4张图片
  7. 由图中可以看到,一共有四条线段和圆相交或被包含,分别经过这个点给这些线段做垂线(图中四条土黄色的线就是对应的四条垂线,其编号对应线段号),经过观察发现,就只有线段三的垂线和线段三有交点,同时,线段三也是离这个点最近的线段!根据这个方法就可判断出哪一条线段是离这个点最近的!
很晚了,这里先说说思路,代码实现等日后有空再写了

你可能感兴趣的:(Gis,geotool,线性分段)