1.一种公路网高效空间最近邻查询方法,其特征在于,包括以下步骤:
A:由用户提供包括公路网信息及公路网上数据对象信息的输入数据,根据输入数据创建哈希表hashmap_1,并将所有数据对象与其坐标值的对应关系存储在哈希表hashmap_1中;
B:分别计算每条道路各个顶点的空间最近邻,创建哈希表hashmap_2,并将道路顶点、该顶点在空间网络上的最近邻及最近距离存储在哈希表hashmap_2中;
C:使用虚拟网格将二维空间划分为若干个等大的正方形网格单元,确定网格单元的边长,并对虚拟网格进行编号;
D:计算每个网格单元所包含的所有子路段及控制这些子路段的数据对象集合,并将网格单元编号与数据对象集合及数据对象所在的子路段的斜率的对应关系存储在哈希表hashmap_3中;
E:计算查询点位置所在的网格单元,并确定查询点位置所对应的网格单元的编号;
F:根据步骤E中计算出的网格单元编号,查找该网格单元对应的数据对象,并计算其中离查询点最近的数据对象返回给用户。
2.根据权利要求1所述的公路网高效空间最近邻查询方法,其特征在于:所述哈希表hashmap_1的主键为数据对象的唯一标示符oid,值为该数据对象的坐标值。
3.根据权利要求2所述的公路网高效空间最近邻查询方法,其特征在于:所述哈希表hashmap_2的主键为道路顶点的唯一标示符vid,值为该顶点在空间网络上的最近邻的oid及vid与该oid之间的最近距离s。
4.根据权利要求3所述的公路网高效空间最近邻查询方法,其特征在于,所述的步骤C包括以下步骤:
C1:使用虚拟网格将二维空间划分为若干个等大的正方形网格单元,通过公式确定网格单元的边长,其中,ι为网格单元边长,设d1为所有道路中最短道路的长度,设d2为有数据对象的道路上,所有相邻的两个数据对象之间的距离的最小值,-9d为d1和d2中的最小值,ξ=10 ;
C2:令R为数据集中的所有数据对象所构成的最小边界矩形,以R的左下角的顶点(x0,y0)为出发点,建立虚拟网格,并从坐标(x0,y0)所在的网格单元开始,从左到右、自下而上递增地对网格单元进行编号;计算坐标点(x,y)所在的网格单元编号的公式为:其中,id为坐标点(x,y)所在的网格单元编号,m为网格的每一行所包含的网格单元的数量,ceil为上取整函数。
5.根据权利要求4所述的公路网高效空间最近邻查询方法,其特征在于,所述的步骤D包括以下步骤:
D1:对于任意一条道路,将其划分为若干子路段;
D2:对于任意一条子路段,计算与该子路段相交的网格单元;
D3:计算每个网格单元所包含的所有子路段及控制这些子路段的数据对象集合,并将网格单元编号与数据对象集合及数据对象所在的子路段的斜率的对应关系存储在哈希表hashmap_3中,hashmap_3的键为网格单元的编号,对应该键的值为一个集合,该集合中的每个元素为控制该网格单元的每个数据对象的oid及该数据对象所在的子路段的斜率;如果控制该网格单元的点为道路顶点,则将该顶点的vid及所在子路段的斜率作为一个元素存储在该网格单元在hashmap_3中对应的集合中。
6.根据权利要求5所述的公路网高效空间最近邻查询方法,其特征在于:所述的步骤D1中,对于任意一条道路,从它的一个顶点开始,首先将该顶点插入点集合ps中;然后依次取出该道路上的数据对象并将其插入点集合ps中;对于点集合ps中前后相邻的两个数据对象组成的线段,将其平分为两个子线段并分别插入子线段集合rs中;最后将道路的另一个顶点也插入点集合ps中。
7.根据权利要求6所述的公路网高效空间最近邻查询方法,其特征在于:所述的步骤D2中,对于任意一个子路段,设其两端点分别为v1和v2,计算边v1→v2与纵向网格线和横向网格线的交点;按照v1到v2方向,按照横坐标值的大小关系有序排列上述交点及v1和v2两个顶点所组成的点的集合;对排序之后的集合中的所有点依次计算集合中所有相邻两点的中点,对每个中点使用步骤C2中的公式(2)计算该中点所在的网格单元的编号,中点所在的网格单元所组成的集合即为与边v1→v2相交的网格单元。
8.根据权利要求7所述的公路网高效空间最近邻查询方法,其特征在于:所述的步骤E中,利用步骤C2中的公式(2),计算查询点位置所在的网格单元,并确定查询点位置所对应的网格单元的编号。
9.根据权利要求8所述的公路网高效空间最近邻查询方法,其特征在于,所述的步骤F包括以下步骤:
F1:根据步骤E中计算出的网格单元编号,在哈希表hashmap_3中查找该网格单元所对应的每个子路段的斜率及控制该子路段的数据对象的oid或道路顶点的vid;
F2:分别计算查询点与每一条子路段上的第一个对象连接而成的直线的斜率;若计算出的斜率与网格单元所对应的某一个子路段的斜率相等,则查询点位于此对应的子路段上;若计算出的斜率与网格单元所对应的若干个子路段的斜率均相等,则分别计算查询点与每一个子线段的两端点之间的坐标位置关系,以确定查询点所在子路段;
F3:判断查询点所在道路上是否存在数据对象,如果是,则进入步骤F4;如果否,则进入步骤F5;
F4:若查询点所在子路段的两个端点分别为两个数据对象,则分别计算这两个数据对象与查询点之间的距离,并将与查询点距离最近的数据对象作为查询结果返回给用户,若这两个数据对象与查询点之间的距离相同,则同时将这两个数据对象作为查询结果返回给用户;
若查询点所在子路段的两个端点分别为一个数据对象和一个道路顶点,则首先计算查询点到此数据对象的距离r1和查询点到此道路顶点的距离r2,然后从哈希表hashmap_2中查询该道路顶点在空间网络上的最近邻及最近距离s2,最后比较r1与r2+s2的大小,若r1较小,则将查询点所在子路段端点对应的数据对象作为查询结果返回给用户;若r2+s2较小,则将从哈希表hashmap_2中查询该道路顶点在空间网络上的最近邻所对应的数据对象作为查询结果返回给用户;若r1与r2+s2的大小相同,则同时将查询点所在子路段端点对应的数据对象、从哈希表hashmap_2中查询该道路顶点在空间网络上的最近邻所对应的数据对象同时作为查询结果返回给用户;F5:若查询点所在道路的两个端点分别为两个道路顶点,则首先计分别算出查询点到第一个道路顶点的距离r3和查询点到第二个道路顶点的距离r4,然后分别从哈希表hashmap_2中查询第一个道路顶点在空间网络上的最近邻及最近距离s3、第二个道路顶点在空间网络上的最近邻及最近距离s4,计算r3+s3与r4+s4的大小,若r3+s3较小,则将从哈希表hashmap_2中查询到的第一个道路顶点在空间网络上的最近邻所对应的数据对象作为查询结果返回给用户;若r4+s4较小,则将从哈希表hashmap_2中查询到的第二个道路顶点在空间网络上的最近邻所对应的数据对象作为查询结果返回给用户;若r3+s3与r4+s4的大小相同,则同时将从哈希表hashmap_2中查询到的第一个道路顶点在空间网络上的最近邻所对应的数据对象、从哈希表hashmap_2中查询到的第二个道路顶点在空间网络上的最近邻所对应的数据对象同时作为查询结果返回给用户。