具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图和实施例,对本发明进行进一步详细说明,为了便于说明,仅示出了与本发明实施例相关的部分。应当理解,此处所描写的具体实施例,仅仅用于解释本发明,并不用以限制本发明。
实施例1,本发明提供一种实时路况显示方法,参见图1,该方法包括:
步骤101:接收显示实时路况的指令,从预置的数据库获取所有组成实时线路的点坐标,将所述点坐标作为源坐标集合保存。
所述点坐标携带有对应的路段ID(路段标识);
所述的数据库是预置在客户端的,其数据库中的数据与服务器端的是相同的。在客户端与服务器端分别预置数据库,是由于每条道路在较长的时间内基本上不会变动,可以把每条道路的位置坐标以数据库形式打包到程序中,这样每次客户端需要用到每条道路的数据时,不必从服务器获取,可以减少客户端的网络流量;
该步骤中所述点坐标包括X、Y坐标值,并且每个点坐标携带有对应的路段ID;
其中,X,Y是点坐标的坐标值,路段ID则是点所属路段ID,通过该路段ID来划分点归属。
更近一步的,此步骤中,客户端在获取所述的所有组成实时线路的点坐标后,可以将所述的点坐标保存到缓存中作为源坐标,这样可以提高客户端运行的速度,提高用户的满意度。
步骤102:向服务器发送请求第一路段状态码的指令,所述第一路段状态码包括路段ID;
并且服务器与客户端会分别预置路段状态码,并且所述路段状态码包括路段ID集合;
所述服务器预置的路段状态码为第一路段状态码;客户端预置的路段状态码为第二路段状态码:
例如状态码用来表示路段的拥挤状态,拥挤状态可以分别表示为:
状态1--畅通
状态2--缓行
状态3--拥堵
且:状态1在地图中显示的颜色为绿色;
状态2在地图中显示的颜色为黄色;
状态3在地图中显示的颜色为红色。
那么当服务器接收请求状态码的指令后,会反馈包含路段ID以及所述路段对应的状态码,例如反馈形式可以为:
从服务器返回给客户端的数据结构如下图:
并且,在该步骤中,可以每隔第一时间段就向服务器发送请求状态码的指令,这样能够及时提供实时路况的信息。
步骤103:判断所述的源坐标集合中的所有源坐标是否已经都进行偏移点坐标计算;若是则执行步骤106;若否则执行步骤104:
步骤104:按照先后顺序从所述源坐标集合中取出第一源坐标P1(x1,y1)与第二源坐标P2(x2,y2),并通过所述的自定义向量类将所述第一源坐标和第一源坐标分别设置为第一向量V1和第二向量V2;
该步骤中所述的自定义向量类(Vector2d)可以包括以下内容:
(1)定义向量类Vector2d的大小和方向属性;在自定义Vector2d类中定义表示大小的属性private double length=0,再分别定义表示水平方向的分量private float x=0和表示垂直方向的分量private float y=0。
(2)定义向量类Vector2d的构造函数,用于创建一个向量,并通过传入的参数初始化x和y分量,其格式为:public Vector2d(float x,float y)。
(3)实现向量的差运算,比如:获取以A点作为起点,到B点的向量V,即:Vx=VB.x-VA.x Vy=VB.y-VA.y再根据向量类Vector2d的构造函数,把Vx,Vy作为参数传入实现创建向量V。
(4),实现向量V的旋转的方法,以旋转角度rad作为参数,计算向量V的正弦值为double sin=Math.sin(rad),其次计算向量V的余弦值为doublecos=Math.cos(rad),最后分别计算旋转后向量V′的x分量V′x和V′y分量:V′x=(cos*Vx+sin*Vy),V′y=(-sin*Vx+cos*Vy)。
公式:
V′的x分量=(V′的余弦值*V的x分量)+(V′的正弦值*V的y分量)
V′的y分量=(V′的余弦值*V的y分量)-(V′的正弦值*V的x分量)
(5),实现向量V的模计算方法,即:Math.sqrt((Vx*Vx)+(Vy*Vy))。
(6),实现向量V的倍积计算方法,以n倍数作为参数,则:
Vx=Vx*n
Vy=Vy*n
其中n为正整数。
步骤105:根据所述的第一向量V1和第二向量V2计算偏移点坐标;执行步骤103;
该步骤中计算偏移点可以为:
步骤1051:根据所述的第一向量V1和第二向量V2,获取以V1点作为起点,到V2点的向量差Vx、Vy,计算公式为:
Vx=V2x-V1x
Vy=V2y-V1y
其中,V1x:第一向量V1的x分量,V1y:第一向量V1的y分量。
V2x:第二向量V2的x分量,V2y:第二向量V2的y分量。
Vx:向量V的x分量,Vy:向量V的y分量。
步骤1052:再将所述向量差Vx、Vy合成第三向量V3;
即把Vx,Vy作为参数传入Vector2d类的构造函数public Vector2d(Vx,Vy)可得向量V。
步骤1053:将第三向量V3顺时针方向旋转rad度后作为第四向量V″;
即rad=(Math.PI/-2);其中Math.PI=3.1415926。
首先计算第四向量V′的正弦值为double sin=Math.sin(rad),
其次计算第四向量V″的余弦值为double cos=Math.cos(rad),
最后分别计算第四向量V″的x分量V″x和V″y分量,
其中:V″x=(cos*Vx+sin*Vy),V″y=(-sin*Vx+cos*Vy)。
公式:
V″的x分量=(V″的余弦值*V的x分量)+(V″的正弦值*V的y分量)
V″的y分量=(V″的余弦值*V的y分量)-(V″的正弦值*V的x分量)
其中*为乘法运算。
步骤1054:,计算第四向量V″的模(长度)=Math.sqrt((V″x*V″x)+(V″y*V″y))。
步骤1055:计算第四向量V″的数量积:
V″x=V″x*λ
V″y=V″y*λ
其中,λ为地图在各个缩放级别(0-13)下自定义的常量:
static final int[]λ=
{60,60,60,60,60,60,60,60,60,52,32,22,12,6}
步骤1056:结合所述的源坐标P1和的第四向量V″,获得偏移点的坐标,所述偏移点坐标包括路段ID,执行步骤103;
由于步骤101中已经描述过,源坐标P1的结构为
那么相应的偏移点坐标结构也依然包括路段ID,即偏移点坐标结构也为
该步骤中获得偏移点的坐标的详细计算过程公式为:
偏移点的x坐标=源坐标P1的x坐标+向量V″的x坐标
偏移点的y坐标=源坐标P1的y坐标+向量V″的y坐标
步骤106:接收服务器反馈的第一路段状态码,所述第一路段状态码包括路段ID集合;
步骤107:根据所述的第一路段状态码以及所述的偏移点坐标,在预置的地图中显示实时路况信息;
该步骤107中详细过程可以为:
步骤1071:客户端首先根据服务器反馈的所有路段ID与客户端预置的每个路段ID进行匹配,即遍历每个路段ID,若ID值相同则匹配成功;
步骤1072:把匹配到的路段ID对应的所述第二路段状态码,设置为服务器对应的所述第一路段状态码;
步骤1073:根据所述第二路段状态码,在对应的所述偏移点坐标处显示状态码对应的颜色。
因第二路段状态码的数据结构为
且偏移点坐标的数据结构为:
那么状态码就可以根据路段ID进行匹配,在对应的偏移点坐标处显示状态码对应的颜色。
实施例2,参见图2,本发明还提供一种实时路况显示装置,所述的装置包括:第一获取单元、第二获取单元、第三获取单元、第一处理单元;
第一获取单元,用于接收显示实时路况的指令后,从预置的数据库中获取所有组成实时线路的点坐标,形成源坐标点集合并保存,所述点坐标携带有对应的路段ID;
第二获取单元,用于获取所述源坐标点集合中的所有点坐标对应的偏移点坐标;
第三获取单元,用于从服务器获取预置的第一路段状态码,所述第一路段状态码包括对应的路段ID集合;
第一处理单元,用于根据所述的第一路段状态码以及所述的偏移点坐标在预置的地图中显示实时路况信息。
其中,所述第二获取单元包括:判断单元、第二处理单元、第三处理单元;
判断单元,用于判断所述的源坐标集合中的所有源坐标是否已经都进行偏移点计算;
第二处理单元,用于当判断单元判断结果为是,则通知第一处理单元继续处理;
第三处理单元,用于当判断单元判断结果为否,则按照先后顺序从所述源坐标集合中取出第一源坐标P1(x1,y1)与第二源坐标P2(x2,y2),并将所述第一源坐标和第二源坐标分别设置为第一向量V1和第二向量V2;根据所述的第一向量V1和第二向量V2计算对应的偏移点坐标。
其中,所述的第三处理单元包括:第四获取单元、设置单元、第一计算单元;
第四获取单元,用于判断单元判断结果为否,则按照先后顺序从所述源坐标集合中取出第一源坐标P1(x1,y1)与第二源坐标P2(x2,y2);
设置单元,用于将所述第一源坐标和第二源坐标分别设置为第一向量V1和第二向量V2;
第一计算单元,包括:第二计算单元、第三计算单元、第四处理单元;
第二计算单元,用于根据所述的第一向量V1和第二向量V2,获取以V1点作为起点到V2点的向量差Vx、Vy,计算公式为:Vx=V2x-V1x;Vy=V2y-V1y;其中,V1x:第一向量V1的x分量,V1y:第一向量V1的y分量;V2x:第二向量V2的x分量,V2y:第二向量V2的y分量;Vx:向量V的x分量,Vy:向量V的y分量;
第三计算单元,用于将所述向量差Vx、Vy合成第三向量V3;将第三向量V3作顺时针方向旋转rad度后作为第四向量V″;计算第四向量V″的模(长度),第四向量V″的模(长度)=Math.sqrt((V″x*V″x)+(V″y*V″y));计算第四向量V″的数量积;
所述“对第三向量V3作顺时针方向旋转rad度后的第四向量V″”具体为:
rad=(Math.PI/-2),其中Math.PI=3.1415926。首先计算第四向量V′的正弦值为double sin=Math.sin(rad),其次计算第四向量V″的余弦值为double cos=Math.cos(rad);最后分别计算第四向量V″的x分量V″x和V″y分量:V″x=(cos*Vx+s in*Vy),V″y=(-sin*Vx+cos*Vy);
V″的x分量=(V″的余弦值*V的x分量)+(V″的正弦值*V的y分量)
V″的y分量=(V″的余弦值*V的y分量)-(V″的正弦值*V的x分量)
其中*为乘法运算;
所述”计算第四向量V″的数量积”具体为:
V″x=V″x*λ
V″y=V″y*λ
其中,λ为地图在各个缩放级别(0-13)下自定义的常量:
static final int[]λ=
{60,60,60,60,60,60,60,60,60,52,32,22,12,6};
第四处理单元,用于结合所述的源坐标P1和的第四向量V″,获得偏移点的坐标;则通知判断单元继续执行。
其中,第一处理单元包括:第五处理单元、第六处理单元、第七处理单元;
第五处理单元,用于根据服务器反馈的所有路段ID与本地预置的每个路段ID进行匹配;
第六处理单元,用于把匹配到的路段ID对应的所述第二路段状态码,设置为服务器对应所述第一路段状态码;
第七处理单元,用于根据所述第二路段状态码,在对应的所述的偏移点坐标显示状态码对应的颜色。
本发明说明书附图中提供的附图3、4中是进行了点偏移坐标计算前后的对比图,图3为没使用本发明方法修正的效果图,由于坐标原因,从而导致两线路重叠在一起了。图4为使用本发明方法修正后的效果图,目的就是要修正点坐标,使两条线路分开到路的两边上,从而以画线的方式,清楚的向用户提供了实时路况。
通过本发明提供的方法及装置,当用户开启实时交通状况时,在9-13级别下使用本发明方法前后的效果对比如图3、图4显示,可以看出修正的实现的效果是显著的。
综上所述,本发明中,客户端根据服务器发送过来的不同路段状态码(自定义)绘制指定颜色(红,绿,黄)的线段;在完成了所有点的偏移计算后,无需再生成图片,而是取用对可见的路段进行局部画线段的方式来实现的。这种方法不仅减轻了服务器的图片处理负担,而且可以显著地减少用户的网络流量,提升用户使用与体验。并且本发明方法的点偏移坐标计算方法与现有方法是不同的,本发明方法取用了向量来对点作偏移计算,这样的算法是高效,简单的。
本领域的普通技术人员可以理解,实现上述实施例方法中的全部或部分步骤是可以通过程序指令相关硬件来完成的,所述的程序可以存储于一计算机可读取存储介质中,所述的存储介质可以为ROM、RAM、磁盘、光盘等。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。