ECharts合併地圖上的區域
阿新 • • 發佈:2019-02-20
對於某些特定需求,官方下載的地圖資料可能並不能完全滿足。例如,要求顯示中國地圖,但需要將山東江蘇和浙江這3個省合併起來,顯示“東部區域”。其他省份不變。
於是就需要對官方提供的地圖資料進行修改。
一個思路是藉助第三方工具,生成新區域的輪廓點,然後刪除原來的3個區域。例如http://geojson.io/就提供了這樣一種方式。但這樣費時費力,且精度無法保證。
實際上,直接將這三個省的輪廓點合併即可。
對於地圖,使用json格式引入:
$.get('js/china.json', function(chinaJson) { echarts.registerMap('china', chinaJson); var chart = echarts.init(document.getElementById('main')); chart.setOption({ series: [{ type: 'map', map: 'china' }] }); });
其中引入的json會解析為引數chinaJson。而一個地圖的json格式如下:
{ "type": "FeatureCollection", "features": [ { "type": "Feature", "id": "01", "properties": { "name": "遼寧", "cp": [文字經緯度座標]//先經度後緯度,保留到小數點後六位 }, "geometry": { "type": "Polygon", "coordinates": [[ [座標對0], [座標對1]...//同cp屬性 ] ] } }, {省份2}, {省份3}, ... ] }
可見,每個省的資料主要包含在兩個屬性中:properties和geometry。
properties用於設定顯示的文字和文字的位置。
geometry繪製地圖一定是用的Polygon,其coordinates屬性是所有座標點對的集合。然而,考慮到一個完整的區域可能並不相連,例如群島等,所以coordinates其實是一個二維陣列,也就是一個Polygon的一維陣列。其含義是一個區域是由多個Polygon構成,而每個Polygon是由多個點構成。
於是,我們要合併山東江蘇和浙江這3個省,那麼只需要將這3個省的Polygon都放到同一個coordinates陣列中即可。
// 合併多個省為一個 var mergeProvinces = function(chinaJson, names, properties) { var features = chinaJson.features; var polygons = []; // 將指定省的polygon儲存下來,並將省的資料從地圖中刪除 for(var i = 0, iLen = names.length; i < iLen; i++) { for(var j = 0, jLen = features.length; j < jLen; j++) { if(features[j].properties.name == names[i]) { polygons = polygons.concat(features[j].geometry.coordinates); features.splice(j, 1); break; } } } // 構建新的合併區域 var feature = { type: "Feature", id: "" + features.length, properties: { name: properties.name || "" }, geometry: { type: "Polygon", coordinates: polygons } }; if(properties.cp) { feature.properties.cp = properties.cp; } // 將新的合併區域新增到地圖中 features.push(feature); }; $.get('js/china.json', function(chinaJson) { var params = { names: ["山東", "江蘇", "浙江"], properties: { name: "東部區域", cp: [ 119.553222, 33.724339 ] } }; mergeProvinces(chinaJson, params.names, params.properties); echarts.registerMap('china', chinaJson); var chart = echarts.init(document.getElementById('main')); chart.setOption({ series: [{ type: 'map', map: 'china' }] }); });
這樣,在地圖引入後就對區域進行了合併與刪除,那麼後續的操作跟正常引入的地圖就相同了。
另外,關於地圖上的座標點,使用的是常規的經緯度。座標對的x為經度,y為緯度。