三调地类代码_FME实现三调地类变化流量表制作
今年的三調進行的如火如荼,三調的成果數據做完了之后,相信今后很大的工作就是要想辦法將三調的成果數據更好的利用起來。而為了更直觀的了解到相較于二調,三調的地類變化情況,三調地類變化流量表的制作就很有必要了。近期我就遇到了這么一個需求。
其實地類流量表的制作并不是很復雜的事情,很多方法都能做,我了解到的方法就有,先在arcgis里面做相交,統計出Excel的各個地類的面積,然后再在Excel里面或者通過VB寫的小程序對統計好的Excel進行加工填寫到標準的模板表里。而這樣的辦法有一個缺陷就是需要分幾步走,可能會用到好幾種軟件。那么能不能把所有的步驟都融合到一個軟件里面,實現“一步到位”的方法呢?答案當然有,而且可能還有很多,而我作為一個FME的技術支持人員,當然思考的就是如何通過FME來實現這個步驟了。
其實整個的流程很簡單,就是三調二調的地類圖斑,先相交,然后統計相交后的面積,然后再想辦法寫入到標準的Excel表里面。大致的流程如下:
流程很簡單,其實相對困難一點的就是如何想辦法將統計得到的數值填入到標準的模板表里面,標準模板表長這樣:
大致的填寫要求是這樣的:
實現步驟
壓蓋分析
其實這一步要做的就是要用二調的地類圖斑來切割三調的地類圖斑,并且對分割后的小圖斑不僅要有三調的地類名稱還得有二調的地類名稱。說到這個功能,在FME里面第一時間想到的就是AreaOnAreaOverlayer這個轉換器。于是我進行了測試,為了加快速度,用了64位的FME,由于源數據的兩個mdb,事先還先將mdb轉換成了gdb,模板是這樣的:
過了幾分鐘我的電腦變成了這樣的:
電腦資源實在是有限,然后進入了漫長的等待...
1個小時過去了...
2個小時過去了...
3個小時過去了...
在等待的過程中在arcgis里面嘗試了一下,標識工具:
測試了之后發現,只需要不到20分鐘就能把標識做完,標識后的三調圖斑都帶了二調地類名稱的屬性。于是果斷放棄了AreaOnAreaOverlayer這個轉換器。正好最近學了一點Python的皮毛,決定在FME里面用PythonCaller來調用arcgis的標識工具,調用的方法很簡單,arcgis工具箱打開幫助,查看示例代碼即可:
這樣的話我就只需要在某個路徑下生成標識后的shp數據,然后再用FeatureReader轉換器去讀取這個shp數據進行面積統計即可。實現過程如下:
由于傳給標識模塊的參數的輸出路徑必須是存在的路徑,所以代碼里用了os模塊去檢查路徑是否存在,如果存在刪除掉原有的數據,如果不存在新建一個文件夾。
PS:由于我對Python只是懂點皮毛,在調用arcpy的時候經常遇到傳參不對的問題,往往都不知道該如何去找錯,后來發現一個很好的辦法就是在代碼里面把所有要傳的參數都print出來,這樣一目了然。
統計圖斑面積
標識做完了之后,現在要做的就是統計各地類的面積,在FME中AreaCalculator轉換器進行面積計算,StatisticsCalculator轉換器進行統計。原始的二調的各個地類的面積直接讀取二調的mdb進行統計,變化后的面積統計用FeatureReader讀取上一步生成的shp文件然后再用AreaCalculator轉換器進行面積計算,StatisticsCalculator轉換器進行統計。統計二調原始的地類面積:
變化后的三調地類面積統計:
二調的地類面積統計后的結果是這樣的:
其中DLMC為地類名稱字段,_sum字段為該地類對應的面積。變化后的三調圖斑統計后的成果為:
其中DLMC為二調的地類名稱,DLMC_1為變化后對應的三調地類名稱,_sum為對應的面積。
統計的結果得到了,但是現在面臨一個問題,在Excel的表格當中,橫向為二調的地類名稱,豎向為三調的地類名稱,那么對于得到的統計信息,我們需要按照表的形式,以二調的地類名稱作為字段名稱,對應的面積作為值。相當于要將DLMC字段的值生成新的字段名稱,FME里面沒有可以直接實現的轉換器,這個時候又可以用上Python了,把DLMC的值和對應的面積_sum組成一個列表list[],循環去讀取list的值生成字段和對應的值,如list[0]為字段名稱,list[1]則為該字段對應的值,實現步驟如下:
Pyhoncaller轉換器出來的結果如下:
問題又來了,Pyhoncaller生成的屬性如果沒有在轉換器里面設置暴露,那么久并不會出現在屬性列表里面,如何批量的暴露字段又成了一個問題,手動一個一個寫顯得太不智能,于是又想到了一個辦法,將模板表讀取進來,并且以第10行開始為屬性字段名稱,讀取后的效果如下:
取一條模板的要素和PythonCaller出來的要素進行合并,由于模板的要素有屬性表,PythonCaller出來的要素合并后則自動暴露出了相應的屬性字段。同樣的變化后三調的地類面積也用這樣的方式進行,但是可通過xlsx_row_id進行決定填到第幾行,而xlsx_row_id可通過讀取模板數據的B列與DLMC_1做掛接。所有的數據合并后可用NullAttributeMapper轉換器對缺失的字段值進行填0處理。整個的處理步驟如下:
得到的結果如下:
寫出數據到Excel模板表
再次查看模板表,發現里面有很多合計的單元格,為了方便起見,直接在模板表里先對合計的單元格填好公式,待其他單元格填入值后合計的值就會自動出現:
通過寫模塊或者FeatureWriter轉換器進行Excel的寫出,需要設置的參數有模板文件,以及寫入的模式,和開始寫的其實行列:
整個模板做完后是這樣的:
得到的成果:
總結
通過FME實現了一鍵式的自動的三調地類流量表制作。其實我也是第一次寫出這樣的Excel表格,在最終填寫的方式的時候糾結了一兩天,一直沒有找到合適的辦法,直到想到了Python。FME并不是萬能的,它是數據處理很好的工具,我們不能要求FME能處理任何的數據問題,但是FME有一個很好的點就是它可以通過一些轉換器和其他的方法結合起來,比如將FME和Python結合起來,將FME和CAD結合起來通過lisp語句實現一些cad的操作等等。總之,只要你有想法,就能去實現。
總結
以上是生活随笔為你收集整理的三调地类代码_FME实现三调地类变化流量表制作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 男人女人那些事……
- 下一篇: arm 架构_Arm架构之Arm内核解析