動態生成最新行政區劃 GeoJSON 數據并結合 ECharts 實現地圖下鉆功能
在開發基于地圖的數據可視化應用時,一個常見的挑戰是獲取準確且最新的行政區劃邊界數據(GeoJSON)。許多現有的在線資源可能數據陳舊,無法反映最新的行政區劃調整。本文將介紹一種解決方案,通過調用高德開放平臺的 API 動態獲取最新的行政區劃邊界,并結合 ECharts 實現可下鉆的地圖可視化。
第一部分:通過高德開放平臺 API 獲取行政區劃邊界數據
高德地圖提供了強大的“行政區查詢服務”(AMap.DistrictSearch
),可以實時獲取全國范圍內的行政區劃信息,包括其地理邊界。
1. 準備工作:引入 API 與申請 Key
首先,您需要到高德開放平臺申請一個 Key,用于 API 調用。然后,在頁面中引入高德地圖的 JS API 腳本。
<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.11&key=「您申請的key值」&plugin=AMap.DistrictSearch"></script>
2. 調用接口獲取行政區列表
通過實例化 AMap.DistrictSearch
并調用其 search
方法,可以獲取指定區域的下一級行政區列表。以獲取中國所有省級單位為例:
// 初始化行政區查詢實例
const opts = {subdistrict: 1, // 返回下一級行政區showbiz: false // 最后一級不返回街道信息
};
const district = new AMap.DistrictSearch(opts);// 查詢“中國”的下一級行政區
district.search('中國', (status, result) => {if (status === 'complete') {// result.districtList[0] 包含了省級列表數據processData(result.districtList[0], 100000); }
});
3. 獲取 GeoJSON 格式的邊界數據
獲取到行政區列表后,需要利用 AMapUI
的 DistrictExplorer
模塊來加載指定區域的邊界數據(feature
)。
function loadMapData(areaCode, callback) {AMapUI.loadUI(['geo/DistrictExplorer'], DistrictExplorer => {const districtExplorer = new DistrictExplorer();districtExplorer.loadAreaNode(areaCode, (error, areaNode) => {if (error) {console.error(error);return;}// 構建標準的 GeoJSON 對象const geoJson = {type: "FeatureCollection",features: areaNode.getSubFeatures() // 獲取子區域的邊界數據};callback(geoJson);});});
}
關鍵點:areaNode.getSubFeatures()
返回的是一個 feature
數組,為了符合標準的 GeoJSON 格式,需要將其包裹在一個 { "type": "FeatureCollection", "features": [...] }
結構中。
第二部分:使用 ECharts 渲染地圖
獲取到標準的 GeoJSON 數據后,便可以利用 ECharts 將其渲染為地圖。
1. 引入 ECharts 庫
在項目中引入 ECharts 庫,例如使用 CDN:
<script src="https://cdn.jsdelivr.net/npm/echarts@5.0.0/dist/echarts.min.js"></script>
2. 注冊并配置地圖
在 ECharts 中,使用 echarts.registerMap
方法注冊剛才獲取的 GeoJSON 數據,然后在 option
中配置 series-map
。
// 假設 geoJsonData 是上一步獲取到的數據
// 假設 myChart 是已經初始化的 ECharts 實例// 注冊地圖
echarts.registerMap('currentMap', geoJsonData);// 配置 ECharts Option
const option = {series: [{type: 'map',map: 'currentMap', // 使用剛剛注冊的地圖roam: false,itemStyle: {// ...樣式配置},data: [ /* 業務數據 */ ] }]
};myChart.setOption(option);
執行此步驟后,即可成功渲染出對應的行政區劃地圖。
第三部分:實現地圖下鉆功能
地圖下鉆功能的核心是監聽 ECharts 的點擊事件,獲取被點擊區域的 adcode
,然后重復第一步和第二步的過程,獲取并渲染更深層級的地圖。
1. 監聽 ECharts 點擊事件
myChart.on('click', (params) => {// params.data 中應包含下一級區域的 adcodeconst cityCode = params.data.cityCode; const level = params.data.level;if (level === 'street') return; // 如果是街道級別,則不再下鉆// 使用 cityCode 再次調用高德API獲取下一級數據district.search(String(cityCode), (status, result) => {if (status === 'complete' && result.districtList.length > 0) {// 獲取新的 geoJson 并重新渲染 EChartsloadMapData(cityCode, (geoJson) => {// ...重新執行注冊和渲染的邏輯...});}});
});
注:上述代碼示例為核心邏輯展示,具體實現時可結合 Vue、React 等框架進行封裝。
總結與資源
通過上述方法,可以構建一個數據實時、支持無限層級下鉆的動態地圖應用,有效解決了靜態 GeoJSON 數據陳舊的問題。
對于希望直接查看完整實現或獲取預生成數據的開發者,可以參考以下資源:
- 完整示例項目:https://github.com/TangSY/echarts-map-demo
- 在線體驗與數據下載:https://geojson.hxkj.vip 該網站提供了基于此方法生成的最新省級、市級、區縣級 GeoJSON 文件以及多級別行政編碼數據的下載服務。