认清两长达轨道是否重合的思绪(存储过程描述)判断两长条轨道是否重合的笔触(存储过程描述)

章版权由作者李晓晖和博客园共有,若转载请吃大庭广众处于标明出处:http://www.cnblogs.com/naaoveGIS/。

章版权由作者李晓晖以及博客园共有,若转载请叫大庭广众处于标明出处:http://www.cnblogs.com/naaoveGIS/。

1.背景

如若来少修轨道,一修凡预约轨道,一条是事实上轨迹,分别吗L1、L2。L1由点(A1、A2、A3、…、AN)组成,L2由(B1、B2、B3、…、BM)组成。现在被闹了一个容差范围,即L2上之点能与L1这长达预定路线的直容差范围Range,求L2直达满足要求的实际点。

以此要求我们其实得分成两种植情况来考虑,一种是这个需要就的但是讲求得与L1能有必然匹配度的点。但是,如果我们深入解析,会意识L1作为同一久线,其自我是来方向性的,如果我们还以丝之方向性考虑进去,即L2的触及不仅要当跟L1的Range范围外,还要此时底点的向上方向与L1凡是千篇一律之。

自然,我们经过AGS或者GeoServer之类的NA服务是得实现最邻路径生成的点子的,这个法子我们留下在我之于根谈WebGIS的计划性实现多重被及大家一齐追。这里我如果跟大家谈论同样栽效率又胜似之道,直接通过数据库的存储过程来实现。

自家于上头提到的有限栽情景(不考虑方向性和考虑方向性),这两头是罕见推进的。我们率先考虑怎么通过非考虑方向性来解决。然后再进一步探讨如果发方向性,我们该用什么思路去落实。

1.背景

倘若有少条轨道,一久凡预约轨道,一久凡事实上轨迹,分别吗L1、L2。L1由于点(A1、A2、A3、…、AN)组成,L2由(B1、B2、B3、…、BM)组成。现在叫闹了一个容差范围,即L2上的点能与L1这长达预定路线的垂直容差范围Range,求L2上满足要求的实际点。

这个需要我们实际上得分成两种情况来考虑,一栽是以此需要就的就是求得到与L1能有肯定匹配度的点。但是,如果我们深入解析,会发现L1作为同一长长的线,其自是发方向性的,如果我们还以线之方向性考虑进去,即L2的触及不仅要当与L1的Range范围外,还要此时的点的进化方向和L1凡千篇一律之。

当然,我们经过AGS或者GeoServer之类的NA服务是好实现最邻路径生成的方式的,这个办法我们留下在本人的从脚谈WebGIS的宏图实现多元中及大家一齐探讨。这里我如果跟大家谈论同样种效率又胜的主意,直接通过数据库的仓储过程来兑现。

自己于方提到的简单种情况(不考虑方向性和考虑方向性),这两者是罕见推进的。我们率先考虑怎么通过非考虑方向性来缓解。然后再进一步探讨如果发方向性,我们该用什么思路去贯彻。

2.非考虑方向性的算法实现

2.未考虑方向性的算法实现

2.1更加简化问题

此,首先我们以题目进一步简化,即如何判定一个碰是否得到于个别独点成的丝之容差范围外,距离描述为:a点、b点简单只计划点,c点吗实际点,现在设判断c点是否当a点以及b点连接成的直线的容差范围外。

2.1越来越简化问题

这里,首先我们用问题越简化,即什么判断一个接触是否拿走于少数个点成的线的容差范围外,距离描述为:a点、b点零星独计划点,c点吗实际点,现在而判c点是否当a点和b点连接成的直线的容差范围外。

2.2化解简化问题的思绪

自己以解决步骤分为三步。分别吗:1.简约判断;2.判定是否取得于线外;3.垂线判断。

翔经过就是是:

A.粗略判断,c点和a点以及b点的连线是否当容差范围外,即ac或者bc是否以容差范围外。如果是,返回true。否则,进一步认清。

