摘要:綜合分析了一下統計局、民政部、高德地圖行政區域、騰訊地圖行政區劃,並且結合各大網站的城市選擇數據,如:淘寶、QQ、58這些有城市選擇的,發現統計局的數據主要問題出現在以下兩點:。最後(統計局+民政部)和(高德+騰訊的數據)的前三級數據進行交叉融合,得到的【省市區】 ≈ 【統計局的數據】 - 【160來個開發區、經濟區、高新區、國家級新區】 - 【撤銷城市】 + 【新設城市】 + 【港澳臺】。

以前採集的舊版省市區三級或四級城市數據總是覺得怪怪的,經過多方探討,終於下定決心進行了一次重大更新,發佈了這個重(chong)裝版。除了省市區鄉鎮數據外,座標和邊界範圍、還有拼音都是有的。

GitHub: https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov

在線預覽: 多級聯動測試和預覽、轉換成JSON

城市的座標和邊界範圍

座標邊界數據全部來自高德地圖接口( GCJ-02座標系 ),幾個地圖裏面質量算是最好的。保存爲csv格式,導入SQL Server也是很方便的,先睹爲快(大到不包郵:open_mouth:):

從一幅中國地圖裏面去看,那種大到不包郵地方可能看不出什麼太大的感覺;沒有對比就沒有傷害,單獨把最大的縣摳出來對比一下就有感覺了,:point_right:看左邊那一塊純色:grin:

這些座標和邊界數據使用js代碼採集的,得到的csv文件有130M+,壓縮成7z文件後有13M大小,採集速度很快,省市區三級數據大概3分鐘就採集完成了。目前GitHub庫裏面的省市區三級和高德地圖的城市蠻匹配,除了臺灣的城市沒有邊界外,其他城市均有匹配的數據。

採集源碼見此目錄: https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov/tree/master/2019/座標和邊界

另外貼一張圖片樂呵樂呵:

新版城市數據採集

原何重裝

  1. 以前只從統計局獲取數據,數據源過於單一,後來合併了民政部數據,還是感覺數據不太好使。
  2. 很多人提醒只用民政部的數據會比用統計局的更好;甚至有的會從很多數據源獲取城市數據,唯獨不要統計局的。
  3. 研究發現高德地圖行政區域、騰訊地圖行政區劃,這些地圖都有開放接口提供數據,並且數據開起了也不錯。
  4. 強迫症又要犯了。

技能要點

綜合分析了一下統計局、民政部、高德地圖行政區域、騰訊地圖行政區劃,並且結合各大網站的城市選擇數據,如:淘寶、QQ、58這些有城市選擇的,發現統計局的數據主要問題出現在以下兩點:

  1. 數據缺失,有些確實是沒有,有些是因爲數據沒有更新導致的滯後,只能靠自己去補全。
  2. 包含了大約160來個開發區、經濟區、高新區、國家級新區,這種區劃應該算專門的區域,一般由多個城市的區域組成,在區級內算是重複的區域,因此需要剔除,但剔除後這些區域下面的鎮級需要劃分到實際的歸屬城市下面,這就很困難了,因爲量太大了,一個個去查歸屬地幾乎不可能。

圍繞着這主要兩點,從多個數據源裏採集數據,然後上人工+智能(人工多些),問題才能夠解決。爲什麼要這麼麻煩?因爲沒有找到特別優秀的數據源,其他各大平臺、網站的數據在感官上顯得都不夠完美,綜合一下舒暢多了。

採集源碼見此目錄(其中1-3打頭的js文件): https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov/tree/master/2019

