Использование пользовательских регионов с JQVmap

Я использую JQVmap (https://github.com/manifestinteractive/jqvmap) для вывода карты на сайт. Вместо того, чтобы что-то делать при наведении на каждую страну, я хочу, чтобы они были сгруппированы по регионам. Например, вместо Канады, США и Мексики я хотел бы, чтобы все три показывали состояние наведения при наведении курсора на любую из них и группировали страны. Я видел несколько сообщений о том, как раскрасить наборы стран, но каждая страна по-прежнему имеет свое собственное состояние наведения и не вызывает состояние наведения других стран с тем же цветом. Любые идеи?


person Andrew    schedule 31.01.2014    source источник


Ответы (1)


Я работал над проектом, и мне нужно было это сделать. Вот как я это сделал.

  1. Определите нужные регионы.
  2. Добавьте вспомогательные методы для выделения/снятия выделения стран из всех стран в регионе.
  3. Добавьте эти вспомогательные методы в качестве методов onRegionOver и onRegionOut карты.

Шаг 1.

Вот как я определил регионы.

var regionMap = {
        "southAmerica" :{
        "countries" : ["ar", "bo", "br", "cl", "co", "ec", "fk", "gy", "gf", "pe", "py", "sr", "uy", "ve"],
        "name" : "South America"
    },
        "northAmerica" :{
        "countries" : ["ca", "gl", "us"],
        "name" : "Northern America"
    }
}; //And so on...

Я также добавил карту и метод обратного поиска.

var countryMap = {
    "ca":"northAmerica",
    "gl":"northAmerica",
    "us":"northAmerica",
}; //And so on...
function getRegion(cc) {
    var regionCode = countryMap[cc];
    return regionMap[regionCode];
}

В качестве альтернативы вы можете избежать карты обратного просмотра и вместо этого написать функцию:

function getCountriesInRegion(cc) {
    for (var regionKey in regions)
    {
        var countries = regionMap[regionKey].countries;
        for (var countryIndex in countries)
        {
            if (cc == countries[countryIndex])
            {
                return countries;
            }
        }
    }
}

Шаг 2

Вспомогательные методы для выделения/снятия выделения областей:

function highlightRegionOfCountry (cc) {
    var countries = getRegion(cc).countries;
    for (countryIndex in countries)
    {
        $('#vmap').vectorMap('highlight',countries[countryIndex]); 
    }
    $('#vmap').vectorMap('highlight',cc);
}

function unhighlightRegionOfCountry (cc) {
    var countries = getRegion(cc).countries;
    for (countryIndex in countries)
    {
        $('#vmap').vectorMap('unhighlight',countries[countryIndex]);    
    }
    $('#vmap').vectorMap('unhighlight',cc);
}

Шаг 3.

Добавлена ​​регистрация вспомогательных методов в событиях наведения карты.

jQuery(document).ready(function() {
    jQuery('#vmap').vectorMap({
        map: 'world_en',
        backgroundColor: '#333333',
        color: '#ffffff',
        hoverOpacity: 0.2,
        selectedColor: '#666666',
        enableZoom: true,
        showTooltip: true,
        onRegionOver : function (element, code, region)
        {
            highlightRegionOfCountry(code);
        },
        onRegionOut : function (element, code, region)
        {
            unhighlightRegionOfCountry(code);
        }
    });
});

tl;dr: Используйте это:

$('#vmap').vectorMap('highlight', countryCode);

и

$('#vmap').vectorMap('unhighlight', countryCode); 

Регионы, которые мне были нужны для моего проекта, были регионами, определенными ООН. Вы можете взглянуть на мой форк JVQmap на GitHub. Файл, который вам нужно посмотреть, это /jqvmap/maps/jquery. .vmap.un_regions.js.

Надеюсь, это поможет!

person Arnav    schedule 17.02.2014
comment
Эй, @Arnav, это было очень полезно! У меня есть еще один вопрос, который, возможно, вы также решили, а именно с выбором/отменой региона, stackoverflow.com/questions/37922298/ если у вас есть минутка, не могли бы вы взглянуть на это для меня? Спасибо! - person Austin; 20.06.2016
comment
Привет, @Arna, знаешь ли ты, почему большинство карибских стран возвращают cc = ds, path = undefined при попытке установить непрозрачность? Кажется, что пути названы правильно, и в данных для этих стран установлены значения, но все равно возникает ошибка: Не удается прочитать свойство setOpacity неопределенного - person Aaron Lavers; 11.11.2016
comment
@ aaron-lavers Только что столкнулся с той же проблемой. Любые идеи? - person JMP; 02.07.2019
comment
@JMP Боюсь сказать, что я не нашел решения, извините, мы какое-то время запускали плагин (с этой ошибкой) на сайте, но несколько месяцев спустя он был заменен другим дизайном. - person Aaron Lavers; 03.07.2019