AreaCity 開源庫整理了省、市、區縣、鄉鎮街道四級行政區劃資料,配套了線上工具轉換成三級、四級聯動JavaScript程式碼,使用自帶的轉換工具軟體可以匯入資料庫;資料來源自: 統計局、民政部、騰訊地圖行政區劃、高德地圖行政區劃,從這四大平臺整合。
開源庫內帶有省市區三級座標邊界資料,資料來源:高德開放平臺,使用配套提供的轉換工具軟體可以轉換成shp、geojson、sql、匯入資料庫;另配套有開源Java查詢工具,記憶體佔用低,效能優良,1秒可查1萬個以上座標對應的城市資訊。
截止到發文(2023-02-08),開源庫內於2023年02月02日釋出了新整理的最新版資料;行政區劃資料更新頻繁,僅區縣每年都有好多個變更,統計局、民政部每年都會發布新資料(目前最新版的為統計於2022-12-29日釋出的資料),不過需要自行處理;所以省市區資料需要經常去同步維護,好在這個開源庫有在持續的長期維護,且有配套的轉換工具,新資料釋出後更新相對容易很多。
由於開源庫更新維護資料比較及時,所以只要開源庫沒有被關閉,本文介紹的提取方法就一直適用,不僅僅是適用於今年; 比那些上傳到下載平臺就萬年不更新的資料優秀很多。
在資料線上預覽頁面底下,提供了個線上轉換工具,開啟就是當前庫裡面整理好的最新版資料(開源庫更新維護資料比較及時),能將省市區鎮四級資料轉成json格式檔案,控制選項也豐富,想要匯出一級、兩級、三級、四級資料都可以:
轉換好後直接可以下載到json檔案,json檔案對於跨平臺使用很方便,不單單是網頁裡面使用,手機app、桌面程式、後端程式碼內使用均適用。
通過自定義功能可以匯出任意格式的JSON資料,比如第三方開源的級聯操作庫需要特定結構的JSON陣列,部分自定義操作參考:
在資料線上預覽頁面底下,提供了個線上轉換工具,開啟就是當前庫裡面整理好的最新版資料(開源庫更新維護資料比較及時),能將省市區鎮四級資料轉成多級聯動js,控制選項也豐富,轉成兩級、三級、四級聯動都可以,還能在頁面上直接體驗到四級聯動下拉選擇:
轉換好後直接可以下載到js檔案,其實js程式碼內已經內嵌了json格式的資料,並且封裝好了多級聯動js程式碼,我們只需要按程式碼內的說明,呼叫方法即可在html網頁裡面快速實現多級聯動,使用者選擇後會有事件回撥。
匯入前先下載好:
ok_data_level4.csv
資料檔案。準備好後,開啟轉換工具,開始將資料匯入資料庫(這裡匯入的MySQL,匯入SQL Server一樣操作):
ok_data_level4.csv
資料檔案;MySQL使用者端檢視資料:
以上操作同樣適用於SQL Server,一樣的步驟,另外內建指令碼中還支援「省市區鎮轉SQL」功能,可以直接匯出SQL檔案,可以匯入到其他相容的資料庫。
開源庫會盡量和民政部的更新頻率保持一致,但由於最為主要的兩個資料來源國家統計局
、騰訊地圖行政區劃
更新頻度並沒有民政部高;因此省市區三級準確度和民政部準確度是一量級,並且要更完整些;第四級鎮級主要由騰訊地圖行政區劃
提供,騰訊資料來源並不經常更新,因此會導致小部分新增、調整的城市第四級沒有資料(會用上級資料補齊),使用前應該考慮此缺陷。
資料通過使用上級資料補齊的形式(具體細節請參考庫檔案後面的資料規則),使得任何一個資料都能滿足省市區鎮4級結構,沒有孤立的(ID全域性唯一),因此不管從哪級進行下級選擇,都能進行有效操作。可以通過ID結構來識別這種補齊填充的資料,只要ID為上級的ID+多個0,就代表此資料為補齊填充資料,比如:東莞(4419)-東莞(441900),很容易鑑別出441900為補齊用的填充資料。
會發生補齊行為的資料很少,約50來個,主要為:直筒子市(東莞、儋州等)、省直轄縣級市(濟源、潛江等),他們的下一級僅有補齊的這條資料。另外直轄市(北京、天津等)下級也僅有一條資料,ID結尾為01(不包括重慶,重慶下級分成了市、縣兩個)。
資料中不包含大部分行政管理區(請自行查閱和行政區劃的差別),比如:雄安新區、天府新區、蘇州工業園區等。
省市區三級線上預覽和下載:https://xiangyuecn.gitee.io/areacity-jsspider-statsgov/assets/geo-echarts.html ,提供了ECharts + 高德地圖四級下鑽程式碼。
下載到的資料是最新的csv純文字格式,可以自行轉換成需要的格式;也可下載一下開源庫提供的格式轉換工具,工具支援將csv資料轉換成:shp、geojson、sql、匯入資料庫、座標系轉換,功能比較豐富。
geojson是通用格式,可以在網頁中使用:地圖、ECharts 都能直接支援,也可以在GIS軟體中開啟和編輯邊界。
ok_geo.csv
檔案;轉成geojson檔案
按鈕,耐心等待一會,資料就匯出完成了;開源庫另外配套有Java座標邊界查詢工具:AreaCity-Query-Geometry,使用
jts庫
從geojson邊界資料
檔案中查詢出和任意點、線、面有相交的向量邊界,記憶體佔用低,效能優良,1秒可查1萬個以上座標對應的城市資訊;此工具自帶了一個HTTP API服務,可以在線上預覽頁面的自定義資料來源
中進行呼叫測試,頁面會立即繪製查詢出來的邊界圖形。
shp檔案一般是在GIS軟體中使用和編輯,比如:ArcGIS、QGIS軟體;使用格式轉換工具可以匯出shp格式檔案,匯出操作和上面geojson檔案一樣,點選轉成shp檔案
按鈕即可匯出。
使用格式轉換工具可以將省市區邊界資料匯入到資料庫,使用資料庫提供的空間查詢可以輕鬆做到查詢任意座標點對應的省市區名稱;也可通過後端程式查詢出省市區多級邊界資料WKT格式,供前端使用。
ok_geo.csv
檔案;MySQL
、SQL Server
,再填寫資料庫連線,包括:埠、資料庫名稱、賬號密碼;匯入資料庫
按鈕,等待一會,大約3分鐘左右,所有資料就都匯入到了資料庫按今天日期新建的表裡面。對空間欄位的查詢,需要用`ST_AsText()`方法才能查詢出字串文字(WKT: Well Known Text),否則查詢出來的是二進位制資料
-- MySQL版:
SELECT id, name, ST_AsText(geo) AS geo, ST_AsText(polygon) AS polygon FROM 表名
-- SQL Server版:
SELECT id, name, geo.STAsText() AS geo, polygon.STAsText() AS polygon FROM 表名
省市區邊界匯入到了資料庫後,我們就可以在在 `Java`、`Python`、`PHP`、`C#` 等程式中對資料庫進行查詢,通過SQL的空間計算函數`ST_Intersects`來查詢一個座標在哪些邊界範圍內,就能得到對應的省市區資訊了
比如要查詢座標`lng:113.929976 lat:22.529497`是在哪個城市:
-- MySQL版:
SELECT id,deep,name FROM 表名 WHERE ST_Intersects(polygon, ST_GeomFromText('POINT(113.929976 22.529497)',0))=1
-- SQL Server版:
SELECT id,deep,name FROM 表名 WHERE polygon.STIntersects(geometry::STGeomFromText('POINT(113.929976 22.529497)',0))=1
注:csv檔案內的邊界資料預設是高德地圖
GCJ-02
火星座標系,如果需要其他座標系,比如百度的BD-09
或GPS的WGS-84
,可以通過高階指令碼中的座標系轉換外掛進行轉換,選擇好對應的外掛後,點選應用就可以了,在匯入資料庫時會自動進行座標系轉換。
鄉鎮級的座標邊界資料未開源,但和省市區三級一樣的可以線上預覽,大約半年重新整合一次,資料參考檔案和下載地址:https://xiangyuecn.gitee.io/areacity-jsspider-statsgov/assets/geo-level4.html
鄉鎮級座標邊界資料的使用方法和省市區三級一樣,使用配套的轉換工具可轉換成shp、geojson、sql、匯入資料庫,請參考上面省市區三級的操作步驟。
【完】