Как добавить гиперссылку на отдельные страны? amCharts

#javascript #http-status-code-404 #amcharts

#javascript #http-status-code-404 #amcharts

Вопрос:

Я пытаюсь прикрепить ссылку на другую страницу при нажатии на отдельную страну. На данный момент я добавил одну URL-ссылку на Алжир (id: DZ):

 { "data": [{"id": "DZ"}], "url": "https://en.wikipedia.org/wiki/Algeria" }
  

Однако, когда я нажимаю на карту, она возвращает ошибку 404 not found, она также преобразует адрес в {url}. Я запускаю свой сайт на localhost. Я попытался добавить как реальный веб-сайт (https://en.wikipedia.org/wiki/Algeria ) и путь к одной из моих локальных страниц html-файла, но оба возвращают одну и ту же ошибку. Это происходит потому, что я использую localhost или потому, что мой код неверен?

Функция, используемая для ссылки на URL при нажатии на страну:

 mapPolygonTemplate.events.on("hit", function(ev) {
ev.target.series.chart.url = "{url}";
});
  

Кроме того, ссылка локализована не для одной страны на карте, ошибка возникает при нажатии на любое место на карте. Как я могу убедиться, что у каждой страны есть своя уникальная ссылка, когда я прикрепляю их все?

 am4core.useTheme(am4themes_animated);

var chart = am4core.create("chartdiv", am4maps.MapChart);

chart.geodata = am4geodata_worldUltra;


chart.projection = new am4maps.projections.Miller();

chart.zoomControl = new am4maps.ZoomControl();

var homeButton = new am4core.Button();
homeButton.events.on("hit", function() {
  chart.goHome();
});

homeButton.icon = new am4core.Sprite();
homeButton.padding(7, 5, 7, 5);
homeButton.width = 30;
homeButton.icon.path = "M16,8 L14,8 L14,16 L10,16 L10,10 L6,10 L6,16 L2,16 L2,8 L0,8 L8,0 L16,8 Z M16,8";
homeButton.marginBottom = 10;
homeButton.parent = chart.zoomControl;
homeButton.insertBefore(chart.zoomControl.plusButton);

chart.homeZoomLevel = 4;
chart.homeGeoPoint = {
  longitude: 16.5,
  latitude: 3.8
};


var groupData = [{
    "data": [{
      "id": "DZ",
      "url": "https://en.wikipedia.org/wiki/Algeria"
    }]
  },
  {
    "data": [{
      "id": "AO"
    }]
  },
  {
    "data": [{
      "id": "BJ"
    }]
  },
  {
    "data": [{
      "id": "BW"
    }]
  },
  {
    "data": [{
      "id": "BF"
    }]
  },
  {
    "data": [{
      "id": "BI"
    }]
  },
  {
    "data": [{
      "id": "CM"
    }]
  },
  {
    "data": [{
      "id": "CV"
    }]
  },
  {
    "data": [{
      "id": "CF"
    }]
  },
  {
    "data": [{
      "id": "KM"
    }]
  },
  {
    "data": [{
      "id": "CD"
    }]
  },
  {
    "data": [{
      "id": "DJ"
    }]
  },
  {
    "data": [{
      "id": "EG"
    }]
  },
  {
    "data": [{
      "id": "GQ"
    }]
  },
  {
    "data": [{
      "id": "ER"
    }]
  },
  {
    "data": [{
      "id": "ET"
    }]
  },
  {
    "data": [{
      "id": "GA"
    }]
  },
  {
    "data": [{
      "id": "GM"
    }]
  },
  {
    "data": [{
      "id": "GH"
    }]
  },
  {
    "data": [{
      "id": "GN"
    }]
  },
  {
    "data": [{
      "id": "GW"
    }]
  },
  {
    "data": [{
      "id": "CI"
    }]
  },
  {
    "data": [{
      "id": "KE"
    }]
  },
  {
    "data": [{
      "id": "LS"
    }]
  },
  {
    "data": [{
      "id": "LR"
    }]
  },
  {
    "data": [{
      "id": "LY"
    }]
  },
  {
    "data": [{
      "id": "MG"
    }]
  },
  {
    "data": [{
      "id": "MW"
    }]
  },
  {
    "data": [{
      "id": "ML"
    }]
  },
  {
    "data": [{
      "id": "MR"
    }]
  },
  {
    "data": [{
      "id": "MU"
    }]
  },
  {
    "data": [{
      "id": "MA"
    }]
  },
  {
    "data": [{
      "id": "MZ"
    }]
  },
  {
    "data": [{
      "id": "NA"
    }]
  },
  {
    "data": [{
      "id": "NE"
    }]
  },
  {
    "data": [{
      "id": "NG"
    }]
  },
  {
    "data": [{
      "id": "CG"
    }]
  },
  {
    "data": [{
      "id": "RE"
    }]
  },
  {
    "data": [{
      "id": "RW"
    }]
  },
  {
    "data": [{
      "id": "SH"
    }]
  },
  {
    "data": [{
      "id": "ST"
    }]
  },
  {
    "data": [{
      "id": "SN"
    }]
  },
  {
    "data": [{
      "id": "SC"
    }]
  },
  {
    "data": [{
      "id": "SL"
    }]
  },
  {
    "data": [{
      "id": "SO"
    }]
  },
  {
    "data": [{
      "id": "ZA"
    }]
  },
  {
    "data": [{
      "id": "SS"
    }]
  },
  {
    "data": [{
      "id": "SD"
    }]
  },
  {
    "data": [{
      "id": "SZ"
    }]
  },
  {
    "data": [{
      "id": "TZ"
    }]
  },
  {
    "data": [{
      "id": "TG"
    }]
  },
  {
    "data": [{
      "id": "TN"
    }]
  },
  {
    "data": [{
      "id": "UG"
    }]
  },
  {
    "data": [{
      "id": "EH"
    }]
  },
  {
    "data": [{
      "id": "YT"
    }]
  },
  {
    "data": [{
      "id": "ZM"
    }]
  },
  {
    "data": [{
      "id": "ZW"
    }]
  },
  {
    "data": [{
      "id": "TD"
    }]
  }
];


var excludedCountries = ["AQ"];


groupData.forEach(function(group) {
  var series = chart.series.push(new am4maps.MapPolygonSeries());
  series.name = group.name;
  series.useGeodata = true;
  var includedCountries = [];
  group.data.forEach(function(country) {
    includedCountries.push(country.id);
    excludedCountries.push(country.id);
  });
  series.include = includedCountries;

  series.fill = am4core.color("#fff");


  series.setStateOnChildren = true;
  var seriesHoverState = series.states.create("hover");


  var mapPolygonTemplate = series.mapPolygons.template;
  mapPolygonTemplate.fill = am4core.color("#fff");
  mapPolygonTemplate.fillOpacity = 1;
  mapPolygonTemplate.nonScalingStroke = false;
  mapPolygonTemplate.stroke = am4core.color("#878787");
  mapPolygonTemplate.strokeWidth = 0.2;
  mapPolygonTemplate.strokeOpacity = 0.5;
  mapPolygonTemplate.tooltipText = "{name}";

  mapPolygonTemplate.events.on("hit", function(ev) {
    ev.target.series.chart.url = "{url}";
  });

  var hoverState = mapPolygonTemplate.states.create("hover");
  hoverState.properties.fill = am4core.color("#a3cc88");

  series.data = JSON.parse(JSON.stringify(group.data));

});



var worldSeries = chart.series.push(new am4maps.MapPolygonSeries());
var worldSeriesName = "world";
worldSeries.name = worldSeriesName;
worldSeries.useGeodata = true;
worldSeries.exclude = excludedCountries;
worldSeries.fillOpacity = 0.3;
worldSeries.mapPolygons.template.nonScalingStroke = true;

worldSeries.mapPolygons.template.stroke = worldSeries.mapPolygons.template.fill;
worldSeries.mapPolygons.template.strokeWidth = 0;  
 html body {
  height: 100%;
  width: 100%;
  margin: 0;
  padding: 0;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}

#chartdiv {
  height: 90vh;
  width: 100vh;
  border: solid #000 1px;
}  
 <div id="chartdiv"></div>