數據特性

  1. id編號和國家統計局的編號基本一致,方便以後更新,有很多網站接口數據中城市編號是和這個基本是一致的,包括民政部、騰訊地圖和高德地圖的城市數據這套編號都是大部分通用的。

  2. 東莞中山儋州 等不設區的直筒子市沒有第三級區級,自動添加同名的一級作爲區級,以保證整個數據結構的一致性,添加的城區編號以上級的ID結尾加兩個0作爲新ID,此結構ID兼容性還不錯,比如:東莞(4419)下級只有一個區 東莞(441900)。

  3. 省直轄縣級市(河南濟源、湖北潛江、海南五指山、新疆崑玉等)根據編號來看本來只能放到區級,但爲了便於用戶選擇,所有直轄市自動添加一個同名的市級,比如: 湖北-直轄市-仙桃-*鎮 調整後爲 湖北-仙桃-仙桃-*鎮 ,新添加數據的編號規則和第二條規則相同。

  4. 如果市、區沒有下級,自動添加同名的一個城鎮作爲下級,編號規則和上一條規則相同,以保證數據層次的一致性(任何一個數據都能滿足省市區鎮4級結構,沒有孤立的);比如: 福建-泉州-金門 沒有鎮,調整後爲 福建-泉州-金門-金門 ;另外從民政部等數據源中補全的新增城市也會缺失下級,照此規則自動補齊。

  5. 臺灣數據只有省市區三級沒有鎮級,因此鎮級通過前面幾條規則自動補齊;香港、澳門數據源有兩級,當做直筒子市來處理,比如把香港當做東莞,從面積和人口來看還算合理,因此港澳數據中省市區三級是完全相同的,第四級鎮級纔有城市數據,如:香港-香港-香港-灣仔區。

  6. 地區名字是直接去掉常見的後綴進行精簡的,如直接清除結尾的 市|區|縣|街道辦事處|XX族自治X ,數量較少並且移除會導致部分名字產生歧義的後綴並未精簡。

  7. 省市區前三級數據的合併:統計局採集過來的數據會先和民政部的數據交叉對比後進行合併;由於統計局的數據明顯的滯後,民政部內新添加的市、區將不會有鎮級(自動補齊同名鎮級);如果民政部數據存在明文撤銷的市、區,那麼合併的時候會刪除統計局對應的數據,如: 山東-萊蕪市 於2019-01撤銷,並在 濟南市 新加 萊蕪區鋼城區 ;如果統計局中的數據在民政部數據內不存在,將原樣保留。高德地圖行政區域會和騰訊地圖行政區劃數據進行交叉對比,然後擇優選取需要的數據。最後(統計局+民政部)和(高德+騰訊的數據)的前三級數據進行交叉融合,得到的【省市區】 ≈ 【統計局的數據】 - 【160來個開發區、經濟區、高新區、國家級新區】 - 【撤銷城市】 + 【新設城市】 + 【港澳臺】。

  8. 第四級鎮級主要採用騰訊地圖行政區劃數據,綜合高德和統計局的數據,和統計局的數據差異在3000個左右,佔比7.5%(3000/40000),得到的【鎮級】 ≈ 【騰訊地圖行政區劃數據】。

數據應用和更新

綜合應用

庫裏面提供了一個在線測試的頁面,提供3級或4級數據的多級選擇測試,並且提供數據格式轉換導出,方便轉換成需要的格式。

  1. 城市數據、座標和邊界均可導入數據內使用。
  2. 城市數據因爲全部有拼音,因此在選擇界面顯示時很容易分組和顯示拼音前綴,省市區3級拼音準確度奇高,第4級稍微差點。
  3. 邊界座標可用來根據用戶座標解析出城市信息,除臺灣外全部城市均能覆蓋到。
  4. 庫裏面提供了採集源碼,採集方式爲瀏覽器控制檯內執行js採集,全部自己採集也很快速,大約30分鐘以內就搞定了;當然直接下載也是可以的。

更新計劃

目前來看,新版的數據前3級看起來和其他大網站的區別不會太大了,並且比他們新,主要是丟棄了那160多個開發區、經濟區的功勞。第4級由於直接採用的騰訊地圖的數據,對照統計局的來看,區別不大,其他網站沒有對比,蠻很少有提供這麼深層級的,並且數據量太大也不好怎麼對比出一個可信的數據。

目前更新主要看民政部,民政部有新數據放出後,會去對比一下數據是否有變化,如果沒有變化就會全量更新。不過對已在使用的數據庫內的老數據的更新,目前並沒有什麼簡潔的解決方案,因爲這種數據在數據庫裏面更新時一件很麻煩的事情。

== 完 ==

相關文章