2017-08-28 47 views
1

此代码地址解析从JavaScript对象数据,并将其工作正常:如何将外部值添加到Leaflet地理编码查询?

var queryAddr = [{"location":"London, UK", "size":10},{"location":"Chelmsford, UK","size":160}]; 

geocoder = new L.Control.Geocoder.Nominatim(); 
for (i = 0; i < queryAddr.length; i++) { 
    var yourQuery = queryAddr[i]["location"]; 
    geocoder.geocode(yourQuery, function(results) {  
    x_coor = results[0].center.lng; 
    y_coor = results[0].center.lat; 
    L.circleMarker([y_coor, x_coor]).addTo(map); 
    }); 
} 

但是如果我想使用circleMarker半径选项添加大小值?我试过这样做,但它说价值是未定义的。

geocoder = new L.Control.Geocoder.Nominatim(); 
for (i = 0; i < queryAddr.length; i++) { 
    var yourQuery = queryAddr[i]["location"]; 
    geocoder.geocode(yourQuery, function(results) {  
    x_coor = results[0].center.lng; 
    y_coor = results[0].center.lat; 
    circleSize = queryAddr[i]["size"]; 
    L.circleMarker([y_coor, x_coor], {radius: circleSize}).addTo(map); 
    }); 
} 

回答

0

您不能从回调函数内部访问外部范围。 所以queryAddr是不可见的这行:

circleSize = queryAddr[i]["size"];

所以移动地理编码器外呼,并使用地图遍历地址项

这样的:

geocoder = new L.Control.Geocoder.Nominatim(); 
 

 
queryAddr.map(function(itemAddr) { 
 
    geocoder.geocode(itemAddr["location"], function(results) {  
 
    x_coor = results[0].center.lng; 
 
    y_coor = results[0].center.lat; 
 
    L.circleMarker([y_coor, x_coor], {radius: itemAddr["size]}).addTo(map); 
 
    }); 
 
});

+0

当我这样做时,160返回两次,所以2个圈最终变成相同的大小。似乎只是获得最后的价值。 – nvixto

+0

对,这是在循环结束后会完成的异步调用。我重写了一个适当的地图处理,而不是FOR循环,这更适合这种类型的动作 –

+0

这完美的作品! – nvixto