<script src="https://www.amcharts.com/lib/4/core.js"></script>

<script src="https://www.amcharts.com/lib/4/maps.js"></script>
<script src="https://www.amcharts.com/lib/4/geodata/worldUltra.js"></script>
<script src="https://www.amcharts.com/lib/4/themes/animated.js"></script>  

Ответ №1:

Вы можете использовать поля свойств для ссылки на URL в ваших данных, как в mapPolygonTemplate.propertyFields.url = "url"; .

Пожалуйста, проверьте рабочий пример ниже:

 am4core.useTheme(am4themes_animated);

var chart = am4core.create("chartdiv", am4maps.MapChart);

chart.geodata = am4geodata_worldUltra;


chart.projection = new am4maps.projections.Miller();

chart.zoomControl = new am4maps.ZoomControl();

var homeButton = new am4core.Button();
homeButton.events.on("hit", function() {
  chart.goHome();
});

homeButton.icon = new am4core.Sprite();
homeButton.padding(7, 5, 7, 5);
homeButton.width = 30;
homeButton.icon.path = "M16,8 L14,8 L14,16 L10,16 L10,10 L6,10 L6,16 L2,16 L2,8 L0,8 L8,0 L16,8 Z M16,8";
homeButton.marginBottom = 10;
homeButton.parent = chart.zoomControl;
homeButton.insertBefore(chart.zoomControl.plusButton);

