HTML-подсказки маркера Amcharts4 без события наведения

Я использую этот пример, чтобы поместить маркеры карты при нажатии, и моя цель - отобразить mapMarker.tooltipHTML элементов по умолчанию, не наводя на них курсор. Любые альтернативы, такие как создание html-маркеров, приветствуются.


person Beck Rakhimov    schedule 30.03.2019    source источник


Ответы (1)


Ну, есть пара шагов, чтобы заставить Tooltip работать так, как вы хотите, из коробки. Во-первых, всплывающие подсказки обычно представляют собой нечто вроде синглтона, а не по одному на полигон или на mapImage, они фактически делят один на свою серию. Таким образом, каждый должен использовать свою собственную всплывающую подсказку (по большей части mapImage ниже — это imageSeries.mapImages.template):

mapImage.tooltip = new am4core.Tooltip();

Далее, условие, которое активирует всплывающую подсказку, обычно при наведении, — это наличие набора tooltipText или tooltipHTML, который не является пустой строкой.

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

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

mapImage.interactionsEnabled = false;

Теперь, когда маркер создан, мы просто покажем всплывающую подсказку:

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

По умолчанию всплывающая подсказка position уже установлена ​​на "fixed", а ее pointerOrientation на "vertical", нам просто нужно, чтобы она отображалась над маркером, который в этом примере имеет размер 32x32 px, уменьшенный на 30%, поэтому мы просто сдвинем его на 32 * вверх. 7 через свойство tooltipY mapImage:

mapImage.nonScaling = true; // this is also necessary so the size/vertical shift is predictably the same
mapImage.tooltipY = -32 * .7;

И последнее, но не менее важное: всплывающие подсказки не сохраняют свою позицию при масштабировании, поэтому нам придется делать это самостоятельно, прослушивая изменения масштаба, преобразовывая координаты широты/долготы изображения карты в координаты 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

Приложение (11 апреля 2019 г.):

Вы также можете привязать свойства широты/долготы к данным и создайте mapImages таким образом с помощью метода addData, например.

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 метод. Если вы хотите изменить массив data с помощью Array.splice, если после этого массив не будет пустым, вам придется запустить imageSeries.invalidateData() для обновления представления. Если массив будет пустым, лучше просто установить вместо него imageSeries.data = undefined. Также имейте в виду, что у метода addData есть второй параметр, который также удаляет элементы из начала массива.

Еще одно замечание: вам придется вручную dispose всплывающие подсказки маркеров в их событии "beforedisposed".

Вот обновленная и улучшенная демонстрация, которая включает в себя некоторые исправления ошибок:

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

person notacouch    schedule 03.04.2019
comment
Ценю ваш подробный ответ - person Beck Rakhimov; 04.04.2019
comment
Пожалуйста! Не стесняйтесь спрашивать, если у вас есть какие-либо вопросы. - person notacouch; 04.04.2019
comment
Также как я могу связать данные маркеров (идентификатор, название, широту, долготу и т. д.) с некоторым объектом внутри машинописного текста? Это помогло бы мне удалять маркеры без перезагрузки карты. - person Beck Rakhimov; 08.04.2019
comment
Не могли бы вы уточнить или привести пример того, как какие данные помогут вам управлять маркерами? Все маркеры будут доступны через imageSeries.mapImages (.each(...) для итерации, .getIndex(n) для получения одного), а их данные (через imageSeries.data = [...]) находятся в пределах dataItem.dataContext или в виде прямых свойств, в зависимости от того, о чем мы говорим. - person notacouch; 10.04.2019
comment
Допустим, у нас есть массив координат объектов = [{ долгота: число, широта: число, название: строка }]; Таким образом, цель состоит в том, чтобы связать этот массив с маркерами карты, чтобы маркеры были созданы из существующих данных, удалены на splice() и закреплены на push(). - person Beck Rakhimov; 10.04.2019
comment
@BeckRakhimov Я обновил ответ демонстрацией, основанной на data. Вместо привязки данных маркера, если вы используете массив данных серии, вы можете изменить его напрямую (и использовать методы invalidateData() или invalidateRawData() соответственно) или использовать методы addData/removeData, и маркеры будут обновлены (удалены/добавлены) соответственно. Тщательно не проверял, поэтому ваш пробег может отличаться, но я думаю, что новая демонстрация работает достаточно хорошо для проверки концепции. - person notacouch; 11.04.2019