0

私はJavaScriptが初めてで、概念を初心者が把握しています.kmlからラベルを取得して画面に表示する関数があります(この関数のクラスタリング部分の一部は、S/Oの誰かによって提供されました)。最初のものを除いて、ロードされたすべての kml に対して完全に機能します。

問題は変数とそのスコープに関係していると確信していますが、私の人生では、どこでどのようにエラーが発生しているのかわかりません。コードを修正すると大きな助けになりますが、私の修正理解する(またはそこに欠けている)ことは、同じくらい役に立ちます。

事前に感謝します

ここにコードがあります

EDIT 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);
4

2 に答える 2

0

同じ問題でこれを見ている人のために、

上記のコードは問題ありません。これが機能しなかった理由は、後で $document.ready() で別の関数を呼び出していて、これが mycluster 変数を調整していたためです。これを見て問題が分からなかった方には大変申し訳ありません。

しかし、上記のコードは正常に動作します

于 2013-06-24T15:23:59.810 に答える
0

まず第一に、あなたが共有したコードのコンテキストで、ラベル変数をグローバル スコープで宣言する利点がわかりません。var label; getLabel 関数からラベルを返しているので、 getLabel 関数の先頭で宣言し、関数からそのローカル変数の値を返すだけでよいと思います 。

第二に、「未定義」が getLabel から返されることを確認できる唯一の方法は、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 = " ";
   }
}
于 2013-06-21T14:55:19.900 に答える