1. 程式人生 > >ECharts合併地圖上的區域

ECharts合併地圖上的區域

對於某些特定需求,官方下載的地圖資料可能並不能完全滿足。例如,要求顯示中國地圖,但需要將山東江蘇和浙江這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},
		...
	]
}

可見,每個省的資料主要包含在兩個屬性中:propertiesgeometry

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為緯度。