Amcharts4 标记 html-没有悬停事件的工具提示

Amcharts4 marker html-tooltips without hover event

我正在使用 this 示例在点击时放置地图标记,我的目标是默认显示 mapMarker.tooltipHTML 元素,而不是将鼠标悬停在它们上面。欢迎使用任何替代方法,例如创建 html 标记。

好吧,要让 Tooltips 立即按照您想要的方式工作,需要几个步骤。首先,工具提示通常是单一的,而不是每个多边形或每个 mapImage,它们实际上在他们的系列中共享一个。所以每个人都必须使用自己的工具提示(大多数情况下,mapImage 下面是 imageSeries.mapImages.template):

mapImage.tooltip = new am4core.Tooltip();

接下来,启用工具提示的条件(通常在悬停时)是 tooltipTexttooltipHTML 设置是否不是空字符串。

mapImage.tooltipText = "Latitude: {latitude}\nLongitude: {longitude}";

悬停时显示工具提示是默认行为,最简单的防止方法是在 mapImage:

上禁用鼠标交互
mapImage.interactionsEnabled = false;

现在,一旦创建了标记,我们将只显示工具提示:

mapImage.events.once("inited", function(event) {
  event.target.showTooltip();
});

默认情况下,工具提示 position 已经设置为 "fixed",其 pointerOrientation 设置为 "vertical",我们只需要它显示在标记上方,在这个例子是 32x32 像素,缩小了 30%,所以我们只需通过 mapImagetooltipY 属性:

将它向上移动 32 * .7
mapImage.nonScaling = true; // this is also necessary so the size/vertical shift is predictably the same
mapImage.tooltipY = -32 * .7;

最后但同样重要的是,工具提示不会在缩放时保持它们的位置,因此我们必须通过监听缩放变化、将地图图像的 lat/long 坐标转换为图表 x/y 坐标,并将其传递给每个工具提示:

chart.events.on("zoomlevelchanged", function() {
  imageSeries.mapImages.each(function(mapImage) {
    var point = chart.geoPointToSVG({ latitude: mapImage.latitude, longitude: mapImage.longitude });
    mapImage.tooltip.moveTo({ x: point.x, y: point.y - (32 * .7)});
  });
});

这是一个演示:

https://codepen.io/team/amcharts/pen/698eb4a11c35733850fbc084631bfc21

附录 (2019-04-11):

您也可以 bind the latitude/longitude properties to data 并通过 addData 方法创建 mapImages,例如

var mapImage = imageSeries.mapImages.template;
mapImage.propertyFields.latitude = "latitude";
mapImage.propertyFields.longitude = "longitude";

// You can even start off with some markers at the onset
// From our Animations along lines demo: https://www.amcharts.com/demos/animations-along-lines/
imageSeries.data = [
  { "latitude": 48.8567, "longitude": 2.3510, "name": "Paris"},
  { "latitude": 43.8163, "longitude": -79.4287, "name": "Toronto"},
  { "latitude": 34.3, "longitude": -118.15, "name": "Los Angeles"},
  { "latitude": 23, "longitude": -82, "name": "Havana"},
];

chart.seriesContainer.events.on("hit", function(ev) {
  var coords = chart.svgPointToGeo(ev.svgPoint);
  // var marker = imageSeries.mapImages.create();  
  // marker.latitude = coords.latitude;
  // marker.longitude = coords.longitude;
  imageSeries.addData({
    latitude: coords.latitude,
    longitude: coords.longitude,
  });
});

如果您想从 data 数组的开头删除标记,请使用 removeData method. If you want to modify the data array using Array.splice, if the array is not empty afterwards, you'll have to run imageSeries.invalidateData() to update the view. If the array will be empty, it's better to just set imageSeries.data = undefined instead. Also keep in mind the addData method 的第二个参数,该参数也会从数组的开头删除项目。

另外请注意,您必须在 "beforedisposed" 事件中手动 dispose 标记工具提示。

这是一个更新和改进的演示,其中包含一些错误修复:

https://codepen.io/team/amcharts/pen/fee1cb6db8971ec3eff6541ad52bab6d