B.判断c点是否以ab直线的外侧,即c点交ab的沿足于ab的延长线上(如果是这种情形,只叫一个容差范围是特别不便确定是不是符合标准的,需要差不多个与容差有关的参数,比如水平容差和直容差等,为了简化,此种植情况下,直接回false)。如果沿袭足于ab上,则进行下同样步。

C.算出c点及ab的垂线距离d。判断d是否在容差范围外,如果当,返回true;否则,返回false。

2.2缓解简化问题的思路

自以缓解步骤分为三步。分别吗:1.简判断;2.断定是否获得于线外;3.垂线判断。

翔经过就是:

A.粗略判断,c点和a点以及b点的连线是否以容差范围外,即ac或者bc是否在容差范围外。如果是,返回true。否则,进一步认清。

B.判断c点是否在ab直线的外侧,即c点及ab的流传足于ab的延长线上(如果是这种情况,只叫一个容差范围是那个为难确定是不是符合标准的,需要差不多个及容差有关的参数,比如水平容差和直容差等,为了简化,此种情形下,直接回false)。如果沿袭足于ab上,则开展下一致步。

C.算出c点及ab的垂线距离d。判断d是否当容差范围外,如果以,返回true;否则,返回false。

2.3兑现判断点是否在线范围外(使用存储过程)

采用海伦公式求点到线段的去。

传送的参数中。x0、y0、x1、y1呢约定轨道的少数只坐标(P0,P1),x2、y2乎老三独坐标(实际位置S)的坐标,
fRange为于对离,return 0 超出,return 1未超过。

 lovebet 1                    

function getNearestDistance(x0 in number,y0 in number,x1 in
number,y1 in number,x2 in number,y2 in number,fRange in number :=
1,distance out number) return integer is 

    fa number(15,3);

    fb number(15,3);

    fc number(15,3);

    fl number(15,3);

    fs number(15,3);

  begin

    fa := sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

    fb := sqrt((x0-x2)*(x0-x2)+(y0-y2)*(y0-y2));

    fc := sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1));

    if fa < fRange then –当fa边长度小于警告距离时

      distance := fa;

      return 1;

    end if;

    if fb < fRange then –当fb边长度小于警告距离时

      distance := fb;

      return 1;

    end if;

    if fc < 0.01 then –当轨迹的简单独坐标点重合时

      return 0;

    end if;

if(fa*fa>=fb*fb+fc*fc) then  –P0介乎角度为(钝(直)角),垂足在外 

      distance := fb;

      return 0;

end if;   

if(fb*fb>=fa*fa+fc*fc) then – P1处角度为(钝(直)角),垂足于外  

      distance := fa;

      return 0;

    end if; 

    –利用海伦公式要垂直距离

    fl := (fa+fb+fc)/2;     –周长的一半    

fs := sqrt(fl*(fl-fa)*(fl-fb)*(fl-fc));
 –海伦公式要面积,也堪用矢量求    

    distance := 2*fs/fc; 

    if distance < fRance then

      return 1;

    end if;

    return 0;

  end;

2.3贯彻判断点是否在线范围外(使用存储过程)

采用海伦公式求点到线段的离。

传送的参数中。x0、y0、x1、y1呢约定轨道的点滴只坐标(P0,P1),x2、y2乎老三独坐标(实际位置S)的坐标,
fRange为比对距,return 0 超出,return 1未超出。

 lovebet 2                    

function getNearestDistance(x0 in number,y0 in number,x1 in
number,y1 in number,x2 in number,y2 in number,fRange in number :=
1,distance out number) return integer is 

    fa number(15,3);

    fb number(15,3);

    fc number(15,3);

    fl number(15,3);

    fs number(15,3);

  begin

    fa := sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

    fb := sqrt((x0-x2)*(x0-x2)+(y0-y2)*(y0-y2));

    fc := sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1));

    if fa < fRange then –当fa边长度小于警告距离时

      distance := fa;

      return 1;

    end if;

    if fb < fRange then –当fb边长度小于警告距离时

      distance := fb;

      return 1;

    end if;

    if fc < 0.01 then –当轨迹的一定量独坐标点重合时

      return 0;

    end if;

