2020FME博客大赛——基于FME的海量数据点高效率抽稀技术及实现
作者:楊忠智
單位:深圳市城市規(guī)劃決策與仿真重點(diǎn)實(shí)驗(yàn)室
?
摘要:POI(興趣點(diǎn))是電子地圖的重要組成部分,而海量密集的興趣點(diǎn)顯示,則常常需要先進(jìn)行抽稀處理,怎樣使其分布均勻合理,并要顧及其要素特征(如優(yōu)先級(jí))值得深入研究。本文借鑒了ArcGIS的SubPoints的實(shí)現(xiàn)思路,并對(duì)算法進(jìn)行了優(yōu)化,實(shí)現(xiàn)了FME版的SubPoints功能,運(yùn)行效率上得到了很大的提升。同時(shí),在此基礎(chǔ)上,還實(shí)現(xiàn)了另外5種抽稀方法,分別為簡(jiǎn)單法、SQL查詢法、點(diǎn)云法,格網(wǎng)中心法和聚合重心法。本文研究,不但彌補(bǔ)了FME缺乏有效的點(diǎn)抽稀方法的不足,還支持在不同比例尺下進(jìn)行抽稀,為多比例尺海量數(shù)據(jù)點(diǎn)的抽稀工作帶來(lái)了便利。
1. 引言
SubPoints工具是ESRI中國(guó)自主開發(fā)的一個(gè)插件,該工具優(yōu)先考慮點(diǎn)在空間分布上的均勻合理性,并結(jié)合點(diǎn)數(shù)據(jù)中包含的“優(yōu)先級(jí)”屬性進(jìn)行篩選。其中優(yōu)先級(jí)用來(lái)設(shè)置數(shù)據(jù)的重要性,在抽稀過(guò)程中綜合考慮數(shù)據(jù)的優(yōu)先級(jí)別。通過(guò)獲取每個(gè)點(diǎn)在一定范圍內(nèi)擁有的相鄰點(diǎn)的數(shù)目信息,得到地圖中點(diǎn)密度的分布狀況。抽稀時(shí)在若干相臨近的點(diǎn)中首先比較優(yōu)先級(jí),保留優(yōu)先級(jí)高的;優(yōu)先級(jí)相同時(shí)比較name字段,保留name長(zhǎng)度短的;兩者都相同時(shí)隨機(jī)選擇。
前段時(shí)間,在使用SubPoints工具處理數(shù)據(jù)時(shí),體驗(yàn)上不是很便利。主要有3點(diǎn):
1)數(shù)據(jù)的處理過(guò)程稍微繁雜,需要分三步走。一是需要進(jìn)行點(diǎn)距離分析(即生成鄰近點(diǎn)的OD矩陣),二是進(jìn)行實(shí)際的SubPoints的抽稀標(biāo)記計(jì)算,最后再把標(biāo)記狀態(tài)(status)大于-99的點(diǎn)提取出來(lái)。本來(lái)想使用ModelBuilder把這三步整合起來(lái),卻并不能正常運(yùn)行(無(wú)報(bào)錯(cuò),也無(wú)結(jié)果),最后放棄掉。
2)處理效率一般。2W的數(shù)據(jù)點(diǎn),也需要處理個(gè)三分鐘作業(yè)的樣子,數(shù)據(jù)量大時(shí)會(huì)有假死情況。
3)缺乏靈活性。必須要包含“優(yōu)先級(jí)”和“name”兩個(gè)字段,如果沒(méi)有這兩個(gè)字段,則要先定義好(即使為空)。
基于以上種種原因,就冒出了想要使用FME實(shí)現(xiàn)類似功能的想法。
2. 總體流程
本文借鑒了SubPoints的思路,進(jìn)行了一定程度的優(yōu)化處理,實(shí)現(xiàn)了FME版的SubPoints功能,并且運(yùn)行效率也遠(yuǎn)遠(yuǎn)高于ArcGIS。
同時(shí),在此基礎(chǔ)上,還實(shí)現(xiàn)了另外5種抽稀方法,分別為簡(jiǎn)單法、SQL查詢法、點(diǎn)云法、格網(wǎng)中心法和聚合重心法。
最后,把以上6種方法進(jìn)行了整合,定制了一個(gè)自定義轉(zhuǎn)換器(PointsThinner),并且把“優(yōu)先級(jí)”和“name”改為可選輸入,靈活性更好一些。
本文點(diǎn)抽稀自定義轉(zhuǎn)換器的實(shí)現(xiàn)流程和參數(shù)設(shè)置分別為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖1 總體流程圖
圖中虛線用于對(duì)跨線進(jìn)行區(qū)分。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2 參數(shù)設(shè)置
轉(zhuǎn)換器的參數(shù)共有4個(gè),說(shuō)明如下:
1)Mode:為抽稀模式,分別對(duì)應(yīng)SubPoints工具法、簡(jiǎn)單法(Simple)、SQL查詢法、點(diǎn)云法(Cloud)、格網(wǎng)中心法(Grid)和聚合重心法(Aggregation)。
2)Resolution(Cell Size):必選,指分辨率或者網(wǎng)格大小,也可以理解為搜索直徑(即2*Radius),單位與地圖單位一致。這里設(shè)置為分辨率,而不是搜索半徑,主要是考慮到NeighborhoodAggregator只能接收用戶參數(shù),而不能使用算術(shù)編輯器的情況。下文中提到的內(nèi)切圓半徑和外接圓半徑都與此有關(guān)。
3)Priority:優(yōu)先級(jí),可選,范圍在[0,999999],數(shù)值越低優(yōu)先級(jí)越高。
4)Name:名稱字段,可選,用字符長(zhǎng)度來(lái)計(jì)算優(yōu)先級(jí),字符長(zhǎng)度越短,優(yōu)先級(jí)越高。
注:以防屬性沖突,轉(zhuǎn)換器里的所有內(nèi)置變量(屬性)均為大寫,且以THINNER_作為前綴。
3. 模型分解
3.1 初始化
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖3 初始化流程
初始化主要是先計(jì)算點(diǎn)的優(yōu)先等級(jí)(THINNER_PRIORITY),再根據(jù)選擇的抽稀方法分配流程。
這里提前使用了StringLengthCalculator轉(zhuǎn)換器來(lái)計(jì)算Name字段的字符長(zhǎng)度,是由于AttributeManager里的Length方法計(jì)算的則是字節(jié)長(zhǎng)度(一個(gè)中文字符等于兩字節(jié))。具體選用哪一種,結(jié)果上可能會(huì)有些差異。:
AttributeManager的主要工作是計(jì)算點(diǎn)的優(yōu)先等級(jí):Priority * 10000 + Length(Name)。先把Priority放大10000倍,是為了避免Name字段長(zhǎng)度的影響。這樣,后面運(yùn)算只需要進(jìn)行一次排序即可,而不需要先進(jìn)行Priority排序再進(jìn)行Name字段長(zhǎng)度排序,以提高運(yùn)行效率。
TestFilter根據(jù)抽稀方法選擇流程。其中簡(jiǎn)單法和SQL查詢法的輸出端口增加了THINNER_NO屬性,是用于計(jì)算其所在網(wǎng)格編號(hào)。
3.2 SubPoints法
借鑒ArcGIS里SubPoints抽稀的思路,對(duì)代碼進(jìn)行了優(yōu)化改善。
先用NeighborFinder計(jì)算點(diǎn)的鄰近距離表(OD矩陣),搜索距離取內(nèi)切圓半徑,即分辨率的一半。
由于提前計(jì)算了優(yōu)先等級(jí)(THINNER_PRIORITY),把Priority和Name兩個(gè)字段整合到一起了,SubPoints的處理代碼也少了一些判斷,相對(duì)比較簡(jiǎn)單。
雖然運(yùn)行效率上相比于ArcGIS的SubPoints工具有了很大的提升,但是,當(dāng)數(shù)據(jù)量越來(lái)越大,尤其是數(shù)據(jù)點(diǎn)密集程度越來(lái)越高時(shí),其所構(gòu)建鄰近距離表所需的空間和運(yùn)行時(shí)間也將成倍的增加。因此,為了解決這個(gè)問(wèn)題,也就有了后面的幾種抽稀方法。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖4 SubPoints法流程
3.3 簡(jiǎn)單法
顧名思義,簡(jiǎn)單粗暴,是在WebGIS和數(shù)據(jù)庫(kù)中較為常用的一種方法,效率很高。其核心思想是先計(jì)算數(shù)據(jù)點(diǎn)所在的網(wǎng)格編號(hào)(THINNER_NO),格子大小為分辨率參數(shù)(Cell Size),然后再取落在同一個(gè)格子中的第一個(gè)元素。另外,還可根據(jù)優(yōu)先等級(jí)對(duì)落在格子里的點(diǎn)進(jìn)行排序。
網(wǎng)格編號(hào)計(jì)算方法是,分別以點(diǎn)的X、Y坐標(biāo)除以Size,再取整,最后拼接起來(lái)即可。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖5 簡(jiǎn)單法流程
3.4 SQL查詢法
SQL查詢法思路跟簡(jiǎn)單法類似,只不過(guò)是使用了InlineQuerier進(jìn)行SQL(具體的SQL語(yǔ)法會(huì)跟數(shù)據(jù)庫(kù)里的有些出入)的方式來(lái)實(shí)現(xiàn)。但由于其排序邏輯跟Sorter有些差異,輸出結(jié)果也可能會(huì)不一樣。
其網(wǎng)格編號(hào)計(jì)算方法同簡(jiǎn)單法。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖6 SQL查詢代碼
3.5 點(diǎn)云法
點(diǎn)云法的核心思想跟簡(jiǎn)單法一樣,只不過(guò)是使用了點(diǎn)云的方式來(lái)實(shí)現(xiàn),輸出結(jié)果也是跟簡(jiǎn)單法一模一樣,使用了較多的轉(zhuǎn)換器,但執(zhí)行效率反而是提高了。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖7 點(diǎn)云法流程
1)先把數(shù)據(jù)點(diǎn)合成點(diǎn)云,THINNER_ID和THINNER_PRIORITY作為點(diǎn)云的組成部分。
2)根據(jù)給定分辨率,重新計(jì)算各點(diǎn)的x,y值,即把x,y轉(zhuǎn)換為其所在的網(wǎng)格行列號(hào)。
3)按優(yōu)先等級(jí)(THINNER_PRIORITY)排序后去重,再根據(jù)THINNER_ID與源數(shù)據(jù)進(jìn)行屬性掛接。
3.6 格網(wǎng)中心法與聚合重心法
格網(wǎng)中心法是先根據(jù)分辨率大小生成一系列大小相同的網(wǎng)格,再找到離網(wǎng)格中心最近且優(yōu)先等級(jí)最高的一個(gè)點(diǎn)。
聚合中心法則是先根據(jù)分辨率大小來(lái)生成一系列的聚合塊,再找到離聚合重心最近且優(yōu)先等級(jí)最高的一個(gè)點(diǎn)。
兩種方法大同小異,效率相差不太大。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖8 格網(wǎng)中心法和聚合重心法流程
這里的NeighborFinder的搜索距離取外接圓半徑。
兩種方法在進(jìn)行鄰近分析前,都要先對(duì)優(yōu)先等級(jí)進(jìn)行降序排序,這是因?yàn)镹eighborFinder會(huì)把其搜索范圍內(nèi)找到的最后的一個(gè)最近點(diǎn)作為最終輸出。
值得注意的是,需要用VertexCreator把網(wǎng)格中心或聚合重心替換為真實(shí)的數(shù)據(jù)點(diǎn)坐標(biāo)。另外,可能還會(huì)存在點(diǎn)的THINNER_ID重復(fù)的情況,可用DuplicateFilter按THINNER_ID去重。
3.7 二次過(guò)濾
除SubPoints法外,其他5種抽稀方法都可能存在部分點(diǎn)離的較近的情況(小于搜索距離),因此還需要進(jìn)行二次過(guò)濾,以排除那些在搜索距離以內(nèi)的點(diǎn),即都要經(jīng)過(guò)SubPoints法進(jìn)行二次過(guò)濾再輸出。
當(dāng)然,簡(jiǎn)單一點(diǎn)的話,可以直接用NeighborFinder進(jìn)行過(guò)濾,搜索距離取內(nèi)切圓半徑。
4. 結(jié)果分析
本文抽取了深圳和香港兩地的POI數(shù)據(jù)進(jìn)行測(cè)試,為國(guó)家2000投影坐標(biāo)系(這里取EPSG:4547),分辨率取1000米,即搜索半徑為500米。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 表1 ?抽稀方法運(yùn)行時(shí)間對(duì)比????????????? 單位:秒(s)
運(yùn)行效率上,點(diǎn)云法最快,格網(wǎng)中心法和聚合重心法次之,簡(jiǎn)單法比SQL查詢法稍快(當(dāng)然,簡(jiǎn)單法在數(shù)據(jù)庫(kù)查詢里應(yīng)該是最快的),SubPoints法最慢。但無(wú)論是哪種方法,都要比在ArcGIS里的SubPoints工具法要快得多。
注:帶“——”的地方是由于運(yùn)行時(shí)間太長(zhǎng),沒(méi)有進(jìn)行統(tǒng)計(jì)。如ArcGIS的SubPoints工具在生成10萬(wàn)條數(shù)據(jù)點(diǎn)的鄰近距離表時(shí),就花了6分多鐘,而FME里的SubPoints法在處理40萬(wàn)數(shù)據(jù)點(diǎn)時(shí),也超過(guò)了10分鐘,就沒(méi)有再進(jìn)行下去。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?表2 ?抽稀方法抽稀后保留點(diǎn)數(shù)對(duì)比?????????? 單位:個(gè)
運(yùn)行結(jié)果上,SubPoints法保留的點(diǎn)數(shù)最多,也相對(duì)均勻。簡(jiǎn)單法和點(diǎn)云法結(jié)果一樣,保留的點(diǎn)數(shù)也最少,而SQL查詢法由于排序邏輯不一樣,結(jié)果與簡(jiǎn)單法和點(diǎn)云法有些出入但也相差不大,這三種方法抽稀后的點(diǎn)也比較均勻,但隨機(jī)性會(huì)比SubPoints高一些。網(wǎng)格中心法和聚合重心法保留的點(diǎn)更趨向于呈網(wǎng)格化分布。格網(wǎng)中心法剩余點(diǎn)數(shù)接近SubPoints法。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖9 數(shù)據(jù)點(diǎn)抽稀處理后分布情況
以下是2萬(wàn)數(shù)據(jù)點(diǎn)抽稀后的點(diǎn)距離分布直方圖,可以看出大部分點(diǎn)的距離都集中在500~1000之間,符合抽稀預(yù)期。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖10 抽稀處理后點(diǎn)距離分布直方圖
5. 結(jié)語(yǔ)
本文借鑒了ArcGIS的SubPoints工具的點(diǎn)抽稀思路,進(jìn)行優(yōu)化和拓展,實(shí)現(xiàn)了多種基于FME的海里數(shù)據(jù)點(diǎn)抽稀技術(shù)。運(yùn)行效率上,相比于ArcGIS的SubPoints工具得到了極大的提升,同時(shí)還彌補(bǔ)了FME缺乏有效的海量點(diǎn)抽稀方法的不足,也為多比例尺海量數(shù)據(jù)點(diǎn)的抽稀工作帶來(lái)了便利。本文中的每種抽稀方法都有其特點(diǎn),實(shí)現(xiàn)思路也不一樣,在運(yùn)行效率上和輸出結(jié)果上也有差異,但都顧及了數(shù)據(jù)點(diǎn)的要素特征(優(yōu)先等級(jí))。具體使用哪種方法,可根據(jù)實(shí)際的應(yīng)用場(chǎng)景和需要進(jìn)行選擇。多比例下電子地圖數(shù)據(jù)點(diǎn)抽稀,只需要設(shè)定不同比例尺下的對(duì)應(yīng)的分辨率(搜索半徑的2倍)即可。后面將再做一個(gè)直接支持多比例尺抽稀的轉(zhuǎn)換器。
當(dāng)然,本文模型還有優(yōu)化空間,這就留待后面再繼續(xù)深挖了。
最后,感謝FME帶來(lái)的工作便利!
參考資料
1) 侯輝嬌子, 林旭芳, 趙海強(qiáng). 電子地圖中POI數(shù)據(jù)抽稀方法研究[J]. 北京測(cè)繪, 2017(S1):236-239.
2) 王屏, 宋昊, 劉淑紅. 基于點(diǎn)距離的點(diǎn)抽稀算法在電子地圖符號(hào)化中的應(yīng)用[J]. 科技與企業(yè), ?2014(17):311-311.
3) OneMap. 常用點(diǎn)抽稀方法之三——SubPoints點(diǎn)抽稀[EB/OL]. http://blog.sina.com.cn/s/blog_ba3ace5f0101i8cb.html, 2013-02-25
?
總結(jié)
以上是生活随笔為你收集整理的2020FME博客大赛——基于FME的海量数据点高效率抽稀技术及实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 简单的SQL注入学习
- 下一篇: Qt中查看ui_xxx.h文件方法