一、
技術(shù)領(lǐng)域:
本發(fā)明是移動對象數(shù)據(jù)庫中索引更新的技術(shù),主要用于移動對象軌跡數(shù)據(jù)的索引的快速更新。二、
背景技術(shù):
:隨著移動對象的數(shù)據(jù)不斷更新,需要將移動對象的數(shù)據(jù)添加到數(shù)據(jù)庫中,同時(shí)更新移動對象軌跡的3dr-tree索引。移動對象的軌跡需要添加到數(shù)據(jù)庫中原有移動對象軌跡數(shù)據(jù)中,并且更新軌跡的索引,使得更新后的移動對象數(shù)據(jù)與原有移動對象數(shù)據(jù)保持格式的一致,并且能夠?qū)崿F(xiàn)高效的移動對象連續(xù)距離查詢。r-tree更新的主要方法有逐個(gè)更新和批處理更新,其中逐個(gè)更新的方法每次插入移動對象軌跡的索引項(xiàng)時(shí),需要訪問多次磁盤,因此效率低;而批處理更新方法中,目前有基于z曲線或者h(yuǎn)ilbert曲線排序的批處理更新,然而,這兩種方法都需要對插入到r-tree中更新的索引項(xiàng)進(jìn)行空間的排序,至少需要花費(fèi)o(nlogn)的排序時(shí)間,其中n為需要插入更新的索引項(xiàng)的數(shù)量。對于本發(fā)明中的基于網(wǎng)格劃分的快速軌跡索引更新方法,具有更好的r-tree批處理更新效率。三、技術(shù)實(shí)現(xiàn)要素:【發(fā)明目的】為了提高軌跡索引更新的效率,以及更新后移動對象數(shù)據(jù)庫的連續(xù)距離查詢效率不會降低,本發(fā)明提供了一種基于網(wǎng)格劃分的快速軌跡索引更新方法,以解決現(xiàn)有軌跡索引更新的效率問題?!炯夹g(shù)方案】本發(fā)明所述的基于網(wǎng)格劃分的快速軌跡索引更新方法,是對需要更新的移動對象軌跡數(shù)據(jù)進(jìn)行預(yù)處理,通過批處理方法建立軌跡索引的3dr-tree索引子樹,然后將索引子樹插入到原有軌跡索引的3dr-tree中,得到更新軌跡索引后的3dr-tree索引結(jié)構(gòu),主要包括軌跡數(shù)據(jù)預(yù)處理、建立軌跡索引子樹和軌跡索引合并三個(gè)主要步驟。(1)軌跡數(shù)據(jù)預(yù)處理對于新添加的移動對象軌跡數(shù)據(jù),需要保持與數(shù)據(jù)庫中相同的格式,包括軌跡數(shù)據(jù)的存儲格式,軌跡的存儲長度,對軌跡數(shù)據(jù)進(jìn)行格式化,通過批處理的方式。將軌跡數(shù)據(jù)分割成較小的軌跡段,添加到已有的數(shù)據(jù)庫中。對新插入的數(shù)據(jù)進(jìn)行軌跡分割處理并插入到原有數(shù)據(jù)表中。軌跡分割的大小與原數(shù)據(jù)庫中的軌跡分割大小一致,以保持?jǐn)?shù)據(jù)的一致。(2)建立索引子樹建立索引子樹,通過批處理的方式,將空間相近的軌跡數(shù)據(jù)的索引項(xiàng)添加到相同的葉子節(jié)點(diǎn)中。對于新插入的軌跡數(shù)據(jù),使用批處理生成新的軌跡數(shù)據(jù)的3dr-tree索引子樹。批處理方式建立3dr-tree將時(shí)空相近的軌跡組合成一個(gè)索引節(jié)點(diǎn),將所有的軌跡數(shù)據(jù)組合成所有3dr-tree的葉子節(jié)點(diǎn)。在這些葉子節(jié)點(diǎn)上,將時(shí)空相近的葉子節(jié)點(diǎn)組合成內(nèi)部節(jié)點(diǎn),并且將所有的葉子節(jié)點(diǎn)組合成內(nèi)部節(jié)點(diǎn)。以此類推,最后的節(jié)點(diǎn)組合得到一個(gè)3dr-tree根節(jié)點(diǎn)。通過這個(gè)根節(jié)點(diǎn),可以索引到所有的軌跡數(shù)據(jù)。(3)索引結(jié)構(gòu)合并生成的索引子樹,需要插入到原有軌跡索引中,形成一個(gè)索引結(jié)構(gòu)。將新生成的3dr-tree索引子樹插入到數(shù)據(jù)庫中原有3dr-tree索引中。判斷索引子樹的根節(jié)點(diǎn)的索引項(xiàng)數(shù)量,當(dāng)索引項(xiàng)數(shù)量小于3dr-tree內(nèi)部節(jié)點(diǎn)的最小索引項(xiàng)數(shù)量的時(shí)候,索引子樹的根節(jié)點(diǎn)不能作為一個(gè)內(nèi)部節(jié)點(diǎn)插入到數(shù)據(jù)庫中原有3dr-tree中,此時(shí)需要將此索引子樹的根節(jié)點(diǎn)的所有索引項(xiàng)分別插入到數(shù)據(jù)庫中原有3dr-tree中。在插入的過程中,采用自頂向下搜索,找到最合適的插入節(jié)點(diǎn),將索引項(xiàng)插入到該節(jié)點(diǎn)中,并且自底向上更新該節(jié)點(diǎn)及其父節(jié)點(diǎn)索引項(xiàng)的最小邊框矩形(mbr)值。合并后得到的索引結(jié)構(gòu)即是軌跡索引插入更新后的索引結(jié)構(gòu)?!居幸嫘Ч勘景l(fā)明所述的基于網(wǎng)格劃分的快速軌跡索引更新方法用于快速更新軌跡的數(shù)據(jù)及其3dr-tree索引,使更新后的軌跡數(shù)據(jù)及索引依然支持高速的移動對象連續(xù)距離查詢。與現(xiàn)有技術(shù)相比,基于網(wǎng)格劃分的快速軌跡索引更新方法的有益效果表現(xiàn)在軌跡索引的更新效率方面。在intel(r)、core(tm)、cpu為i3-2120、主頻2.5ghz、內(nèi)存4gb、ubuntu14.0464位操作系統(tǒng)、c++語言編程環(huán)境下測試,測試數(shù)據(jù)為北京出租車軌跡數(shù)據(jù)和模擬地鐵軌跡數(shù)據(jù),如表1所示。在不同數(shù)據(jù)規(guī)模下,基于網(wǎng)格劃分的快速軌跡索引更新方法與基于z曲線排序更新方法進(jìn)行比較,基于網(wǎng)格劃分的快速軌跡索引更新方法具有更高的更新效率,如表2所示。由表2可以看出,基于網(wǎng)格劃分的軌跡索引更新方法的效率比基于z曲線排序的方法具有更好的效率。表3顯示了不同方法更新后,對查詢性能的影響。由表3可以看出,基于網(wǎng)格劃分的方法更新后的查詢效率比基于z曲線排序方法更新后的查詢效率更好。表1數(shù)據(jù)名稱移動對象數(shù)量單元軌跡數(shù)量tdrives10,35715,000,012trains56251,544trains15126,45011,597,400表2表3因此,基于網(wǎng)格劃分的軌跡索引更新方法具有較好的更新效率,并且更新后所支持的軌跡的連續(xù)距離查詢效率比基于z曲線排序的軌跡更新方法的查詢效率更好。四、附圖說明圖1軌跡數(shù)據(jù)及索引更新圖2軌跡數(shù)據(jù)更新圖3自底向上生成3dr-tree圖4軌跡數(shù)據(jù)在網(wǎng)格中的位置圖5節(jié)點(diǎn)層結(jié)構(gòu)圖6空間網(wǎng)格合并圖73dr-tree索引合并五、具體實(shí)施方式下面結(jié)合附圖對本發(fā)明進(jìn)一步說明。本發(fā)明所述的基于網(wǎng)格劃分的快速軌跡索引更新方法,對新添加的移動對象軌跡數(shù)據(jù)進(jìn)行預(yù)處理,通過批處理方法建立軌跡索引的3dr-tree索引子樹,然后將索引子樹插入到原有軌跡索引的3dr-tree中,得到更新軌跡索引后的3dr-tree索引結(jié)構(gòu),并依然支持高效地連續(xù)距離查詢,如圖1所示,具體按以下步驟實(shí)施。(1)軌跡數(shù)據(jù)預(yù)處理對新加入的軌跡數(shù)據(jù),添加到數(shù)據(jù)庫中原有軌跡數(shù)據(jù)的表中。對于較長的軌跡,通過將軌跡分割成若干個(gè)較短的軌跡,分別添加到數(shù)據(jù)庫中。如圖2所示,新加入的軌跡數(shù)據(jù)包括對象標(biāo)識oid,以及軌跡數(shù)據(jù),將這些數(shù)據(jù)作為一個(gè)元組,插入到表中,得到該記錄在表中的位置tid。例如圖2中的(1,traj6)插入到軌跡數(shù)據(jù)表中,得到在軌跡數(shù)據(jù)表中的tid為10。將tid與軌跡mbr組合而成的3dr-tree索引項(xiàng),作為下一步的輸入,插入到3dr-tree中。(2)基于網(wǎng)格劃分方式批處理生成3dr-tree索引子樹在建立r-tree索引的方法中,批處理、自底向上建立r-tree索引的方式極為有效,建立r-tree所花費(fèi)的時(shí)間短,且保持了r-tree的高效的空間索引能力。所有的軌跡索引項(xiàng)包含了軌跡在數(shù)據(jù)庫中所在的位置和軌跡的時(shí)空范圍mbr。這些軌跡的索引項(xiàng)插入到葉子節(jié)點(diǎn)層,當(dāng)葉子節(jié)點(diǎn)層中的索引項(xiàng)的數(shù)量達(dá)到能組成一個(gè)葉子節(jié)點(diǎn)的最大索引項(xiàng)數(shù)量時(shí),將葉子節(jié)點(diǎn)層中這些索引項(xiàng)組成一個(gè)3dr-tree的葉子節(jié)點(diǎn),并且保存到3dr-tree索引文件中。將葉子節(jié)點(diǎn)在3dr-tree中所在的位置以及葉子節(jié)點(diǎn)的mbr組成一個(gè)3dr-tree內(nèi)部節(jié)點(diǎn)的索引項(xiàng),插入到上一層的內(nèi)部節(jié)點(diǎn)層,如圖3所示。同樣,在內(nèi)部節(jié)點(diǎn)層,當(dāng)內(nèi)部節(jié)點(diǎn)的索引項(xiàng)達(dá)到組成一個(gè)內(nèi)部節(jié)點(diǎn)的最大索引項(xiàng)的數(shù)量的時(shí)候,將這些內(nèi)部節(jié)點(diǎn)的索引項(xiàng)組成一個(gè)內(nèi)部節(jié)點(diǎn),保存到3dr-tree索引文件中。將內(nèi)部節(jié)點(diǎn)在3dr-tree中所在的位置以及內(nèi)部節(jié)點(diǎn)的mbr組成一個(gè)3dr-tree內(nèi)部節(jié)點(diǎn)的索引項(xiàng),插入到上一層的內(nèi)部節(jié)點(diǎn)層。直到所有的軌跡數(shù)據(jù)索引項(xiàng)插入完畢,最后生成一個(gè)3dr-tree根節(jié)點(diǎn),這個(gè)根節(jié)點(diǎn)即為3dr-tree索引子樹的根節(jié)點(diǎn)。在每一個(gè)節(jié)點(diǎn)層,為了能夠使時(shí)空距離相近的索引項(xiàng)組合在一起,形成一個(gè)3dr-tree節(jié)點(diǎn),將所有的時(shí)空距離比較相近的索引項(xiàng)保存在相同的節(jié)點(diǎn)中。因此將時(shí)間和空間分為大小相同的網(wǎng)格,位置在網(wǎng)格中的索引項(xiàng),加入到相同的索引節(jié)點(diǎn)中,能夠盡量將時(shí)空相近的索引項(xiàng)加入到同一個(gè)節(jié)點(diǎn)中。如圖4所示,根據(jù)軌跡traj的mbr在時(shí)間空間里的位置,將軌跡traj添加到最近的網(wǎng)格索引節(jié)點(diǎn)中。每一個(gè)節(jié)點(diǎn)層的結(jié)構(gòu)如圖5所示,這里以二維空間為例。將空間分割為固定大小的網(wǎng)格,網(wǎng)格中存儲了一個(gè)指針,指向一個(gè)桶的數(shù)據(jù)結(jié)構(gòu),這個(gè)桶中存放了索引項(xiàng)。在葉子節(jié)點(diǎn)層中,桶中存放軌跡數(shù)據(jù)的索引項(xiàng),而在內(nèi)部節(jié)點(diǎn)層中,桶中存放子節(jié)點(diǎn)的索引項(xiàng)。插入到該節(jié)點(diǎn)層的索引項(xiàng)數(shù)據(jù)包括(id,mbr),在葉子節(jié)點(diǎn)層,插入索引項(xiàng)中的id為軌跡在數(shù)據(jù)庫中關(guān)系表中的存儲位置,mbr是軌跡數(shù)據(jù)的時(shí)空范圍的最小邊框矩形。而在內(nèi)部節(jié)點(diǎn)層中,id為下層子節(jié)點(diǎn)在r-tree中的存儲位置,mbr為下層子節(jié)點(diǎn)的最小邊框矩形。當(dāng)節(jié)點(diǎn)層中插入一個(gè)索引項(xiàng)時(shí),通過索引項(xiàng)中的mbr計(jì)算該索引項(xiàng)的插入位置。將索引項(xiàng)添加到對應(yīng)網(wǎng)格的索引項(xiàng)桶中。當(dāng)桶中的數(shù)量達(dá)到r-tree節(jié)點(diǎn)的最大索引項(xiàng)數(shù)量時(shí),將桶中的索引項(xiàng)插入到新的節(jié)點(diǎn)中,并保存到r-tree中。而新節(jié)點(diǎn)在r-tree中的位置,以及節(jié)點(diǎn)的mbr則作為新的索引項(xiàng),插入到當(dāng)前節(jié)點(diǎn)層的上一個(gè)節(jié)點(diǎn)層中。如算法1所示,將一個(gè)索引項(xiàng)entry插入到r-tree節(jié)點(diǎn)層rtreelevel,首先找到索引項(xiàng)entry.mbr最靠近的網(wǎng)格,將entry插入到網(wǎng)格對應(yīng)的索引項(xiàng)桶中。當(dāng)索引項(xiàng)桶中的數(shù)量大于等于r-tree節(jié)點(diǎn)的最大索引項(xiàng)數(shù)量的時(shí)候,將索引項(xiàng)桶中的索引項(xiàng)組成r-tree節(jié)點(diǎn)node,并保存到r-tree中。將node.mbr與node保存到r-tree中的位置rid組成newentry,并插入到當(dāng)前r-tree節(jié)點(diǎn)層的上層節(jié)點(diǎn)層中。算法1.insertentry(rtreelevel,entry)輸入:r-tree節(jié)點(diǎn)層rtreelevel索引項(xiàng)entry輸出:r-tree節(jié)點(diǎn)層rtreelevel1.獲取entry.mbr所在空間網(wǎng)格的索引項(xiàng)桶;2.將entry插入到索引項(xiàng)桶中;3.if索引項(xiàng)桶中的索引項(xiàng)數(shù)量大于等于節(jié)點(diǎn)最大索引項(xiàng)數(shù)量4.將索引項(xiàng)桶中的索引項(xiàng)組成一個(gè)r-tree節(jié)點(diǎn)node,并清空索引項(xiàng)桶中的索引項(xiàng);5.newentry.mbr←node.mbr;6.將node保存到r-tree中,并且的到node在r-tree中的位置rid;7.newentry.rid←rid;8.insertentry(rtreelevel.nextlevel,newentry);9.endif10.returnrtreelevel;當(dāng)所有的軌跡數(shù)據(jù)的索引項(xiàng)插入完畢,此時(shí),節(jié)點(diǎn)層中還剩下索引項(xiàng)未能組合索引節(jié)點(diǎn)保存到r-tree中。在接下來的處理中,需要從下至上,將所有節(jié)點(diǎn)層中的索引項(xiàng)組合成節(jié)點(diǎn),保存到r-tree中,并將該節(jié)點(diǎn)所生成的索引項(xiàng)插入到上一個(gè)節(jié)點(diǎn)層中。如圖6所示,將空間網(wǎng)格的大小擴(kuò)大,由原先的2n個(gè)網(wǎng)格組成一個(gè)更大的網(wǎng)格,其中n為網(wǎng)格的空間維度,在2dr-tree中,n的值為2,在3dr-tree中,n的值為3。將這些網(wǎng)格中的索引項(xiàng)插入到新索引項(xiàng)桶中。同樣,當(dāng)新的索引項(xiàng)桶中索引項(xiàng)的數(shù)量達(dá)到r-tree節(jié)點(diǎn)的最大索引項(xiàng)的數(shù)量的時(shí)候,將桶中的索引項(xiàng)插入到新的節(jié)點(diǎn)中,并保存到r-tree中,并將該節(jié)點(diǎn)所生成的索引項(xiàng)插入到上一個(gè)節(jié)點(diǎn)層中。如此反復(fù)將空間網(wǎng)格擴(kuò)大,直到將網(wǎng)格中的所有索引項(xiàng)組合成r-tree節(jié)點(diǎn),保存到r-tree中,并插入到上一個(gè)節(jié)點(diǎn)層中。當(dāng)節(jié)點(diǎn)層從下至上一層一層將索引項(xiàng)組合保存到r-tree中,到了最頂層,所有節(jié)點(diǎn)的索引項(xiàng)數(shù)量小于索引節(jié)點(diǎn)的最大索引項(xiàng)數(shù)量時(shí),將該層的所有索引項(xiàng)組合成一個(gè)節(jié)點(diǎn),保存到r-tree中,作為r-tree的根節(jié)點(diǎn)。對于非根節(jié)點(diǎn)層,當(dāng)節(jié)點(diǎn)層中的索引項(xiàng)不足r-tree節(jié)點(diǎn)的最小索引項(xiàng)數(shù)量時(shí),不能直接將節(jié)點(diǎn)層中剩余的索引項(xiàng)組合成一個(gè)節(jié)點(diǎn)保存到r-tree中。對于這些索引項(xiàng),插入到r-tree中與當(dāng)前節(jié)點(diǎn)層高相同的節(jié)點(diǎn)中。找到與當(dāng)前節(jié)點(diǎn)層高相同,并且最適合插入的節(jié)點(diǎn),使插入索引項(xiàng)后,節(jié)點(diǎn)的mbr增加最小。將所有節(jié)點(diǎn)層中的索引項(xiàng)都插入到r-tree中,所得到的根節(jié)點(diǎn)即為批處理建立的r-tree的根節(jié)點(diǎn),至此,基于網(wǎng)格的批處理方法的r-tree索引子樹已經(jīng)生成。(3)索引合并。將生成的3dr-tree,與數(shù)據(jù)庫中原有的3dr-tree合并。在合并的同時(shí),考慮到3dr-tree索引結(jié)構(gòu)保持平衡的性質(zhì),以及保持3dr-tree的時(shí)間和空間的區(qū)分能力。在合并3dr-tree的時(shí)候,需要考慮原有3dr-tree與新插入3dr-tree的層高。為了保持3dr-tree的結(jié)構(gòu)平衡,以及減少3dr-tree的插入操作,將層高較低的3dr-tree插入到層高較高的3dr-tree中。如圖7所示,r1是層數(shù)為2的3dr-tre,r2的層數(shù)為3,因此在插入的時(shí)候,將r1插入到r2中層高與r1相同的父節(jié)點(diǎn)中,在圖7中,將r1插入到r2的根節(jié)點(diǎn)中。在插入的時(shí)候,還要考慮到被插入3dr-tree的根節(jié)點(diǎn)的索引項(xiàng)的數(shù)量,因?yàn)閷?dr-tree的根節(jié)點(diǎn)插入到另一個(gè)3dr-tree中時(shí),有可能作為生成的3dr-tree中的一個(gè)內(nèi)部節(jié)點(diǎn)。例如圖7所示,r1插入到r2中,將r1的根節(jié)點(diǎn)作為r3中的一個(gè)內(nèi)部節(jié)點(diǎn)存在,因此需要考慮r1根節(jié)點(diǎn)中索引項(xiàng)的數(shù)量。當(dāng)r1根節(jié)點(diǎn)的索引項(xiàng)的數(shù)量小于內(nèi)部節(jié)點(diǎn)索引項(xiàng)的最小數(shù)量時(shí),需要將r1的根節(jié)點(diǎn)拆分,將r1根節(jié)點(diǎn)中所有索引項(xiàng)作為一個(gè)3dr-tree的子樹插入到r2中??紤]這兩種情況,可以得到3dr-tree索引合并的算法,如算法2所示。其中smallrtree是高度較低的r-tree,而largertree是層高較高的r-tree。如果smallrtree的根節(jié)點(diǎn)的索引項(xiàng)的數(shù)量大于或者等于r-tree的內(nèi)部節(jié)點(diǎn)的索引項(xiàng)數(shù)量的最小值,則將smallrtree的根節(jié)點(diǎn)作為一個(gè)索引項(xiàng)插入到largertree中層高與smallrtree相同的父節(jié)點(diǎn)中。如果smallrtree的根節(jié)點(diǎn)的索引項(xiàng)的數(shù)量小于r-tree的內(nèi)部節(jié)點(diǎn)的索引項(xiàng)數(shù)量的最小值,則將smallrtree的根節(jié)點(diǎn)的所有索引項(xiàng)插入到與smallrtree層高相同的largertree的內(nèi)部節(jié)點(diǎn)中。算法2.rtreeinsert(smallrtree,largertree)輸入:較小3dr-tree索引smallrtree較大3dr-tree索引largertree輸出:合并后的3dr-tree1.if(smallrtree.root的索引項(xiàng)數(shù)量大于或等于內(nèi)部節(jié)點(diǎn)索引項(xiàng)數(shù)量的最小值)2.將smallrtree.root作為一個(gè)索引項(xiàng)插入到largertree;3.else4.foreachentryinsmallrtree.root5.將entry插入到largertree;6.endfor7.endif8.returnlargertree;通過3dr-tree合并之后,得到更新后的軌跡數(shù)據(jù)的3dr-tree索引,完成移動對象的軌跡索引的更新。當(dāng)前第1頁12