Не удается раскрасить jVectorMap в некоторых странах

Я использую jVectorMap для отображения значений страны с помощью цвета (т.е. страны имеют разные цвета в зависимости от их значений). Все работает нормально, за исключением случаев, когда в набор данных включены определенные страны. Тогда страны не окрашиваются должным образом (на самом деле они не окрашиваются вообще).

Я определил Бахрейн (BH) и Сингапур (SG) как 2 страны/города-государства, которые ломают карту. Похоже, что этих стран нет на карте. Я не удивлен их отсутствием. Однако хотелось бы, чтобы карта не подвела.

Ошибка JavaScript 'this.elements[...].element' is null or not an object заключается в следующем (см. комментарий об ошибке в коде ниже).

jvm.DataSeries.prototype={
    //...
    setValues:function(e){
        var t=Number.MIN_VALUE,n=Number.MAX_VALUE,r,i,s={};
        if(!this.params.min||!this.params.max){
            for(i in e)
                r=parseFloat(e[i]),r>t&&(t=e[i]),r<n&&(n=r);
            this.params.min||this.scale.setMin(n),this.params.max||this.scale.setMax(t),this.params.min=n,this.params.max=t
        }
        for(i in e)
            //FAILS ON THE FOLLOWING LINE
            r=parseFloat(e[i]),r?s[i]=this.scale.getValue(r):s[i]=this.elements[i].element.style.initial[this.params.attribute];
        this.setAttributes(s),this.values=e
    },
    //...
},

Есть ли способ решить эту проблему? Я бы предпочел НЕ изменять код jVectorMap или делать в своем коде Java такие вещи, как следующее:

if (!countryCode.equals("BH") && !countryCode.equals("SG")) {
    countryValues.put(countryCode, countryValue);
}

person Snowy Coder Girl    schedule 15.11.2012    source источник


Ответы (1)


Если вы хотите, чтобы ваши данные содержали только те коды стран, которые есть на вашей карте, вы можете отфильтровать данные, используя коды стран карты в качестве критерия фильтрации, прежде чем настраивать данные для карты.

Вы можете определить метод, в котором вы передаете данные, перебираете каждый элемент и удаляете записи, чьи коды стран отсутствуют в путях карты:

function filterDataForMap(data, mapName){
    var filteredData = {};
    $.each(data,function(key, value){
       //Only add when the key (country code) exists in the map
       if(jvm.WorldMap.maps[mapName].paths[key]!==undefined) {
          filteredData[key] = value;        
       }                
    });
    return filteredData;
}

Применительно к созданию карты:

$('#map').vectorMap({
        map: 'world_mill_en',
        series: {
          regions: [
            {
              scale: colorScale,
              attribute: 'fill',
              normalizeFunction: 'polynomial',
              values: filterDataForMap(mapData, 'world_mill_en') //filter data
            }]
        }
 });
person Mads Hansen    schedule 17.11.2012