行政编码json_基于FME国内县级及以上网络公开行政区划边界的获取
基于FME國內縣級及以上網絡公開行政區劃邊界的獲取
在上一篇記錄《基于FME零編碼獲取新冠病毒(COVID-2019)患者曾逗留小區(場所)數據及可視化》中,給自己挖了個坑,這篇記錄就是為了填坑,同時也可以使上一篇中的模板無需輸入外源文件達到一鍵下載的功能。
百度收集的確診病患曾逗留小區(場所)的獲取需要使用國內地市一級的行政區邊界文件,這篇記錄就分享下國內兩個縣級以上行政區接口的獲取方法:高德API接口和地圖選擇器(阿里云上的一個接口)(個人試過天地圖的接口,數據縮放級別為11級,在實際工作中用處不大)。
一、地圖選擇器
(一)數據接口介紹。地圖選擇器的網頁為(http://datav.aliyun.com/tools/atlas/#&lat=33.521903996156105&lng=104.29849999999999&zoom=4),這個接口是“麻辣GIS”公眾號一篇推文中看到的。這個接口非常友好,可以查詢全國縣級以上的行政區劃,可以同時查詢兩級的行政區劃,并提供三種文件下載格式(geojson、svg和excel),見圖1。
圖1 地圖選擇器接口頁面
(二)數據可能來源與坐標系。該接口可以獲取2889個縣級行政數據(見圖2)與高德接口的數據數量一致,因此猜測數據可能來源于高德。
圖2 接口獲取的縣級行政區數據與高德矢量圖疊加效果
將獲取的數據疊加到高德矢量(GCJ02坐標)上,兩者能完美的疊加(見圖3),而與天地圖(CGCS2000坐標)進行疊加會產生偏移(見圖4),因此猜測坐標系應為GCJ02坐標(加密的WGS84)。在實際使用前需進行糾偏處理。
圖3 與高德矢量地圖疊加效果(局部放大)
圖4 與天地圖矢量地圖疊加效果(局部放大)
(三)數據質量。對比國家統計局網站上(http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2019/index.html)獲取的截止2019年10月的全國縣級行政區數量(3000個,不含臺港澳)少了111個,接口數據包含港臺地區的數據,因此,差異的數量應該更大,這可能是統計的行政代碼包含很多工業園區和經濟開發區,而這些又不是傳統行政區劃的地域范圍;通過數據對比兩者有2780個數據的行政區劃代碼是一致的??傮w數據質量較好,不影響本次使用。
(四)數據獲取思路。
1.數據接口形式。這個接口提供了兩個數據接口,一個是指能下載查詢范圍級別的行政區劃邊界(如,https://geo.datav.aliyun.com/areas/bound/100000.json,可還回中國行政區劃邊界),另一個接口則包含下一級(子區域)的行政區劃邊界(如,https://geo.datav.aliyun.com/areas/bound/100000_full.json,可還回查詢中國行政區劃邊界及各省一級的行政邊界),顯然第二個接口是我們需要的。接口只需要一個參數即行政區劃代碼,見圖5。
圖5 數據接口參數
2.數據內容分析。圖6是調用第二個(https://geo.datav.aliyun.com/areas/bound/100000_full.json)獲得的數據,數據內容處理地理坐標范圍("geometry"),還有行政區劃代碼、名稱、中心坐標、行政區級別等數據,數據中含有用于進一步數據獲取的參數:行政區劃代碼,也就是說只要給個起始入口就可以獲取全量數據了。
圖6 接口提供的數據內容
3.FME建模思路。1、以查詢中國行政區劃(含子域)獲取,中國行政區劃范圍及各省級的行政區劃范圍及相關信息;2、以省級行政區劃代碼為參數獲取市級行政區劃;3以市級行政區劃代碼為參數獲取縣級行政區劃(本記錄不介紹)。流程很簡單(見圖7),但還是有需要注意的,在FME流程介紹時再說明。
圖7 地圖選擇器全量數據獲取流程
(五)模板分步驟介紹。
1、省級行政區的獲取及行政區代碼提取
這一共用到五個轉轉換器(其中3個為輔助使用),第一個“Creator”創建流程的起點,第二個“HTTPCaller”用于獲取行政區geojson數據,第四個“AttributeManager”提取的省級行政區的“name”與“adcode”重命名(也可用“BulkAttributeRenamer”代替,FME做同樣工作有太多的選擇了,就看個人習慣)并刪除無用的屬性。接下來介紹其余兩個轉換器,“JSONFragmenter”轉換器這次的參數設置與解析“json”數據不同,(接下來的表述基于個人理解的非專業術語描述,如有錯誤請斧正)如圖8所示,“Fragmet as Format”有三個選項“JSON” “GEOJSON”和“ESRIJSON”,這次選用“GEOJSON”,按照json格式的要在“Attribute to Expose”選項中直接暴露出“adcode”“name”等字段,“JSON Query”應填入“json["features"][*]["properties"]”,但這樣設置轉換器將無法輸出正確的結果,這是因為由于存儲空間信息的經緯度數據集的“geometry”與存儲屬性信息的“properties”屬于同一層級(同一父集),選擇“GEOJSON”轉換器無法將數據識別為地理數據,就的不到正確的結果。那“JSON Query”和“Attribute to Expose”需如何設置呢?一種是按照圖2所示的手動設置“JSON Query”設置成“json["features"][*]”這可以保證存儲地理數據的“geometry”的完整性,手動將需要的屬性暴露出來;第二種就更簡單,將第一種設置中的“JSON Query”改為“json”,其余的不變。這樣省級行政區已經提取完成了,可以保存輸出,圖9。
圖8 “JSONFragmenter”的第一種設置
圖9 省級行政區提取結果
圖10 市級行政區提取結果
現在接著介紹“Tester”轉換器,這個轉換器主要是為市級行政區的提取做準備。這就需要簡單介紹下我國的省市級行政區劃體系,我國各個省一般下轄地市、地市下轄區縣,但直轄市港澳臺下轄為區縣級行政區(同時還有部分省級行政區設有省管縣,如湖北省的潛江市,但這一部分不影響地市數據的提取工作),直轄市可以理解為有國家直管的地級市(這些都純粹個人基于行政區空間范圍上的理解,肯定有不正確的地方)。因此需要將直轄市港澳臺單獨過濾出來,否者這提取地市行政區就可能出錯?!癟ester”參數設置見圖11,說了這么多其實這個轉換器可以不要的!
圖11 “Tester”參數設置參考
2、市級行政區的獲取及參數提取
這步共需要用到4個轉換器(不含寫文件轉換器),“HTTPCaller”“JSONFragmenter”與省級行政區提取流程的設置相同,就不再介紹。接在“JSONFragmenter”后面的“Tester”是將省級行政區與市級行政區進行分離【這是由于用省級行政代碼進行含子區域查詢,將獲得兩級的行政區邊界,詳見一(一)】,第一個“Tester”設置見圖12。
圖12 第一個“Tester”參數設置
第二個“Tester”的作用是將第一個“Tester”分離出的省級行政區中將直轄市和十段線(九段線)與其他省級行政區劃進行分離,參數設置見圖13。接著將兩個“Tester”的“Passed”輸出端口與寫文件轉換器連接到(為了模板整潔增加了個“Connection Junction”轉化器)文件寫模塊,文件格式選擇“EsriShapefile”,坐標系統選擇“LL-WGS84”,其余參數就不再介紹,市級行政區劃結果見圖14。縣級行政區的下載跟市級行政區相似就不再展開。
圖13 第二個“Tester”參數設置
圖14 市級行政區劃數據
二、高德行政區域查詢API
(一)數據接口介紹。高德行政區查詢接口(API文檔:https://lbs.amap.com/api/webservice/guide/api/district)https://restapi.amap.com/v3/config/district?keywords=北京&subdistrict=2&key=<用戶的key>&extensions=all&output=JSON,共需要4個以上的參數,有兩個是必填的:
Key:用戶在高德地圖官網申請Web服務API類型KEY,這是必填的,否則無法使用。
keywords:這也是必填項,只支持單個關鍵詞詞搜索關鍵詞支持,行政區名稱、citycode、adcode,由于只支持單個關鍵詞因此無法進行批量獲取(使用一次key只能獲取一個行政區的邊界)。
subdistrict:設置顯示下級行政區級數(行政區級別包括:國家、省/直轄市、市、區/縣、鄉鎮/街道多級數據);0,不返回下級行政區;1,返回下一級行政區;2,返回下兩級行政區;3,返回下三級行政區。這次要查詢的是市一級行政區劃,因此本記錄中默認為2。(需要在此特殊說明,目前部分城市和省直轄縣因為沒有區縣的概念,故在市級下方直接顯示街道。例如:廣東-東莞、海南-文昌市)
extensions:此項控制行政區信息中返回行政區邊界坐標點;可選值:base、all;base:不返回行政區邊界坐標點;all:只返回當前查詢district的邊界值,不返回子節點的邊界值;目前不能返回鄉鎮/街道級別的邊界值。由于需要獲取行政邊界,因此填“all”,同時要注意的是下一級的數據(子級行政區)不還回行政邊界。
接口的參數介紹見圖15,還回數據結構見圖16。
圖15 接口的參數介紹
圖16 還回數據結構
(二)獲取思路。1、由于這次需要獲取到市一級的行政邊界數據,因此以中國(100000)作為關鍵詞(keyword),子級行政區(subdistrict)設置為2,即可以獲取所有市級行政區的名稱;2以市級行政區名稱/adcode為關鍵詞獲取行政邊界的json數據;3對json數據進行解析,構建行政邊界并保存。
(三)FME模板流程分布介紹。模板流程圖見圖17,內建的自定義轉換器流程見圖18。
圖17 高德省市縣行政區邊界接鄉鎮點獲取流程圖
圖18 模板內建自定義轉換器流程圖
1、起始url的構建與屬性數據解析。根據上面介紹這里構建了國界url,“keyword=中國”(也可以為:keyword=100000)“subdistrict=3”(這可以一次性解析到縣一級的屬性參數)。這一共用到四個轉換器,一是“Creator”創建流程的起點;二是將“中國”兩個漢字轉碼成URL(Percent Encoding)編碼,防止出錯(用100000和拼音就無需轉碼);三是“HTTPCaller”獲取json數據,url見圖19;四是“JSONFragmenter”將各級行政區屬性值及國界數據進行暴露,參數設置見圖20。
圖19 url參數示意圖
圖20 “JSONFragmenter”參數設置
2、各級行政區屬性的暴露。將省市縣三級行政區的屬性暴露出來用了三個“ListExploder”,圖20中可見各級行政區的屬性都保存在“districts”中并且屬性名都是一樣的,因此在屬性暴露參數不能采用默認,否則最后一次暴露出的屬性會代替將前一次暴露出來的屬性?!癓istExploder”進行省級屬性暴露設置見圖21,“Accumulation Mode”選擇“Prefix List Attributes”(列表屬性添加前綴),“Prefix”填“P_”(province的縮寫),這樣暴露出來的屬性名就會全部添加了“P_”(相當于“BulkAttributeRenamer”添加前綴的功能);其他兩個“ListExploder”也進行相似的設置。
圖21 “ListExploder”進行省級屬性暴露設置時的參數設置
其他需要注意的是,市級屬性暴露時由于臺灣省高德沒有下一級的行政區邊界,會從“Rejected”端口輸出,而導致轉換失敗,這只需之后面增加任意一個轉換器,或是在“Workspace Paraters”中將的“Rejected FeatureHandling”改為“Continue Translation”,見圖22;縣級行政區屬性暴露時“Rejected”端輸出的數據也是縣級行政區,“Elements”端輸出的數據由縣級行政區數據也有街道數據(為下設縣的市、省管縣等)因此需要將兩者分開,這就用“Tester”設置見圖23。
圖22 “Workspace Paraters”參數設置
圖23 “Tester”參數設置
3、自定義轉換器流程介紹。自定義轉換器主要作用是將國界解析出的“polyline”構建成面,及將解析各級行政區的數據并構建成面。這個轉化器共設置了3個發布參數:一是“polyline”用于獲取國界的多邊形數據,二是“key”用于接收高德的key,三是“name”用于接收“keyword”(因此這個自定義轉換器是個完整功能的高德行政區下載器,可以直接導出使用;本文主要是為了一次性獲取國省市縣四級行政邊界及鄉鎮街的點位而寫的較為啰嗦)。
“ParameterFetcher”獲取自定義參數,“TextEncoder”將關鍵詞轉碼(保證輸入中文時,不會出錯),“HTTPCaller”的url參數將“subdistrict”設為“1”(這是為了獲取鄉鎮街級的點位數據,要是到處是自定義轉換器建議,這個參數也建個發布參數),“JSONFragmenter”的設置見圖24,解析出下級districts數據是主要是為了獲取鄉鎮街級的點數據。
圖24 “JSONFragmenter”參數設置
“當一個行政區范圍,由完全分隔兩塊或者多塊的地塊組成,每塊地的polyline坐標串以‘|’分隔”,構建行政區的第一步是將多個面拆分,然后將每個面的“polyline”坐標串拆分成坐標點(以‘;’進行分割),接著將坐標點的經緯度拆分成兩個獨立的屬性用于構建矢量點(以‘,’進行分割),最后將點按順序連接。
第一個“AttributeSplitter”對由多個地塊組成的行政區拆分(見圖25),接著用“ListExploder”將其暴露成多條數據,第二組“AttributeSplitter” “ListExploder”作用相似。
圖25 第一個“AttributeSplitter”屬性設置
“LineBuilder”構建面時的“ConnectionBreak Attributes”,選擇“adcode”及“_element_index2”(有多個地塊組成的行政區分割時產生的順序號),參數設置見圖26。
圖26 “LineBuilder”參數設置
這樣整個模板基本完成,這主界面點擊自定義轉換器“CTRL+D”拷貝多份,連接到各個“ListExploder”后面,并對參數進行設置就可以了;在獲取縣級行政區邊界的自定義轉換器后面連接“ListExploder”即可以獲取鄉鎮街道的點位數據了。如果在增加一個發布參數和幾個“TestFilter”就可以做到按需下載各級行政區邊界數據或鄉鎮街的點數據了,封裝成自定義轉換器的工作就不介紹。
這兩種獲取行政區的方法各有優缺點,第一種方法快速(geojson格式的優點)高效,但時效性無法保證;第二種方法時效性好,但好費時間,同時還得有高德的key。
總結
以上是生活随笔為你收集整理的行政编码json_基于FME国内县级及以上网络公开行政区划边界的获取的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云服务器都能用来做什么
- 下一篇: 如何通过vs2017的Dockerfil