我是JavaScript的新手,我对这些概念很熟悉。我有一个函数,可以从kml中获取标签并将其显示在屏幕上(这个函数的一些集群部分是由S/O上的某个人提供的)。它完全适用于除第一个外加载的所有kml。
我确信这个问题与变量及其范围有关,但在我的一生中,我看不出我在哪里或如何出现错误,我对代码的更正将是一个很大的帮助,但对我的理解(或缺乏理解)的更正也同样有帮助。
非常感谢先进的
这是代码
编辑1) 我对函数getlabel进行了多次更改,这些更改仅在下面显示的第一个ajax调用之外加载的kml上可见。我一辈子都不明白为什么会发生这种事。这可能是一个上下文问题,但这超出了我对主题的理解
var tripid=1;
var myStyles;
var cfarmerid;
var navigate=true;
var edit=false;
var vectors;
var polyControl;
var bound=false;
var mycluster;
var label=" ";
$(document).ready(function(){
$.ajax({
type: "POST",url: "temp.php",dataType: "json",
error: function(e){
alert('Error: '+e);
},
success: function (data) {
if(data[0]==="not"){
window.location = "http://www.g4ema.com/index.html";
}
maxlat=data[0];
maxlon=data[1];
minlat=data[2];
minlon=data[3];
tripid=parseInt(data[4]);
var bbox=new OpenLayers.Bounds();
bbox.extend(new OpenLayers.LonLat(minlon,minlat));
bbox.extend(new OpenLayers.LonLat(maxlat,maxlon));
bbox.toBBOX();
map = new OpenLayers.Map("map");
//var layer= new OpenLayers.Layer.OSM();
mycluster = new OpenLayers.Strategy.Cluster(
{
threshold: 2, // single clusters are shown as features
shouldCluster: function(cluster, feature)
{
if (feature.geometry.CLASS_NAME === "OpenLayers.Geometry.Point" &&
cluster.cluster[0].geometry.CLASS_NAME === "OpenLayers.Geometry.Point") {
return OpenLayers.Strategy.Cluster.prototype.shouldCluster.apply(this, arguments);
} else {
return false;
}
}
});
var layer = new OpenLayers.Layer.Google(
"Google Hybrid",
{type: google.maps.MapTypeId.HYBRID, numZoomLevels: 20});
layer.wrapDateLine=false;
map.addLayer(layer);
myStyles = new OpenLayers.StyleMap({
"default": new OpenLayers.Style({
strokeColor: "#00ffff",
strokeWidth:5,
strokeOpacity:1,
fillColor:"#003399",
fillOpacity: 1,
labelYOffset: 15,
pointRadius: 4,
label:"${getLabel}",
fontColor:"#ff0000"
}, {
context: {
getLabel: function (f) {
label=" ";
if (f.cluster) { // is a cluster
if (f.cluster[0].attributes.label!==" ") {
label= " " + f.attributes.count + " " +
f.cluster[0].attributes.label;
} else {
label= " " ;//+ f.attributes.count + "init";
}
} else { // is not cluster
if (f.attributes.label!==" ") {
label= " " + f.attributes.label;
}else{
label=" ";
}
}
if(!label){label=" ";}
return label;
}
}
})
});
kmlLayer = new OpenLayers.Layer.Vector("Trip", {
styleMap: myStyles,
projection: map.displayProjection,
strategies: [new OpenLayers.Strategy.Fixed(),mycluster],
protocol: new OpenLayers.Protocol.HTTP({
params:{ tripid:tripid},
url: "kml2.php",
readWithPOST:true,
//{userid:userid,tripid:tripid},
format: new OpenLayers.Format.KML({
extractStyles: true,
extractAttributes: true
})
})
});
map.addLayer(kmlLayer);
var clat=(parseFloat(minlat)+parseFloat(maxlat))/2;
var clon=(parseFloat(minlon)+parseFloat(maxlon))/2;
var lonlat = new OpenLayers.LonLat(clon,clat).transform(new OpenLayers.Projection("EPSG:4326"),new OpenLayers.Projection("EPSG:900913"));
map.setCenter(lonlat);
map.zoomTo(15);
首先,我看不出在您共享的代码的上下文中声明具有全局作用域的标签变量有什么好处。既然您从getLabel函数返回一个标签,那么我认为您应该在getLabel函数的顶部声明var label;
,并从该函数返回该局部变量的值。
其次,我可以看到从getLabel返回"undefined"的唯一方法是如果f.attributes.label
是未定义的。我会尝试一个代码块,比如:
} else { // is not cluster
if (f.attributes.label != null && typeof(f.attributes.label != "undefined") {
// if (f.attributes.label) { // alternate simpler if statement
label= " " + f.attributes.label;
} else {
label = " ";
}
}
对于任何有同样问题的人,
上面的代码是完美的,这不起作用的原因是我稍后在$document.ready()中调用了另一个函数,这是在细化mycluster变量。我很抱歉那些你看了这个却看不出问题的人。
但是上面的代码将工作FINE