if(fa*fa>=fb*fb+fc*fc) then  –P0高居角度为(钝(直)角),垂足于外 

      distance := fb;

      return 0;

end if;   

if(fb*fb>=fa*fa+fc*fc) then – P1处角度lovebet为(钝(直)角),垂足于外  

      distance := fa;

      return 0;

    end if; 

    –利用海伦公式要垂直距离

    fl := (fa+fb+fc)/2;     –周长的一半    

fs := sqrt(fl*(fl-fa)*(fl-fb)*(fl-fc));
 –海伦公式要面积,也足以据此矢量求    

    distance := 2*fs/fc; 

    if distance < fRance then

      return 1;

    end if;

    return 0;

  end;

2.4兑现全流程

优先查询得到所有预定路线的坐标,再查询有用判定的点S,遍历整个预定路线判断S是否在所有线路的某部修线段的容差范围外。

再度查询有实际线路倍受之老二个实际点,重复上面的进程。

首先只经过的兑现如下:

 

isOutOfRanceErr := 1;

open rs2 for select a.X,a.Y,b.X,b.Y,c.预警距离 from 坐标点表 a,
坐标点表 b, 轨迹表 c where a.轨迹ID=b.轨迹ID  and a.轨迹ID = c.轨迹ID
and a.坐标ID+1=b.坐标ID order by a.轨迹ID,a.坐标ID;

       loop

         Fetch rs2 into fP0X,fP0Y,fP1X,fP1Y,fToleRance;

         Exit when rs%Notfound;

           dummy :=
getNearestDistance(fP0X,fP0Y,fP1X,fP1Y,fCoordinateX,fCoordinateY,fToleRance,fDistance);

           if dummy = 1 then

              isOutOfRanceErr := 0;

              exit;

           end if;

         end loop;

       close rs2; 

 

2.4落实成套工艺流程

优先查询得到方方面面预定路线的坐标,再查询有待看清的点S,遍历整个预定路线判断S是否以全体线路的有条线段的容差范围外。

再也查询有实际线路受到的第二单实际点,重复上面的历程。

第一独过程的贯彻如下:

 

isOutOfRanceErr := 1;

open rs2 for select a.X,a.Y,b.X,b.Y,c.预警距离 from 坐标点表 a,
坐标点表 b, 轨迹表 c where a.轨迹ID=b.轨迹ID  and a.轨迹ID = c.轨迹ID
and a.坐标ID+1=b.坐标ID order by a.轨迹ID,a.坐标ID;

       loop

         Fetch rs2 into fP0X,fP0Y,fP1X,fP1Y,fToleRance;

         Exit when rs%Notfound;

           dummy :=
getNearestDistance(fP0X,fP0Y,fP1X,fP1Y,fCoordinateX,fCoordinateY,fToleRance,fDistance);

           if dummy = 1 then

              isOutOfRanceErr := 0;

              exit;

           end if;

         end loop;

       close rs2; 

 

3.设想方向性的算法的兑现

若是轨迹的自查自纠还考虑方向性,即线路a-b-c-d与线路a-c-b-d是殊,其实,此时只需要因此一个变量来号每一样次合时,数组已经比及之地方,下次比时应该打标记处开始后推就可知促成方向性问题了。

 

                                                                         
 —–欢迎转载,但保留版权,请让大庭广众处于标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                          
如果你看本文确实帮了您,可以微信扫一扫,进行小额的打赏和鞭策,谢谢
^_^

                                    lovebet 3

 

3.设想方向性的算法的贯彻

要是轨迹的相比还考虑方向性,即线路a-b-c-d与线路a-c-b-d是殊,其实,此时特需要用一个变量来号每一样潮可时,数组已经比及的地方,下次对比时应当于标记处开始后推就能够实现方向性问题了。

 

                                                                         
 —–欢迎转载,但保留版权,请为大庭广众处于标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                          
如果您当本文确实帮了而,可以微信扫一扫,进行小额的打赏和鼓励,谢谢
^_^

                                    lovebet 4