highcharts-Highmaps 動態傳入城市名稱


做前端按地區(地圖)分布監控數據展示用了 HIGHMAPS JAVASCRIPT MAPS 控件,很好很強大。

基礎實現是這樣的:調用插件動態傳入需要展示的數據(data),插件會在地圖數據(mapdata)中找到對應的區域,把值丟進去,然后在頁面上渲染展示帶有數據的區域數據分布地圖。

mapdata 數據結構(已簡化):

1 [
2     {'hc-key' : 'cn-sh', 'name' : '上海'},
3     {'hc-key' : 'cn-zj', 'name' : '浙江'}
4 ]

data 數據結構:

1 [
2     { 'hc-key' : 'cn-sh', 'value' : 113 },
3     { 'hc-key' : 'cn-zj', 'value' : 44 }
4 ]

(這里值得注意的是,value 值不能帶上引號如:'value' : '44' 就會導致插件報錯無法渲染。)

插件通過 data 里的這個 hc-key 值去 mapdata (該數據存放在一個 js 文件內) 撈對應的區域信息詳情,其中就包括地區的中文名稱信息如:上海。就是這里出了一點小麻煩,我的中文名稱可能會發生變動,譬如有時候是「上海」,但可能下一次下下次又會是 「上海 1」 ,「上海 2」。

常規思路是直接改數據源,重新加載數據源就好了。可是這個 mapdata 如我前面所說,是存在文件里的,那么一個人必須是瘋了才會想去在前端動態修改保存一個文件吧,所以這條路不用想就直接跳過。
再想一下既然 data 里的 value 能進去 mapdata ,那么 name 一樣也能進去。於是就這么愉快的決定,前端動態傳 data 的時候根據需要帶上(或不帶則還是使用 mapdata 里默認的名稱) name 屬性。

 

解決方案:

動態傳入 data 的數據結構:

1 [
2     { 'hc-key' : 'cn-sh', 'value' : 113, 'name' : '上海' },
3     { 'hc-key' : 'cn-zj', 'value' : 44 }
4 ]

接下來就是改造插件,能夠接受我傳入的 name 屬性,在插件中(highmaps.js)找到 mapdata 數據渲染之前這段:

 1    if (mapData) {
 2      ...
 3 
 4                 if (options.allAreas) {
 5 
 6                     data = data || [];
 7 
 8                     // Registered the point ...
 9                     if (joinBy[1]) {
10                         each(data, function (point) {
11                             dataUsed.push(point[joinBy[1]]);
12                         });
13                     }
14 
15                     // 放這里 o(≧v≦)o
16 
17                     // Add those map points ...
18                     dataUsed = '|' + dataUsed.join('|') + '|'; 
19            ...
20                 }
21             }

在 「// 放這里 o(≧v≦)o 」 這個位置加入下面這個賦值改寫 mapdata 的 name 屬性的方法:

1 each(data, function (dataItem) {
2   if (dataItem["name"]) {
3     each(mapData, function (mapdataItem) {
4       mapdataItem.name = mapdataItem[joinBy[0]] == dataItem[joinBy[0]] ? dataItem.name : mapdataItem.name;
5    });
6  }
7 });

搞定。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM