2013-06-20 5 views
0

JavaScript에 익숙하지 않고 개념에 초보자가 있습니다. kml에서 레이블을 가져 와서 화면에 표시하는 함수가 있습니다 (이 함수의 클러스터링 부분 중 일부는 S/O에있는 사람이 제공). 첫 번째 점을 제외하고는로드 된 모든 kml에 대해 완벽하게 작동합니다.함수는 처음 실행될 때 스크립트가 실행되지 않습니다.

나는이 문제가 변수와 그 범위와 관련이 있다고 확신하지만 나에게 내가 오류를 얻고있는 곳이나 방법을 볼 수 없기 때문에 코드 수정이 큰 도움이 될 것이다. 그러나 도움이되는 것처럼 나의 이해 (또는 거기에서 부족한)에 대한 수정. 여기

adavance

에서

많은 감사는 코드를입니다

편집 1) 나는 함수가 여러 번 getlabel 변경됩니다 있고 변경 사항이 그림에 표시된 첫 번째 아약스 전화의 외부에 장착 된 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); 

답변

0

최초의 나의 이해를 넘어, 내가 코드 당신 '의 맥락에서 전역 범위와 라벨의 변수를 선언의 장점을 볼 수 없습니다 봤어요. getLabel 함수에서 레이블을 반환하기 때문에 getLabel 함수의 맨 위에 var label;을 선언하고 해당 지역 변수의 값을 함수에서 반환해야한다고 생각합니다.

둘째로,이 정의되지 않은 경우 getLabel에서 "undefined"가 반환된다는 것을 알 수있는 유일한 방법입니다. 이것이 작동하지 않는 이유는 내가 나중에 다른 함수를 호출 한 것입니다

위의 코드는 흠이있다, 같은 문제로이를 찾고있는 사람들을위한

} 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 = " "; 
    } 
} 
+0

는 당신에게 당신이 문제가 해결되지 않았 음을하지만 의견을 주셔서 대단히 감사합니다 잘 작동합니다, 모든 것은 나를 정말 이길 수있다! –

+0

지난 2 일 동안이 문제를 조사해 본 결과 문제가 기능이 아니라 문제가 발생했습니다. –

0

: 나는 같은 코드 블록을 시도 할 것 $ document.ready() 그리고 이것은 mycluster 변수를 수정하고 있습니다. 나는 당신이 이것을보고 문제를 볼 수 없었던 사람들에게 매우 유감입니다.

하지만 위의 코드

관련 문제