2013-10-23 52 views
0

我正在解析CSV文件,并将线条转换为地图上的标记,并带有侧边栏上的相应按钮。自动更新标记位置和infowindow

我创建标记当前的方法是

var bounds = new google.maps.LatLngBounds(); 
var sensor, i, latlng; 
for (i in sensorList) { 
    // Creates a marker 
    sensor = sensorList[i]; 
    latlng = new google.maps.LatLng(sensor.lat, sensor.lng); 
    bounds.extend(latlng); 
    var marker = createMarker(
     latlng, sensor.name, sensor.reading 
    ); 

    // Creates a sidebar for the marker 
    createMarkerButton(marker); 
} 

// Fit to map bounds 
mapCanvas.fitBounds(bounds); 

和我createMarker功能

function createMarker(latlng, title, html) { 
    // Creates a marker 
    var marker = new google.maps.Marker({ 
     position: latlng, 
     map: mapCanvas, 
     title: title 
}); 
// The InfoWindow is opened when the sidebar button is clicked 
     google.maps.event.addListener(marker, "click", function() { 
      infoWnd.setContent("<div class = \"PopUp\" style=\"width: 150px; height: 100px;\"<strong>"+title+"</title></strong><br>Latest reading: "+html+"<br><a href=\"\">Full reading</a>"); 
      infoWnd.open(mapCanvas, marker); 
     }); 
     return marker; 
    } 

这与CSV的伟大工程文件,其中每个传感器名称/位置是独一无二的。 我正在尝试扩展此功能,以支持在CSV文件中存储多个条目的相同传感器,并且只为每个传感器的最新条目创建一个标记/按钮。

我相信推荐这样做的方法是保留一个标记数组,每次创建一个标记我都应该与这个数组进行比较。 我对Javascript和谷歌地图很陌生,我不确定这个检查应该在哪里进行。我玩弄了一些可能性,但似乎没有任何工作。

有什么建议吗?

回答

1

建议的第一句话,因为它并不完全清楚你的sensorList是一个对象还是一个数组(我怀疑它是一个数组,因为我不明白它为什么会是一个对象),不要在数组中使用“for in”构造,也不要在javascript中创建关联数组。保存“for in”构造仅用于对象,并使用数组上的“for”或“while”或“do while”。我这样说有两个原因,一个是for for循环实际上是可用循环中最慢的循环,其次是为了可读性显而易见的变量类型(你看到“for”或“while”或“do while “循环,你应该能够知道你正在处理一个数组,同样你看到一个”for in“循环,你应该能够知道你正在处理一个对象)。

通常,清除具有相同属性名称的多个条目的一种好方法是使用对象来存储“传感器”对象名称的值,然后检查该对象是否存在相同名称。例如,假设你有对象的数组:通过sensorList现在

var sensorsObj = {}; 

环和检查通过名称每个传感器:

var sensorList = [ //an array of objects 
    {name: 'sensorA', propA: 1, propB: 2}, 
    {name: 'sensorB', propA: 3, propB: 4}, 
    {name: 'sensorC', propA: 5, propB: 6}, 
    {name: 'sensorB', propA: 7, propB: 8}, 
    {name: 'sensorA', propA: 9, propB: 10}, 
    {name: 'sensorD', propA: 11, propB: 12} 
]; 

然后创建一个对象,你可以用它来过滤对现有名称现有的已经或不sensorsObj:

for (var sensor, i = 0, len = sensorList.length; i < len; i++) { 
    sensor = sensorList[i]; 
    if (!sensorsObj[sensor.name]) { 
     sensorsObj[sensor.name] = 1; 
     //we know we have not ran across this name yet, so here we can 
     //create LatLng's, extend bounds, create markers, yada yada yada 
    } 
} 

现在,不知道是什么东西的顺序是你的sensorList,最旧到最新或最新到最旧。如果最早到最新,您可能需要这样做:sensorList = sensorList.reverse();就在“for”循环之前,可以颠倒数组的顺序。实际上,现在我已经说过了,实际上从数组的末尾开始循环会更好(更快):

for (var sensor, i = sensorList.length - 1; i >= 0; i--) { 
+0

这非常有帮助。谢谢。 我对JavaScript很新颖,不知道因为in的速度慢得多,我肯定会做出这样的改变。 – lrich

+0

当我真的(正如您指出的那样)尝试更新标记时,我过于复杂化了,我只需要从下往上工作,忽略重复的传感器名称。这很好。 – lrich