用于提供公交线路的方法和系统 【技术领域】
本发明涉及交通领域, 具体而言, 涉及一种用于提供公交线路的方法和系统。背景技术 现有的公交查询一般是基于数据库进行线路 - 站点关系的查询, 具体来说, 将起 点站的所有线路中能去到终点站的公交线路列出来, 或者将经过起点站的所有公交线路列 出, 再从中找出能去到终点站的公交线路。
在实现本发明过程中, 发明人发现现有技术中公交查询系统对数据获取的效率较 低, 导致用户对公交线路查询的速度较慢。
发明内容 本发明旨在提供一种用于提供公交线路的方法和系统, 以解决现有技术中公交查 询系统对数据获取的效率较低, 导致用户对公交线路查询的速度较慢问题。
在本发明的实施例中, 提供了一种用于提供公交线路的方法, 包括以下步骤 :
通过 K 维树找出出发地和目的地附近的公交站点, 其中, K 维树是公交站点的索 引, K 等于 2 或 3 ;
根据公交站点给出出发地到目的地之间的公交线路。
优选地, 在上述方法中, 2 维树是公交站点的索引具体包括 :
根据地理位置的经度值和纬度值建立 X 轴 -Y 轴的 2 维空间 ;
在 2 维树的偶数层按 X 坐标将公交站点排序, 将公交站点的 X 坐标上相邻的公交 站点作为公交站点的左、 右子树 ;
在 2 维树的奇数层按 Y 坐标将公交站点排序, 将公交站点的 Y 坐标上相邻公交站 点作为公交站点的左、 右子树 ;
其中, 在 2 维树中, 设某个公交站点为根结点, 其深度为 0, 将 2 维树分为偶数层和 奇数层。
优选地, 在上述方法中, 站点信息具体表示为 (SP1, SP2, X, Y, NAME, ID), 其中
SP1 和 SP2 分别表示与公交站点相邻的公交站点 ;
X 和 Y 分别表示公交站点的经度值和维度值 ;
NAME 表示公交站点的站点名 ;
ID 表示公交站点在 2 维树的编号。
优选地, 在上述方法中, 还包括以下步骤 :
将能坐车到公交站点的其他公交站点用图的方式缓存。
优选地, 在上述方法中, 根据公交站点给出出发地到目的地之间的公交线路具体 包括 :
计算目的地对应的公交站点与目的地之间的距离 ;
如果距离小于等于设定值, 根据用户设定的权值给出出发地到目的地的公交线路。
优选地, 在上述方法中, 计算目的地对应的公交站点与目的地之间的距离具体包括: 计算目的地对应的公交站点 A 与目的地 B 之间的距离 Distance 的公式如下 :
Distance = R*Arccos(C)*Pi/180 ;
C = sin(LatA*Pi/180)*sin(LatB*Pi/180)+
cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)*Pi/180) ;
其中, R 为地球的平均半径, MLonA 和 MLatA 分别为公交站点 A 的经度值和纬度值, MLonB 和 MLatB 分别为目的地 B 的经度值和纬度值, Pi 为圆周率。
在本发明的实施例中, 还提供了一种用于提供公交线路的系统, 包括 :
索引模块, 用于将公交站点索引到 K 维树 ;
查询模块, 用于根据用户输入的出发地和目的地查询出发地和目的地附近的公交 站点 ;
计算模块, 用于根据公交站点给出出发地到目的地之间的公交线路。
优选地, 在上述系统中, 查询模块采用 .NET Remoting 作为中间数据传递协议。
在本实施例中, 通过将的公交站点索引到 K 维树, 完成了对存储在介质上的公交 站点的数据信息的描述, 从而可以根据输入的出发地和目的地选择 K 维树中分支的方向, 提高了数据获取的效率, 使得用户可以较快地查询到所要乘坐的公交线路, 克服了现有技 术中公交查询系统对数据获取的效率较低, 导致用户对公交线路查询的速度较慢问题。
附图说明 此处所说明的附图用来提供对本发明的进一步理解, 构成本申请的一部分, 本发 明的示意性实施例及其说明用于解释本发明, 并不构成对本发明的不当限定。在附图中 :
图 1 示出了根据本发明一个实施例的用于提供公交线路的方法流程图 ;
图 2 示出了根据本发明一个实施例的 2 维树示意图 ;
图 3 示出了根据本发明一个实施例的经过起点的所有公交线路图 ;
图 4 示出了根据本发明一个实施例的用于提供公交线路的系统模块图 ;
图 5 示出了根据本发明一个实施例的 R 树示意图。
具体实施方式
下面将参考附图并结合实施例, 来详细说明本发明。
图 1 示出了根据本发明一个实施例的用于提供公交线路的方法流程图, 包括以下 步骤 :
S102, 通过 K 维树找出出发地和目的地附近的公交站点, 其中, K 维树是公交站点 的索引, K 等于 2 或 3 ;
S104, 根据公交站点给出出发地到目的地之间的公交线路。
在本实施例中, 通过将的公交站点索引到 K 维树, 完成了对存储在介质上的公交 站点的数据信息的描述, 从而可以根据输入的出发地和目的地选择 K 维树中分支的方向, 提高了数据获取的效率, 使得用户可以较快地查询到所要乘坐的公交线路, 克服了现有技术中公交查询系统对数据获取的效率较低, 导致用户对公交线路查询的速度较慢问题。
例如, 在上述实施例中, 公交站点可以是公共汽车、 地铁、 轻轨等站点。
优选地, 在上述方法中, 2 维树是公交站点的索引具体包括 :
根据地理位置的经度值和纬度值建立 X 轴 -Y 轴的 2 维空间 ;
在 2 维树的偶数层按 X 坐标将公交站点排序, 将公交站点的 X 坐标上相邻的公交 站点作为公交站点的左、 右子树 ;
在 2 维树的奇数层按 Y 坐标将公交站点排序, 将公交站点的 Y 坐标相邻的公交站 点作为公交站点的左、 右子树 ;
其中, 在 2 维树中, 设某个公交站点为根结点, 其深度为 0, 将 2 维树分为偶数层和 奇数层。
在本实施中, 通过构造 2 维的平衡树, 可以较快地对数据信息进行查找, 提高了查 找效率。
例如, 2 维树可以这样构建, 开始时, 定义站点集为 S, 树的根为整个平面, 然后确 定分割点 p, p ∈ S, 过点 p 的平行于 Y 轴的直线把 S 分割成两个集合 S1 和 S2, 从中选取分 割点 p1、 p2, 分别过 p1、 p2 作平行于 X 轴的直线分割, 以此类推。 图 2 示出了根据本发明一个实施例的 2 维树示意图。
优选地, 在上述方法中, 站点信息具体表示为 (SP1, SP2, X, Y, NAME, ID), 其中
SP1 和 SP2 分别表示与公交站点相邻的公交站点 ;
X 和 Y 分别表示公交站点的经度值和维度值 ;
NAME 表示公交站点的站点名 ;
ID 表示公交站点在 2 维树的编号。
每个公交站点用 K 维树中一个结点来表示, 通过结点中的 6 个域表现出来。开始 的两个域是指向结点两个子节点的指针, 各自相对应方向是左和右 ; X 和 Y 各自保存公交站 点经度和纬度值 ; NAME 域用来保存站点名 ; ID 域表示公交站点在数据库对应的 ID。
当结点 P 是一个 X 识别器。那么所有具有 X 坐标值小于 P 的结点将放在左树中, 而 X 坐标值大于或等于 P 的结点将放到 P 的右子树中。对于一个 Y 识别器的结点有同样的 约定。
优选地, 在上述方法中, 还包括以下步骤 :
将能坐车到公交站点的其他公交站点用图的方式缓存。
在本实施例中, 通过把每一个站点经过的所有线路能到达的所有公交站点以图的 形式保存下来, 在下次的公交线路查询汇总, 可以节省一步遍历的步骤, 节省了时间, 提高 了查找公交线路的速度。
图 3 示出了根据本发明一个实施例的经过起点的所有公交线路图, 如图 3 所示, 不 带箭头的线表示经过起点的某一条线路, 带箭头的线表示保存在图中的边记录。
图用邻接表保存, 在邻接表中, 对图中每个顶点建立一个单链表 ( 并按建立的次 序编号 ), 第 i 个单链表中的结点表示依附于顶点 vi 的边 ( 对于有向图是以顶点 vi 为尾的 弧 )。每个结点由三个域组成 : 邻接点域 (adjvex), 用以指示与 vi 邻接的点在图中的位置, 链域 (nextarc) 用以指向依附于顶点 vi 的下一条边所对应的结点, 存放数据的域 (info) 用于记录相关信息, 例如乘坐线路和距离等。
优选地, 在上述方法中, 根据公交站点给出出发地到目的地之间的公交线路具体包括 : 计算目的地对应的公交站点与目的地之间的距离 ;
如果距离小于等于设定值, 根据用户设定的权值给出出发地到目的地的公交线 路。例如, 当用户希望得到更省时间的方案, 那么速度的权重比例将会更高, 最终在对各方 案分别计算分数进行排序时, 速度较快的线路 ( 例如地铁 ) 由于分数更高, 它们在所有换乘 的方案中排名靠前的可能性就越大。
优选地, 在上述方法中, 计算目的地对应的公交站点与目的地之间的距离具体包 括:
计算目的地对应的公交站点 A 与目的地 B 之间的距离 Distance 的公式如下 :
Distance = R*Arccos(C)*Pi/180 ;
C = sin(LatA*Pi/180)*sin(LatB*Pi/180)+
cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)*Pi/180) ;
其中, R 为地球的平均半径, MLonA 和 MLatA 分别为公交站点 A 的经度值和纬度值, MLonB 和 MLatB 分别为目的地 B 的经度值和纬度值, Pi 为圆周率。
地 球 是 一 个 近 乎 标 准 的 椭 球 体, 它 的 赤 道 半 径 为 6378.140 千 米, 极半径为 6356.755 千米, 平均半径 6371.004 千米。如果我们假设地球是一个完美的球体, 那么它 的半径就是地球的平均半径, 记为 R。如果以 0 度经线为基准, 那么根据地球表面任意两 点的经纬度就可以计算出这两点间的地表距离 ( 这里忽略地球表面地形对计算带来的误 差, 仅仅是理论上的估算值 )。设第一点 A 的经纬度为 (LonA, LatA), 第二点 B 的经纬度 为 (LonB, LatB), 按照 0 度经线的基准, 东经取经度的正值 (Longitude), 西经取经度负值 (-Longitude), 北纬取 90- 纬度值 (90-Latitude), 南纬取 90+ 纬度值 (90+Latitude), 则经 过上述处理过后的两点被计为 (MLonA, MLatA) 和 (MLonB, MLatB)。
这 里, R 和 Distance 单 位 是 相 同, 如 果 是 采 用 6371.004 千 米 作 为 半 径, 那么 Distance 就是千米为单位, 如果要使用其他单位, 比如 mile, 还需要做单位换算, 1 千米= 0.621371192mile
如果仅对经度作正负的处理, 而不对纬度作 90-Latitude( 假设都是北半球, 南半 球只有澳洲具有应用意义 ) 的处理, 那么公式将是 :
C = sin(LatA)*sin(LatB)+
cos(LatA)*cos(LatB)*cos(MLonA-MLonB) ;
Distance = R*Arccos(C)*Pi/180。
如果三角函数的输入和输出都采用弧度值, 那么公式还可以写作 :
C = sin(LatA*Pi/180)*sin(LatB*Pi/180)+
cos(LatA*Pi/180)*cos(LatB*Pi/180)*cos((MLonA-MLonB)*Pi/180) ;
Distance = R*Arccos(C)*Pi/180。
由于起点和终点是由经纬度给出, 而各站点的经纬度都已知, 因此可以求出各步 行段的直线距离, 以此来近似实际步行距离。
图 4 示出了根据本发明一个实施例的用于提供公交线路的系统模块图, 包括 :
索引模块 10, 用于将公交站点索引到 K 维树 ;
查询模块 20, 用于根据用户输入的出发地和目的地通过 K 维树查询出发地和目的 地附近的公交站点 ;
计算模块 30, 用于根据公交站点给出出发地到目的地之间的公交线路。
在本实施例中, 通过将的公交站点索引到 K 维树, 完成了对存储在介质上的公交 站点的数据信息的描述, 从而可以根据输入的出发地和目的地选择 K 维树中分支的方向, 提高了数据获取的效率, 使得用户可以较快地查询到所要乘坐的公交线路, 克服了现有技 术中公交查询系统对数据获取的效率较低, 导致用户对公交线路查询的速度较慢问题。
优选地, 在上述系统中, 查询模块采用 .NET Remoting 作为中间数据传递协议。
.NET Remoting 是微软公司 .NET 编程框架自带的一种远程调用通信协议, 远程调 用又可称为远程过程调用。 该协议允许运行于一台计算机的程序调用另一台计算机的子程 序, 而程序员无需额外地为这个交互作用编程。
由于处理全国的数据量非常大, 本实施例采用 .NET Remoting 作为分布式计算的 中间数据传递协议, 可将不同城市或地区的数据分布开, 从而提高并发请求数。
为了以经纬度判断起点终点所在城市, 本实施例采用 R 树空间区域索引技方法。 R 树是一种高度平衡的树, 由中间节点和叶节点组成, 实际数据对象的最小外接矩形存储在 叶节点中, 中间节点通过聚集其低层节点的外接矩形形成, 包含所有这些外接矩形。其后, 人们在此基础上针对不同空间运算提出了不同改进, 才形成了一个繁荣的索引树族, 是目 前流行的空间索引。 R 树是 B 树向多维空间发展的另一种形式, 它将空间对象按范围划分, 每个结点都 对应一个区域和一个磁盘页, 非叶结点的磁盘页中存储其所有子结点的区域范围, 非叶结 点的所有子结点的区域都落在它的区域范围之内 ; 叶结点的磁盘页中存储其区域范围之内 的所有空间对象的外接矩形。 每个结点所能拥有的子结点数目有上、 下限, 下限保证对磁盘 空间的有效利用, 上限保证每个结点对应一个磁盘页, 当插入新的结点导致某结点要求的 空间大于一个磁盘页时, 该结点一分为二。R 树是一种动态索引结构, 即: 它的查询可与插 入或删除同时进行, 而且不需要定期地对树结构进行重新组织。
R 树可以用来访问二维或者更高维区域对象组成的空间数据。树上有两类结点 : 叶子结点和非叶子结点。每一个结点由若干个索引项构成。对于叶子结点, 索引项形如 (Index, Obj_ID)。其中, Index 表示包围空间数据对象的最小外接矩形 MBR, Obj_ID 标识一 个空间数据对象。 对于一个非叶子结点, 它的索引项形如 (Index, Child_Pointer)。 Child_ Pointer 指向该结点的子结点。Index 仍指一个矩形区域, 该矩形区域包围了子结点上所有 索引项 MBR 的最小矩形区域。图 5 示出了根据本发明一个实施例的 R 树示意图。
R 树的插入与许多其他树的操作一样, 可以归纳为一个递归过程。 首先从根结点出 发, 按照一定的标准, 选择其中一个孩子插入新的空间要素, 然后再从以孩子为根的子树的 根结点出发重复进行上面操作, 直到叶子结点。设 M 和 m(m ≤ M) 为 R 树结点中单元个数的 上限和下限, 当新的空间要素的插入使叶子结点中的单元个数超过 M 时, 需要进行结点的 分裂操作。分裂操作是将溢出的结点按照一定的规则分为若干部分。在其父结点删除原来 对应的单元, 并加入由分裂产生的相应的单元。 如果这样引起父结点的溢出, 则继续对父结 点进行分裂操作。分裂操作也是一个递归过程, 它保证了空间要素插入后 R 树仍能保持平 衡。
从 R 树中删除一个空间要素与插入类似, 首先从 R 树中查找到记录该空间要素所 在的叶子结点, 这就是 R 树的查找。从根结点开始, 依次检索包含空间要素的单元所对应孩 子结点为根结点的子树。查询方式利用了 R 树的结构特征, 减少了检索的范围, 提高了检索 的效率。查找到该空间要素所在的叶子结点后, 删除其对应的单元。如果删除后该叶子结 点单元个数少于 m, 需要进行 R 树的压缩操作, 将单元数过少的结点删除。如果父结点因此 单元数也少于 m, 则继续对父结点重复进行该操作。最后将因进行结点调整而被删除的空 间要素重新插入到 R 树中。这就是 R 树的压缩操作, 它使得 R 树的每个结点单元数不低于 m 这个下限, 从而保证了 R 树结点的平衡和利用率。
从 R 树的结构可以看出, 让空间上靠近的空间要素拥有尽可能近的共同祖先, 能 提高 R 树的查询效率。 在构造 R 树的时候, 尽可能让空间要素的空间位置的远近体现在其最 近的共同祖先的远近上, 形象的说就是让聚集在一起的空间要素尽可能早的组合在一起。 插入中选择子树的标准, 分裂操作、 插入操作中选择子树的标准, 分裂操作中的分裂方法, 都是为了体现这一目标。
本实施例将每个城市或地区作为一个多边形存储在 R 树中, 查询时由起点终点的 经纬度在 R 树中查询出相应的城市或地区, 再调用对应的服务程序。
本实施例的用于提供公交线路的系统采用负载均衡策略进行架构。 负载均衡建立 在现有网络结构之上, 它提供了一种廉价有效的方法扩展服务器带宽和增加吞吐量, 加强 网络数据处理能力, 提高网络的灵活性和可用性。它主要完成以下任务 : 解决网络拥塞问 题, 服务就近提供, 实现地理位置无关性 ; 为用户提供更好的访问质量 ; 提高服务器响应速 度; 提高服务器及其他资源的利用效率 ; 避免了网络关键部位出现单点失效。
为了满足高服务质量的需求, 本发明采用反向代理技术实现负载均衡策略。代理 服务把客户的连接请求以反向代理的方式动态地转发给内部网络上的多台服务器进行处 理, 这样可以避免单一服务器失效而导致整个服务失效, 从而达到负载均衡的目的。同时, 由于反向代理本身占用系统资源极小, 因此可以以低成本设置多个反向代理作为服务入 口, 进而运用其他负载均衡策略如 DNS 负载均衡。
在上述实施例中的用于提供公交线路的系统中, 当第一次用户传入某个城市的起 点、 终点经纬度, 进行换乘, 此城市的缓存机制开始触发, 首先进行站对站索引, 同时, 使用 K 维树, 对各站建空间索引。 接着, 通过空间索引, 得知客户可以到达的站点, 接着使用站对站 索引, 采用上述实施例汇总的用于提供公交线路的方法进行调试, 并且使用不同的权值, 规 划出最适合用户的线路方案。
显然, 本领域的技术人员应该明白, 上述的本发明的各模块或各步骤可以用通用 的计算装置来实现, 它们可以集中在单个的计算装置上, 或者分布在多个计算装置所组成 的网络上, 可选地, 它们可以用计算装置可执行的程序代码来实现, 从而, 可以将它们存储 在存储装置中由计算装置来执行, 或者将它们分别制作成各个集成电路模块, 或者将它们 中的多个模块或步骤制作成单个集成电路模块来实现。这样, 本发明不限制于任何特定的 硬件和软件结合。
以上所述仅为本发明的优选实施例而已, 并不用于限制本发明, 对于本领域的技 术人员来说, 本发明可以有各种更改和变化。 凡在本发明的精神和原则之内, 所作的任何修 改、 等同替换、 改进等, 均应包含在本发明的保护范围之内。