路网自动构建路段拓扑
背景
在做道路匹配的時(shí)候,你發(fā)現(xiàn)很多論文都是基于路網(wǎng)的拓?fù)潢P(guān)系做的,但是問(wèn)題就是:如何構(gòu)建路網(wǎng)的拓?fù)潢P(guān)系?一般的論文都已經(jīng)在構(gòu)建好拓?fù)潢P(guān)系的基礎(chǔ)上直接拿來(lái)用,有些論文說(shuō)是使用MapInfo、MapX等等工具生成拓?fù)潢P(guān)系(我沒(méi)試過(guò),但是好像也需要寫(xiě)代碼)。
其實(shí),在ArcGIS里面,稍稍研究一下,間接就能建立路段之間的拓?fù)潢P(guān)系了。
然而,在百度搜“ArcGIS建立拓?fù)洹?#xff0c;多數(shù)都是拓?fù)潢P(guān)系的處理,比如批量消除偽節(jié)點(diǎn)、懸掛點(diǎn)等等(對(duì)路網(wǎng)數(shù)據(jù)的處理確實(shí)很好用),和本文主題說(shuō)的路段拓?fù)潢P(guān)系構(gòu)建不是一個(gè)概念。
補(bǔ)充
正文
路段拓?fù)涞亩x:在路網(wǎng)數(shù)據(jù)中,使用"弧-結(jié)點(diǎn)"形式的數(shù)據(jù)結(jié)構(gòu)來(lái)表示,弧段由兩個(gè)端點(diǎn)定義:指示弧段起始位置的起始節(jié)點(diǎn),指示弧段終止位置的終止節(jié)點(diǎn)。這被稱為弧-結(jié)點(diǎn)拓?fù)?。正是由于有這樣的結(jié)構(gòu),只要路段收尾相連不斷開(kāi),就能保證路網(wǎng)的連通性。
在ArcGIS里面,有一種用于存儲(chǔ)矢量數(shù)據(jù)的地理相關(guān)數(shù)據(jù)模型,它叫:Coverage。當(dāng)Coverage生成的時(shí)候,它就包括了節(jié)點(diǎn)(node)、弧段(arc)、tic文件。這就可以基于coverage的存儲(chǔ)結(jié)構(gòu)使用這些文件來(lái)進(jìn)行路段拓?fù)涞臉?gòu)建。
那么,為什么coverage可以做到呢?因?yàn)镃overage具有連通性、區(qū)域定義、鄰接、生成拓?fù)涞墓δ?。我們看一張ArcGIS官方對(duì)Coverage的連通性描述:
從圖片中可以看出,在交叉路口(相鄰的邊),邊與邊共享同一個(gè)結(jié)點(diǎn)。例如:路段1的起點(diǎn)ID是10,終點(diǎn)ID是11。路段2的起始ID是11,終點(diǎn)ID是12。則路段1.endID=路段2.startID。具有這種連通性拓?fù)浣Y(jié)構(gòu)的網(wǎng)絡(luò),才是我們需要的路段拓?fù)洹?/p>
構(gòu)建路段拓?fù)湫枰臏?zhǔn)備: 首先,你得有一份路網(wǎng)數(shù)據(jù)。當(dāng)然,一般的路網(wǎng)數(shù)據(jù)都是有各種問(wèn)題的,這個(gè)需要我們處理,比如:路網(wǎng)的偽節(jié)點(diǎn)、懸掛點(diǎn)等等情況。
當(dāng)你已經(jīng)處理好了這樣的數(shù)據(jù)了(即一條路以交叉路口為分界),如下圖所示,你就可以開(kāi)始構(gòu)建路段拓?fù)淞恕?br />
開(kāi)始構(gòu)路段建拓?fù)?#xff1a;
一、新建一個(gè)個(gè)人地理數(shù)據(jù)庫(kù),然后道路你的路網(wǎng)數(shù)據(jù),然后建立集合網(wǎng)絡(luò)。
其中,構(gòu)建出來(lái)的幾何網(wǎng)絡(luò)有一個(gè)叫:xxx_Junction的,這個(gè)是路段的起點(diǎn)和終點(diǎn)。(再次聲明:要按照上述準(zhǔn)備階段處理完的路網(wǎng)結(jié)構(gòu)才行!)
二、路網(wǎng)數(shù)據(jù)導(dǎo)出Coverage格式
在你的個(gè)人地理數(shù)據(jù)庫(kù)里面,右鍵你的路網(wǎng)數(shù)據(jù)–>導(dǎo)出–>轉(zhuǎn)為Coverage。
到這一步,要把剛才的xxx_Junction一起選入。
三、簡(jiǎn)單瀏覽導(dǎo)出的Coverage文件
這時(shí)候,就會(huì)生成節(jié)點(diǎn)文件、弧段文件、tic文件、原路網(wǎng)文件。其中,我們重點(diǎn)關(guān)注是arc弧段文件。
我們來(lái)分析一下arc弧段文件:FNODE是起點(diǎn)編號(hào)(下文"編號(hào)"統(tǒng)統(tǒng)用"ID"來(lái)稱呼),TNODE是終點(diǎn)ID。其余一些屬性是系統(tǒng)自動(dòng)生成的,沒(méi)什么實(shí)際用處,我們重點(diǎn)來(lái)關(guān)注FNODE和TNODE即可。
我們來(lái)測(cè)試一下它生成路段的起始ID和終點(diǎn)ID是否正確:
通過(guò)多次隨機(jī)抽取路段進(jìn)行對(duì)比,都是正確的。其中,路段顯示方向這個(gè)是根據(jù)direction字段進(jìn)行可視化顯示的,與數(shù)字化道路方向相同或相反(有的使用oneway字段)。但是,無(wú)論是direction還是oneway字段,都是你路網(wǎng)數(shù)據(jù)有的,要么你自己抽取出來(lái)。
四、arc弧段文件導(dǎo)出shp格式:
右鍵arc弧段文件–>導(dǎo)出
五、把a(bǔ)rc弧段文件和原路網(wǎng)文件進(jìn)行合并處理(重要的一步)
ArcToolbox–>分析工具–>疊加分析–>相交
把兩個(gè)文件的相交部分合并在一起,這樣arc弧段文件的起點(diǎn)ID和終點(diǎn)ID的屬性列表也就合并在原文件里面了。
六、查看合并結(jié)果
經(jīng)過(guò)對(duì)比分析,每條路段的起點(diǎn)ID、終點(diǎn)ID是一致的。并且,上一路段的終點(diǎn)ID等于下一路段的起點(diǎn)ID。
補(bǔ)充
關(guān)于上面生成的道路節(jié)點(diǎn),只需要記住:snode是數(shù)字化道路的起點(diǎn),enode是數(shù)字化道路的終點(diǎn),就可以了。
至于加入direction方向(可參考我另一篇博客:數(shù)字化方向)來(lái)判斷之后,會(huì)顯得很繞。但是大概的拓?fù)潢P(guān)系我都寫(xiě)在下圖了。
結(jié)語(yǔ)
連續(xù)整了好幾天,終于整出來(lái)了。其實(shí),我不是學(xué)地理信息專業(yè)的,但是有句話說(shuō)得很好:念念不忘,必有回響。距離發(fā)表論文還是有段距離,寫(xiě)下來(lái)記錄一下自己的成果吧。 現(xiàn)在論文被錄了,這篇博客就可以放出來(lái)了~
其實(shí),在構(gòu)建路段拓?fù)涞臅r(shí)候,也有過(guò)A、B、C等等一系列的解決方案,都失敗了,最后還是這個(gè)方案成功了。也說(shuō)說(shuō)其他方案的處理,或許能給其他人提供解決方案。
A方案:ArcGIS里面能提出每條路段的起始、終止節(jié)點(diǎn)。數(shù)據(jù)管理工具–>要素–>要素折點(diǎn)轉(zhuǎn)點(diǎn)。但是提取出來(lái)的端點(diǎn)編號(hào)全部不一致,無(wú)法做到上一路段的終點(diǎn)ID等于下一路段的起點(diǎn)ID。
B方案:PostGreSQL數(shù)據(jù)庫(kù)里面,有一個(gè)交Pgrouting的內(nèi)置處理命令可以對(duì)路網(wǎng)數(shù)據(jù)自動(dòng)構(gòu)建拓?fù)?#xff0c;具體命令如下所示:
select pgr_createTopology('wgs84testsegments',0.001, 'geom', 'gid');但是,我嘗試過(guò)了用這個(gè)命令生成的拓?fù)浣Y(jié)構(gòu),em…反正我單從表面邏輯上沒(méi)看出來(lái)有什么道路的連通性。
C方案:由于之前我不知道有“相交”這個(gè)功能,我得到arc弧段文件后,使用python對(duì)文件進(jìn)行處理。因?yàn)閍rc弧段文件和原路網(wǎng)文件實(shí)際上是一樣的,只是記錄的屬性表不一樣(即使是一樣的,但是每個(gè)點(diǎn)的經(jīng)緯度還是不一樣,因?yàn)橐唧w到小數(shù)點(diǎn)后7位之后,只是肉眼看不出來(lái),以為是一樣的)。我把a(bǔ)rc弧段的起點(diǎn)和終點(diǎn)的經(jīng)緯度提取出來(lái),和原路網(wǎng)文件的起點(diǎn)、終點(diǎn)的經(jīng)緯度進(jìn)行比較,如果一樣,就把a(bǔ)rc弧段文件的拓?fù)鋵傩詠G給原文件。這時(shí)候我發(fā)現(xiàn),即使在ArcMap里面看起來(lái)一樣的點(diǎn),實(shí)際上小數(shù)點(diǎn)后7位之后的數(shù)字還是不一樣。無(wú)果,放棄。
D方案:就是本文的方案,完美解決。
打完收工~
總結(jié)
以上是生活随笔為你收集整理的路网自动构建路段拓扑的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 路在脚下,梦已启程
- 下一篇: coreldraw x4怎么会蓝屏_精简