amCharts4数据变化不触发地图重绘
amCharts4 data change does not trigger map redraw
我正在使用 amcharts4 作为流星项目的一部分。目标是显示地图并在地图上显示地图标记。每次数据更改时,地图标记都必须自行更新并指向新位置。
我尝试重用已经 available demo
我添加的唯一额外内容是将一组不同的数据重新分配给 imageSeries,以便更新地图上的标记。
我有一个 jsfiddle 来演示发生了什么。 setTimeout 函数用于模拟 5 秒后的数据更改。
setTimeout(function(){
$('.map-marker').remove()
imageSeries.data = [{
"zoomLevel": 5,
"scale": 0.5,
"title": "Brussels",
"latitude": 50.8371,
"longitude": 4.3676
}];
imageSeries.validateData();
}, 5000)
5 秒后确实发生了数据更改。但是在您手动平移地图或放大/缩小地图之前,新点不会显示在地图上。
如何解决这个问题?
AmCharts 在 redraw/update 之后更新地图。问题是您使用的是 自定义 HTML 标记 而不是像 this demo 中那样仅包含图像的本机功能。由于您使用的是自定义设置,因此需要一个额外的步骤(顺便说一句,这是为 v3 编写的演示的一个端口,它也没有本机 HTML 标记)。
在演示中,updateCustomMarkers
首先负责将标记放置在地图上。请注意,演示通过将此方法附加到地图实例的 mappositionchanged
事件来设置自定义标记,由于创建时发生的 zoom/viewport 定位,该事件也恰好在地图初始化期间被调用。这也是为什么你手动放大后只能看到标记的原因。你的数据更新超时不会调用updateCustomMarkers
,所以除非你之后手动调用该方法,否则不会绘制自定义标记;请注意,您也不需要在替换整个数组时调用 invalidateData
。
setTimeout(function() {
$('.map-marker').remove()
imageSeries.data = [{
"zoomLevel": 5,
"scale": 0.5,
"title": "Brussels",
"latitude": 50.8371,
"longitude": 4.3676
}];
updateCustomMarkers();
}, 5000)
请注意,使用原生图像时不需要此额外步骤,因为地图会自动更新该场景中的标记。
我正在使用 amcharts4 作为流星项目的一部分。目标是显示地图并在地图上显示地图标记。每次数据更改时,地图标记都必须自行更新并指向新位置。
我尝试重用已经 available demo
我添加的唯一额外内容是将一组不同的数据重新分配给 imageSeries,以便更新地图上的标记。
我有一个 jsfiddle 来演示发生了什么。 setTimeout 函数用于模拟 5 秒后的数据更改。
setTimeout(function(){
$('.map-marker').remove()
imageSeries.data = [{
"zoomLevel": 5,
"scale": 0.5,
"title": "Brussels",
"latitude": 50.8371,
"longitude": 4.3676
}];
imageSeries.validateData();
}, 5000)
5 秒后确实发生了数据更改。但是在您手动平移地图或放大/缩小地图之前,新点不会显示在地图上。
如何解决这个问题?
AmCharts 在 redraw/update 之后更新地图。问题是您使用的是 自定义 HTML 标记 而不是像 this demo 中那样仅包含图像的本机功能。由于您使用的是自定义设置,因此需要一个额外的步骤(顺便说一句,这是为 v3 编写的演示的一个端口,它也没有本机 HTML 标记)。
在演示中,updateCustomMarkers
首先负责将标记放置在地图上。请注意,演示通过将此方法附加到地图实例的 mappositionchanged
事件来设置自定义标记,由于创建时发生的 zoom/viewport 定位,该事件也恰好在地图初始化期间被调用。这也是为什么你手动放大后只能看到标记的原因。你的数据更新超时不会调用updateCustomMarkers
,所以除非你之后手动调用该方法,否则不会绘制自定义标记;请注意,您也不需要在替换整个数组时调用 invalidateData
。
setTimeout(function() {
$('.map-marker').remove()
imageSeries.data = [{
"zoomLevel": 5,
"scale": 0.5,
"title": "Brussels",
"latitude": 50.8371,
"longitude": 4.3676
}];
updateCustomMarkers();
}, 5000)
请注意,使用原生图像时不需要此额外步骤,因为地图会自动更新该场景中的标记。