本發(fā)明涉及一種空間幾何線要素構(gòu)面技術(shù)領(lǐng)域,特別是涉及一種新的線要素構(gòu)面方法。
背景技術(shù):
拓?fù)錁?gòu)面是地理數(shù)據(jù)建庫(kù)、城市基礎(chǔ)地理信息數(shù)據(jù)庫(kù)更新、cad數(shù)據(jù)轉(zhuǎn)換為gis數(shù)據(jù)以及dlg數(shù)據(jù)入庫(kù)等過(guò)程中經(jīng)常用到的功能,同時(shí),拓?fù)錁?gòu)面也是數(shù)據(jù)庫(kù)中拓?fù)潢P(guān)系建立過(guò)程中的重點(diǎn)和難點(diǎn)。眾多學(xué)者都對(duì)拓?fù)錁?gòu)面進(jìn)行了研究,目前的主要方法有左轉(zhuǎn)算法(或右轉(zhuǎn)算法)和節(jié)點(diǎn)依次搜索算法。前者利用節(jié)點(diǎn)連接線段的方位角,按照一定的方向自動(dòng)搜索下一條線段,最終回到起始節(jié)點(diǎn)生成多邊形;后者通過(guò)依次搜索節(jié)點(diǎn)和線段的連接信息,獲得多邊形。
上述算法在理想狀態(tài)下可以進(jìn)行拓?fù)錁?gòu)面,但在實(shí)際生產(chǎn)中,由于實(shí)際要素的復(fù)雜性,會(huì)導(dǎo)致一些問(wèn)題。例如,多邊形存在懸掛線段時(shí),左轉(zhuǎn)算法無(wú)法構(gòu)面;存在假懸掛節(jié)點(diǎn)或假懸掛弧段和橋時(shí),節(jié)點(diǎn)依次搜索算法會(huì)造成無(wú)效搜索和回退搜索;面中可能存在洞;搜索算法效率較低等情況。因此,我們需要一種能夠解決以上問(wèn)題的快速構(gòu)面方法。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明旨在至少解決現(xiàn)有技術(shù)中存在的技術(shù)問(wèn)題,特別創(chuàng)新地提出了一種新的線要素構(gòu)面方法。
為了實(shí)現(xiàn)本發(fā)明的上述目的,本發(fā)明提供了一種新的線要素構(gòu)面方法,包括以下步驟:
s1,判斷輸入的線要素是否相交,若是,則將所有線要素合并為線網(wǎng),再對(duì)線網(wǎng)進(jìn)行打散處理,去除重復(fù)節(jié)點(diǎn),獲得所有不重復(fù)的節(jié)點(diǎn)和線段;
否則,執(zhí)行下一步;
s2,定義線段數(shù)據(jù)結(jié)構(gòu)和節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu);
線段數(shù)據(jù)結(jié)構(gòu)包括線段id、線段實(shí)體、線段起點(diǎn)、線段終點(diǎn)、線段正方向和反方向是否被搜索標(biāo)志之一或其任意組合;
節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)包括節(jié)點(diǎn)id、節(jié)點(diǎn)實(shí)體、節(jié)點(diǎn)連接的線段和節(jié)點(diǎn)連接各線段的方位角之一或其任意組合;
遍歷線段和節(jié)點(diǎn),組成有向圖;
s3,判斷節(jié)點(diǎn)連接線段的個(gè)數(shù)是否為1個(gè),若某個(gè)節(jié)點(diǎn)連接線段的個(gè)數(shù)為1個(gè),則去除該節(jié)點(diǎn)和該節(jié)點(diǎn)連接的線段,并迭代,直至獲得不包含懸掛線段和節(jié)點(diǎn)的有向圖;
否則,執(zhí)行下一步;
s4,選取任一節(jié)點(diǎn)作為起始節(jié)點(diǎn),選取與起始節(jié)點(diǎn)連接的任一線段作為當(dāng)前搜索線段,將搜索線段前進(jìn)方向作為搜索方向,并判斷該搜索方向是否為正方向,若是,則標(biāo)記該線段正方向已搜索;否則標(biāo)記該線段負(fù)方向已搜索;
且判斷當(dāng)前搜索線段在當(dāng)前搜索線段上的另一節(jié)點(diǎn)上的方位角與在該節(jié)點(diǎn)上所有連接線段的方位角的大??;
若當(dāng)前搜索線段在當(dāng)前搜索線段上的另一節(jié)點(diǎn)上的方位角是該節(jié)點(diǎn)上所有線段中最小的方位角,則將該節(jié)點(diǎn)上最大方位角的線段作為下一搜索線段;
否則,將次小于當(dāng)前搜索線段的方位角的線段作為下一搜索線段;直至回到起始節(jié)點(diǎn),搜索到的所有線段形成多邊形;
s5,重復(fù)步驟s4,若搜索到已標(biāo)志相同方向線段時(shí)停止搜索,即可不產(chǎn)生重復(fù)面要素,重復(fù)步驟s5,直至搜索到所有多邊形。
在本發(fā)明的一種優(yōu)選實(shí)施方式中,有向圖的獲取方法為:通過(guò)節(jié)點(diǎn)id可以獲得線段的連接信息,通過(guò)線段id可以獲得其所連接的節(jié)點(diǎn)信息。
在本發(fā)明的一種優(yōu)選實(shí)施方式中,根據(jù)有向圖中線段和節(jié)點(diǎn)的方位角,按逆時(shí)針?lè)较虮闅v所述有向圖,獲得多邊形:選任選一節(jié)點(diǎn)作為當(dāng)前節(jié)點(diǎn),隨機(jī)選擇節(jié)點(diǎn)連接的線段作為前進(jìn)方向,線段的終點(diǎn)作為當(dāng)前節(jié)點(diǎn),選擇前進(jìn)方向左側(cè)夾角最小的線段為下一前進(jìn)方向,直至回到起始節(jié)點(diǎn),經(jīng)過(guò)的線段組成一個(gè)多邊形。
在本發(fā)明的一種優(yōu)選實(shí)施方式中,還包括步驟s6:判斷多邊形是否按逆時(shí)針?lè)较蛩阉?,若是,則該多邊形為有效多邊形;
否則,該多邊形為無(wú)效多邊形,舍去。
在本發(fā)明的一種優(yōu)選實(shí)施方式中,多邊形是否有效可以根據(jù)多邊形的夾角變換趨勢(shì)判斷:選擇y軸坐標(biāo)最小值的節(jié)點(diǎn)為起始節(jié)點(diǎn),對(duì)多邊形所有節(jié)點(diǎn)按照構(gòu)造多邊形時(shí)的順序排列,根據(jù)第一個(gè)線段的方位角和最后一個(gè)線段的方位角可判斷多邊形是否符合逆時(shí)針計(jì)算的規(guī)定。
在本發(fā)明的一種優(yōu)選實(shí)施方式中,還包括步驟s6:判斷各個(gè)多邊形之間的關(guān)系,若是屬于包含關(guān)系,則將被包含的多邊形作為洞,從大的多邊形中挖去,形成有洞的多邊形;
若是孤立的面要素,則處理為島。
在本發(fā)明的一種優(yōu)選實(shí)施方式中,所述線要素和/或面要素為對(duì)應(yīng)的任一矢量格式的線狀和/或面狀地理信息數(shù)據(jù)。
在本發(fā)明的一種優(yōu)選實(shí)施方式中,線狀地理信息數(shù)據(jù)為道路線、河流線和地類界之一或者任意組合。
在本發(fā)明的一種優(yōu)選實(shí)施方式中,面狀地理信息數(shù)據(jù)包括道路面、河流面、植被面之一或者任意組合。
綜上所述,由于采用了上述技術(shù)方案,本發(fā)明的有益效果是:本發(fā)明能夠?qū)Χ噙呅未嬖趹覓炀€段、假懸掛節(jié)點(diǎn)或假懸掛弧段和橋時(shí),仍然可能快速構(gòu)面。
附圖說(shuō)明
圖1是本發(fā)明的構(gòu)面流程示意圖。
圖2是本發(fā)明方位角定義的示意圖。
圖3是本發(fā)明構(gòu)面結(jié)果的示意圖。
圖4是構(gòu)面結(jié)果包含洞和島的示意圖。
具體實(shí)施方式
下面詳細(xì)描述本發(fā)明的實(shí)施例,所述實(shí)施例的示例在附圖中示出,其中自始至終相同或類似的標(biāo)號(hào)表示相同或類似的元件或具有相同或類似功能的元件。下面通過(guò)參考附圖描述的實(shí)施例是示例性的,僅用于解釋本發(fā)明,而不能理解為對(duì)本發(fā)明的限制。
在本發(fā)明的描述中,需要理解的是,術(shù)語(yǔ)“縱向”、“橫向”、“上”、“下”、“前”、“后”、“左”、“右”、“豎直”、“水平”、“頂”、“底”“內(nèi)”、“外”等指示的方位或位置關(guān)系為基于附圖所示的方位或位置關(guān)系,僅是為了便于描述本發(fā)明和簡(jiǎn)化描述,而不是指示或暗示所指的裝置或元件必須具有特定的方位、以特定的方位構(gòu)造和操作,因此不能理解為對(duì)本發(fā)明的限制。
在本發(fā)明的描述中,除非另有規(guī)定和限定,需要說(shuō)明的是,術(shù)語(yǔ)“安裝”、“相連”、“連接”應(yīng)做廣義理解,例如,可以是機(jī)械連接或電連接,也可以是兩個(gè)元件內(nèi)部的連通,可以是直接相連,也可以通過(guò)中間媒介間接相連,對(duì)于本領(lǐng)域的普通技術(shù)人員而言,可以根據(jù)具體情況理解上述術(shù)語(yǔ)的具體含義。
本發(fā)明提供了一種新的線要素構(gòu)面方法,如圖1所示,該方法包括以下步驟:
第一步,判斷輸入的線要素是否相交,輸入的線要素為空間信息中的矢量線段(例如道路、河流在地圖中的具體表示),若是,則將所有線要素合并為線網(wǎng),線要素提取完成后可設(shè)置程序自動(dòng)合并為線網(wǎng)。再對(duì)線網(wǎng)進(jìn)行打散處理,去除重復(fù)節(jié)點(diǎn),獲得所有不重復(fù)的節(jié)點(diǎn)和線段;否則,執(zhí)行第二步。
第二步,定義線段數(shù)據(jù)結(jié)構(gòu)和節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu);線段數(shù)據(jù)結(jié)構(gòu)包括線段id、線段實(shí)體、線段起點(diǎn)、線段終點(diǎn)、線段正方向和反方向是否被搜索標(biāo)志;節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)包括節(jié)點(diǎn)id、節(jié)點(diǎn)實(shí)體、節(jié)點(diǎn)連接的線段和節(jié)點(diǎn)連接各線段的方位角,在本實(shí)施方式中,每個(gè)線段的方位角都是固定的,具體可以為線段起點(diǎn)至線段終點(diǎn)的方向或者線段終點(diǎn)至線段起點(diǎn)的方向,在具體構(gòu)面,優(yōu)選線段的方位角同時(shí)為線段起點(diǎn)至線段終點(diǎn)的方向,或者同時(shí)為線段終點(diǎn)至線段起點(diǎn)的方向;遍歷線段和節(jié)點(diǎn),通過(guò)節(jié)點(diǎn)id可以獲得線段的連接信息,通過(guò)線段id可以獲得其所連接的節(jié)點(diǎn)信息,最終組成有向圖。在本實(shí)施方式中,利用定義的節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)和線段數(shù)據(jù)結(jié)構(gòu),將獲得所有節(jié)點(diǎn)和線段構(gòu)造成有向圖。這個(gè)過(guò)程中需要遍歷所有線段和節(jié)點(diǎn),首先是給線段和節(jié)點(diǎn)編號(hào),然后根據(jù)線段起點(diǎn)、終點(diǎn)坐標(biāo)和節(jié)點(diǎn)坐標(biāo)將線段和節(jié)點(diǎn)關(guān)聯(lián),使每個(gè)節(jié)點(diǎn)知道連接的線段。在構(gòu)造有向圖過(guò)程中為了消除懸掛線段的影響,需要迭代,將節(jié)點(diǎn)連接個(gè)數(shù)為1的節(jié)點(diǎn)和連接的線段移除,再次關(guān)聯(lián)其余線段和節(jié)點(diǎn),直到?jīng)]有連接一個(gè)線段的節(jié)點(diǎn),最后根據(jù)連接信息連成有向圖。例如對(duì)線段1,id號(hào)(線段編號(hào))為1,線段起點(diǎn)為p1,終點(diǎn)為p2,正方向?yàn)橄蛄縜,反方向?yàn)橄蛄縝。
在本實(shí)施方式中,方位角的計(jì)算方法如下:坐標(biāo)系確定后,方位角由節(jié)點(diǎn)和該節(jié)點(diǎn)上的線段求出。方位角是以x正半軸為起始方向,沿逆時(shí)針?lè)较虻侥骋簧渚€的角度,用α表示。如圖2所示,oa的方位角αa和ob的方位角αb,方位角取值范圍為[0,2π),不存在負(fù)值。
第三步,判斷節(jié)點(diǎn)連接線段的個(gè)數(shù)是否為1個(gè),若某個(gè)節(jié)點(diǎn)連接線段的個(gè)數(shù)為1個(gè),則去除該節(jié)點(diǎn)和該節(jié)點(diǎn)連接的線段,并迭代,直至獲得不包含懸掛線段和節(jié)點(diǎn)的有向圖;否則,執(zhí)行第四步。
第四步,選取任一節(jié)點(diǎn)作為起始節(jié)點(diǎn),選取與起始節(jié)點(diǎn)連接的任一線段作為當(dāng)前搜索線段,(應(yīng)當(dāng)注意的,節(jié)點(diǎn)選取的次數(shù)與該節(jié)點(diǎn)上連接的線段的個(gè)數(shù)相等,且已搜索相同方向的線段不再選取)將搜索線段前進(jìn)方向作為搜索方向,并判斷該搜索方向是否為正方向,若是,則標(biāo)記該線段正方向已搜索;否則標(biāo)記該線段負(fù)方向已搜索;且判斷當(dāng)前搜索線段在當(dāng)前搜索線段上的另一節(jié)點(diǎn)上的方位角與在該節(jié)點(diǎn)上所有連接線段的方位角的大小;若當(dāng)前搜索線段在當(dāng)前搜索線段上的另一節(jié)點(diǎn)上的方位角是該節(jié)點(diǎn)上所有線段中最小的方位角,這里是找出該節(jié)點(diǎn)上所有線段中最小的方位角。則將該節(jié)點(diǎn)上最大方位角的線段作為下一搜索線段;否則,將次小于當(dāng)前搜索線段的方位角的線段作為下一搜索線段;直至回到起始節(jié)點(diǎn),搜索到的所有線段形成多邊形。
第五步,重復(fù)第四步,若搜索到已標(biāo)志相同方向線段時(shí)停止搜索,即可不產(chǎn)生重復(fù)面要素,重復(fù)第五步,直至搜索到所有多邊形。
在本實(shí)施方式中,根據(jù)有向圖中線段和節(jié)點(diǎn)的方位角,按逆時(shí)針?lè)较虮闅v所述有向圖,獲得多邊形:選任選一節(jié)點(diǎn)作為當(dāng)前節(jié)點(diǎn),隨機(jī)選擇節(jié)點(diǎn)連接的線段作為前進(jìn)方向,線段的終點(diǎn)作為當(dāng)前節(jié)點(diǎn),選擇前進(jìn)方向左側(cè)夾角最小的線段為下一前進(jìn)方向,直至回到起始節(jié)點(diǎn),經(jīng)過(guò)的線段組成一個(gè)多邊形。
在本實(shí)施方式中,還包括第六步,判斷各個(gè)多邊形是否按逆時(shí)針?lè)较蛩阉?,若是,則該多邊形為有效多邊形;否則,該多邊形為無(wú)效多邊形,舍去。多邊形是否有效可以根據(jù)多邊形的夾角變換趨勢(shì)判斷:選擇y軸坐標(biāo)最小值的節(jié)點(diǎn)為起始節(jié)點(diǎn),對(duì)多邊形所有節(jié)點(diǎn)按照構(gòu)造多邊形時(shí)的順序排列,根據(jù)第一個(gè)線段的方位角和最后一個(gè)線段的方位角可判斷多邊形是否符合逆時(shí)針計(jì)算的規(guī)定。在本實(shí)施方式中,還包括第七步,如圖4所示,判斷多邊形之間的關(guān)系,若是屬于包含關(guān)系,則將被包含的多邊形作為洞,從大的多邊形中挖去,形成有洞的多邊形;若是孤立的面要素,則處理為島。即在程序中判定為島,直接構(gòu)面,處理成孤立島面即完成構(gòu)面。
在本發(fā)明的一種優(yōu)選實(shí)施方式中,所述線要素為任一矢量格式的線狀地理信息數(shù)據(jù)。
在本發(fā)明的一種更加優(yōu)選實(shí)施方式中,線狀地理信息數(shù)據(jù)包括道路線、河流線和地類界之一或者組合。
在本發(fā)明的一種優(yōu)選實(shí)施方式中,所述面要素為任一矢量格式的面狀地理信息數(shù)據(jù)。
在本發(fā)明的一種更加優(yōu)選實(shí)施方式中,面狀地理信息數(shù)據(jù)包括道路面、河流面、植被面之一或者組合。
下面舉出相應(yīng)的實(shí)施例:
如圖3所示,以o點(diǎn)作為直角坐標(biāo)系的原點(diǎn)建立直角坐標(biāo)系,在節(jié)點(diǎn)o處,oa、od的方位角的大小關(guān)系為aod<aoa;相應(yīng)的,將直角坐標(biāo)系平移到節(jié)點(diǎn)a處,ab、ao的方位角大小關(guān)系為aab<aao;同理,將直角坐標(biāo)系原點(diǎn)平移到節(jié)點(diǎn)b處,ba、bc、bd的方位角的大小關(guān)系為abc<aba<abd;將直角坐標(biāo)系平移到節(jié)點(diǎn)c處,cb、cd的方位角大小關(guān)系為acb<acd;將直角坐標(biāo)系原點(diǎn)平移到節(jié)點(diǎn)d處,d0、db、dc的方位角的大小關(guān)系為adc<adb<ado。
選取任一節(jié)點(diǎn)作為起始節(jié)點(diǎn)(例如節(jié)點(diǎn)o),選取節(jié)點(diǎn)o連接的線段od作為搜索線段;并同時(shí)標(biāo)記搜索線段的方向,在節(jié)點(diǎn)d處,計(jì)算d0、db、dc的方位角,得出adc<adb<ado,故下一搜索線段為db;在節(jié)點(diǎn)b處,計(jì)算ba、bc、bd的方位角,得出abc<aba<abd,故下一搜索線段為ba;在節(jié)點(diǎn)a處,計(jì)算ab、ao的方位角,得出aab<aao,故下一搜索線段為ao;由于回到了起始節(jié)點(diǎn)o,所以搜索到的線段構(gòu)成多邊形odbao。
同理,選取節(jié)點(diǎn)o作為起始節(jié)點(diǎn),選取節(jié)點(diǎn)o連接的線段oa作為搜索線段;并同時(shí)標(biāo)記搜索線段的方向,在節(jié)點(diǎn)a處,計(jì)算ab、ao的方位角,得出aab<aao,故下一搜索線段為ab;在節(jié)點(diǎn)b處,計(jì)算ba、bc、bd的方位角,得出abc<aba<abd,故下一搜索線段為bc;在節(jié)點(diǎn)c處,計(jì)算cb、cd的方位角,得出acb<acd,故下一搜索線段為cd;在節(jié)點(diǎn)d處,計(jì)算dc、do的方位角,得出adc<ado,故下一搜索線段為do;由于回到了起始節(jié)點(diǎn)o,所以搜索到的線段構(gòu)成多邊形oabcdo。由于該多邊形oabcdo不是逆時(shí)針?lè)较蛩阉?,故該多邊形oabcdo為無(wú)效多邊形。
選取節(jié)點(diǎn)d作為起始節(jié)點(diǎn),選取節(jié)點(diǎn)d連接的線段dc作為搜索線段;并同時(shí)標(biāo)記搜索線段的方向,在節(jié)點(diǎn)c處,計(jì)算cb、cd的方位角,得出acb<acd,故下一搜索線段為cb;在節(jié)點(diǎn)b處,計(jì)算ba、bc、bd的方位角,得出abc<aba<abd,故下一搜索線段為bd;由于回到了起始節(jié)點(diǎn)d,所以搜索到的線段構(gòu)成多邊形dcbd。
同理,選取節(jié)點(diǎn)d作為起始節(jié)點(diǎn),選取節(jié)點(diǎn)d連接的線段db作為搜索線段;由于線段db的搜索方向已被標(biāo)記搜索了,故停止本次搜索,重新搜索與節(jié)點(diǎn)d相連的其它線段或者未選取的其它節(jié)點(diǎn)。
在本說(shuō)明書的描述中,參考術(shù)語(yǔ)“一個(gè)實(shí)施例”、“一些實(shí)施例”、“示例”、“具體示例”、或“一些示例”等的描述意指結(jié)合該實(shí)施例或示例描述的具體特征、結(jié)構(gòu)、材料或者特點(diǎn)包含于本發(fā)明的至少一個(gè)實(shí)施例或示例中。在本說(shuō)明書中,對(duì)上述術(shù)語(yǔ)的示意性表述不一定指的是相同的實(shí)施例或示例。而且,描述的具體特征、結(jié)構(gòu)、材料或者特點(diǎn)可以在任何的一個(gè)或多個(gè)實(shí)施例或示例中以合適的方式結(jié)合。
盡管已經(jīng)示出和描述了本發(fā)明的實(shí)施例,本領(lǐng)域的普通技術(shù)人員可以理解:在不脫離本發(fā)明的原理和宗旨的情況下可以對(duì)這些實(shí)施例進(jìn)行多種變化、修改、替換和變型,本發(fā)明的范圍由權(quán)利要求及其等同物限定。