我为我正在进行的项目创建了一个原型,用户应在地图中创建各种标记,能够删除它们,使用标记计算路线,然后返回管理标记
我在 geocodezip.com 中使用了一些代码来计算路线,并为标记写了一些等等。
我的问题是,一旦用户计算路线,无论他如何编辑标记,当单击按钮计算路线时,地图仅返回带有第一次点击时标记的路线。按钮。最奇怪的是,我检查了传递给生成路径的脚本的坐标,函数正在发送标记,但无论发送的坐标如何,它只能在第一次正常工作。
Js Fiddle: https://jsfiddle.net/1kmg2u65/2/
The code is really really long so it's all in the Fiddle, but this is what it does:
1. User clicks on map, generate marker, marker goes to an array
2. If user deletes marker, it becomes null in array, to maintain the indexes
3. 'Clean' markers array receives all the markers in order, without the items that are null
4. A function is called with all the markers, this function creates the route
5. To manage the markers, a function reload the map just like it was in the start, but render all the markers that already are in the markers array
答案 0 :(得分:1)
所以我认为这是正在发生的事情。
在函数markMap()
中,您将实例化属于Google地图对象的新标记。
for (var i = 0; i < markerElements.length; i++){ //Loop para gerar os marcadores
if (markerElements[i] != null){
marker = new google.maps.Marker({
position: markerElements[i].position,
map: map,
title: markerElements[i].title
});
}
}
这很好,但你不是把那个构造的对象存储在任何地方。您需要能够将marker
引用到地图中的UN关联。
在此for循环结束时,您需要将THAT标记添加到全局数组中,以便稍后在脚本中进行管理。
示例强>
// defined at the top of the script
var markerGlobal = [];
for (var i = 0; i < markerElements.length; i++){ //Loop para gerar os marcadores
if (markerElements[i] != null){
marker = new google.maps.Marker({
position: markerElements[i].position,
map: map,
title: markerElements[i].title
});
// push marker onto global array
markerGlobal.push(marker);
}
}
现在我们可以遍历数组并setMap
为null
// un-reference marker from map
markerGlobal[2].setMap(null);
我看到您尝试使用removeMarker()
函数执行此操作,但它没有已添加到地图中的标记的句柄。
一些建议
如果我是你,我会考虑重构代码以拥有一个包含所有标记,行信息,变量等的多维对象。
您可以更进一步,创建一个处理地图及其相关标记的构造函数。这将是最有效的。
祝你好运。答案 1 :(得分:1)
如果删除if (!window.tour)
函数定义中的条件Tour_startUp
,它可以正常工作。