chart.homeZoomLevel = 4;
chart.homeGeoPoint = {
  longitude: 16.5,
  latitude: 3.8
};


var groupData = [{
    "data": [{
      "id": "DZ",
      "url": "https://en.wikipedia.org/wiki/Algeria"
    }]
  },
  {
    "data": [{
      "id": "AO"
    }]
  },
  {
    "data": [{
      "id": "BJ"
    }]
  },
  {
    "data": [{
      "id": "BW"
    }]
  },
  {
    "data": [{
      "id": "BF"
    }]
  },
  {
    "data": [{
      "id": "BI"
    }]
  },
  {
    "data": [{
      "id": "CM"
    }]
  },
  {
    "data": [{
      "id": "CV"
    }]
  },
  {
    "data": [{
      "id": "CF"
    }]
  },
  {
    "data": [{
      "id": "KM"
    }]
  },
  {
    "data": [{
      "id": "CD"
    }]
  },
  {
    "data": [{
      "id": "DJ"
    }]
  },
  {
    "data": [{
      "id": "EG"
    }]
  },
  {
    "data": [{
      "id": "GQ"
    }]
  },
  {
    "data": [{
      "id": "ER"
    }]
  },
  {
    "data": [{
      "id": "ET"
    }]
  },
  {
    "data": [{
      "id": "GA"
    }]
  },
  {
    "data": [{
      "id": "GM"
    }]
  },
  {
    "data": [{
      "id": "GH"
    }]
  },
  {
    "data": [{
      "id": "GN"
    }]
  },
  {
    "data": [{
      "id": "GW"
    }]
  },
  {
    "data": [{
      "id": "CI"
    }]
  },
  {
    "data": [{
      "id": "KE"
    }]
  },
  {
    "data": [{
      "id": "LS"
    }]
  },
  {
    "data": [{
      "id": "LR"
    }]
  },
  {
    "data": [{
      "id": "LY"
    }]
  },
  {
    "data": [{
      "id": "MG"
    }]
  },
  {
    "data": [{
      "id": "MW"
    }]
  },
  {
    "data": [{
      "id": "ML"
    }]
  },
  {
    "data": [{
      "id": "MR"
    }]
  },
  {
    "data": [{
      "id": "MU"
    }]
  },
  {
    "data": [{
      "id": "MA"
    }]
  },
  {
    "data": [{
      "id": "MZ"
    }]
  },
  {
    "data": [{
      "id": "NA"
    }]
  },
  {
    "data": [{
      "id": "NE"
    }]
  },
  {
    "data": [{
      "id": "NG"
    }]
  },
  {
    "data": [{
      "id": "CG"
    }]
  },
  {
    "data": [{
      "id": "RE"
    }]
  },
  {
    "data": [{
      "id": "RW"
    }]
  },
  {
    "data": [{
      "id": "SH"
    }]
  },
  {
    "data": [{
      "id": "ST"
    }]
  },
  {
    "data": [{
      "id": "SN"
    }]
  },
  {
    "data": [{
      "id": "SC"
    }]
  },
  {
    "data": [{
      "id": "SL"
    }]
  },
  {
    "data": [{
      "id": "SO"
    }]
  },
  {
    "data": [{
      "id": "ZA"
    }]
  },
  {
    "data": [{
      "id": "SS"
    }]
  },
  {
    "data": [{
      "id": "SD"
    }]
  },
  {
    "data": [{
      "id": "SZ"
    }]
  },
  {
    "data": [{
      "id": "TZ"
    }]
  },
  {
    "data": [{
      "id": "TG"
    }]
  },
  {
    "data": [{
      "id": "TN"
    }]
  },
  {
    "data": [{
      "id": "UG"
    }]
  },
  {
    "data": [{
      "id": "EH"
    }]
  },
  {
    "data": [{
      "id": "YT"
    }]
  },
  {
    "data": [{
      "id": "ZM"
    }]
  },
  {
    "data": [{
      "id": "ZW"
    }]
  },
  {
    "data": [{
      "id": "TD"
    }]
  }
];


