本文描述的是對國家統計局於
2019-01-31
發布的《2018年統計用區划代碼和城鄉划分代碼(截止2018年10月31日)》中省市區三級的坐標和行政區域邊界的采集。隨着時間變化,本文內容會逐漸變舊或失效,請到GitHub倉庫查閱最新更新數據。
本文更新(移步查閱):
19-04-15 新采集了2018的省市區三級的坐標和行政區域邊界數據csv格式
19-03-22 采集了2018的城市數據數據下載 GitHub:https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov/releases
邊界效果預覽
數據來源
坐標和邊界是高德地圖提供的數據接口;可通過方法轉換成其他坐標系的坐標,比如百度地圖的。
省市區三級是國家統計局統計標准《2018年統計用區划代碼和城鄉划分代碼(截止2018年10月31日)》,截稿時是最新的。
數據采集
1. 調用高德地圖接口抓取原始數據
涉及源碼:map_geo.js
進入高德地圖測試頁面,執行代碼即可完成抓取,開了4個模擬的線程,采集了3300+數據,首次運行大概2分多鍾完成采集。
抓取完成后會自動彈出保存文件數據。
源碼里面包含了對不同地名的處理,有些城市不能直接通過編碼或城市名稱來查詢,高德地圖相對於統計局還是有些滯后。
2. 處理數據和導出CSV
涉及源碼:map_geo_格式化.js
這個代碼比較簡單,目前只是起到把數據導出來的作用,里面寫了一大堆方法,但運行過一次后發現,基本上可以不用了,因為對數據進行驗證部分發現高德的數據非常完美。
代碼運行完成就自動彈出保存csv文件數據了。
為什么不采百度的
使用高德接口采集是后面才決定的,因為本來是用百度地圖的接口,但數據全部搞完,經過使用發現百度地圖數據有嚴重問題:
參考 肅寧縣(右下方向那塊飛地)
、路南區(唐山科技職業技術學院那里一段詭異的邊界)
邊界,百度數據大量線段交叉的無效polygon
(百度地圖測試),沒有人工無法修正,高德沒有這個問題(高德地圖測試);
並且高德對鏤空性質的地塊處理比百度強,參考天津市
對唐山
大塊飛地的處理,高德數據只需要Union
操作就能生成polygon
,百度既有Union
操作又有Difference
操作,極其復雜數據還無效。
所以放棄使用百度地圖數據。
如何使用這些數據
坐標和邊界數據和省市區數據是分開存儲的,通過ID
來進行關聯。
采集到的csv文件可以導入到數據庫內使用,由於POLYGON
需要解析,蠻復雜的,可以參考src/map_geo_格式化.js內的SQL Server導入用的SQL語句的例子。
如果需要特定的POLYGON
格式,可以根據庫里面介紹的字段格式,自行進行解析和驗證。
使用過程中如果遇到多種不同坐標系的問題,比如請求的參數是WGS-84坐標(GPS)
,我們后端存儲的是高德的坐標,可以通過將WGS-84坐標
轉成高德坐標
后進行處理,百度的坐標一樣。轉換有相應方法,轉換精度一般可以達到預期范圍,可自行查找。或者直接把高德的原始坐標數據轉換成目標坐標系后再存儲(精度?)。
SQL Server
中的運行結果(大概2分鍾完成POLYGON
的轉換,表數據物理存儲空間大概300M):
最后
最新的數據下載和相關問題請到 Github查看:https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov
releases內除了有省市區三級坐標和行政區域邊界csv數據外,還有處理好的3級或者4級省市區鎮 csv數據提供下載。
如果這個庫有幫助到您,請 Star 一下。