1. 程式人生 > 程式設計 >真實感受一下縣比省大不包郵,省市區鄉鎮多級資料重灌上陣

真實感受一下縣比省大不包郵,省市區鄉鎮多級資料重灌上陣

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

GitHub: github.com/xiangyuecn/… 線上預覽:多級聯動測試和預覽、轉換成JSON

城市的座標和邊界範圍

座標邊界資料全部來自高德地圖介面(GCJ-02座標系),幾個地圖裡面質量算是最好的。儲存為csv格式,匯入SQL Server也是很方便的,先睹為快(大到不包郵?):

大到不包郵?

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

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

採集原始碼見此目錄:github.com/xiangyuecn/…

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

大到不包郵?

新版城市資料採集

原何重灌

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

技能要點

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

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

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

採集原始碼見此目錄(其中1-3打頭的js檔案):github.com/xiangyuecn/…

資料特性

  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級由於直接採用的騰訊地圖的資料,對照統計局的來看,區別不大,其他網站沒有對比,蠻很少有提供這麼深層級的,並且資料量太大也不好怎麼對比出一個可信的資料。

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

== 完 ==