var excludedCountries = ["AQ"];


groupData.forEach(function(group) {
  var series = chart.series.push(new am4maps.MapPolygonSeries());
  series.name = group.name;
  series.useGeodata = true;
  var includedCountries = [];
  group.data.forEach(function(country) {
    includedCountries.push(country.id);
    excludedCountries.push(country.id);
  });
  series.include = includedCountries;

  series.fill = am4core.color("#fff");


  series.setStateOnChildren = true;
  var seriesHoverState = series.states.create("hover");


  var mapPolygonTemplate = series.mapPolygons.template;
  mapPolygonTemplate.fill = am4core.color("#fff");
  mapPolygonTemplate.fillOpacity = 1;
  mapPolygonTemplate.nonScalingStroke = false;
  mapPolygonTemplate.stroke = am4core.color("#878787");
  mapPolygonTemplate.strokeWidth = 0.2;
  mapPolygonTemplate.strokeOpacity = 0.5;
  mapPolygonTemplate.tooltipText = "{name}";
  mapPolygonTemplate.propertyFields.url = "url";
  // mapPolygonTemplate.urlTarget = "_blank";

  // mapPolygonTemplate.events.on("hit", function(ev) {
  //   ev.target.series.chart.url = "{url}";
  // });

  var hoverState = mapPolygonTemplate.states.create("hover");
  hoverState.properties.fill = am4core.color("#a3cc88");

  series.data = JSON.parse(JSON.stringify(group.data));

});



var worldSeries = chart.series.push(new am4maps.MapPolygonSeries());
var worldSeriesName = "world";
worldSeries.name = worldSeriesName;
worldSeries.useGeodata = true;
worldSeries.exclude = excludedCountries;
worldSeries.fillOpacity = 0.3;
worldSeries.mapPolygons.template.nonScalingStroke = true;

worldSeries.mapPolygons.template.stroke = worldSeries.mapPolygons.template.fill;
worldSeries.mapPolygons.template.strokeWidth = 0;  
 html, body {
  height: 100%;
  width: 100%;
  margin: 0;
  padding: 0;
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}

#chartdiv {
  height: 90vh;
  width: 100vh;
  border: solid #000 1px;
}  
 <div id="chartdiv"></div>

<script src="https://www.amcharts.com/lib/4/core.js"></script>

<script src="https://www.amcharts.com/lib/4/maps.js"></script>
<script src="https://www.amcharts.com/lib/4/geodata/worldUltra.js"></script>
<script src="https://www.amcharts.com/lib/4/themes/animated.js"></script>