2013-10-21 1 views
0

동적 인 콘텐츠로 Google InfoWindow를 채우는 데 어려움을 겪고 있습니다. 내 계획은 많은 마커 (60 개)를로드하고 각 마커에 클릭 이벤트 처리기를 첨부하는 것입니다. 각 마커를 클릭하면 고유 한 ID 열을 기반으로 융합 테이블에서 해당 데이터를 가져 오려고합니다. 간단히 말해서 각 마커는 서로 다른 데이터를 가지고 있습니다. 두 마커는 각각의 infowWindow에로드 된 동일한 데이터 세트를 갖지 않습니다. 나는 클로저에 대해 읽었지만,이 개념을이 문제에 정확하게 적용하는 것처럼 보이지 않아서 여기에서 제안을 찾고있다.동적으로 여러 마커로 정보창을 채우는 중

  var markers = new Array(); 
      infoWindow = new google.maps.InfoWindow(); 


      function getBeachLocations() { 
       // construct query 
       var queryURL = "https://www.googleapis.com/fusiontables/v1/query?sql="; 
       var queryTail = "&key=apiKey=?"; 
       var query = "SELECT * FROM beachLocationTable"; // beach locations tbl 
       var queryText = encodeURI(query); 

       $.ajax({ 
        type: "GET", 
        url: queryURL + queryText + queryTail, 
        cache: false, 
        dataType: 'jsonp', 
        success: createMarkers, 
        error: function() { 
         alert("Sorry, no spatial data is available at this time, please check back on a later date."); 
        } 

       }); 
      } //end getBeachLocations 


      function createMarkers(data) { 



       url = "swim.jpg"; 
       var rows = data['rows']; 


       for (var m in rows) { 

        var ecoli_array = new Array(); 
        var marker = new google.maps.Marker({ 
         map: map, 
         icon: new google.maps.MarkerImage(url), 
         beach_id: rows[m][0], 
         beach_name: rows[m][1], 
         beach_region: rows[m][2], 
         position: new google.maps.LatLng(rows[m][4], rows[m][5]), 
         idx: m, 
         getEcoliData: function() { 

          var obj; 

          var ecoli_rows_str = ""; 

          obj = getEcoliData(marker.beach_id); 

          obj.success(function (data) { 
           var rows; 
           rows = data['rows']; 
          }); 
          for (var i = 0; i < rows.length; i++) { 
           console.log(rows[i]); 
           ecoli_rows_str += '<tr><td>' + rows[i][2] + '</td><td>' + rows[i][3] + '</td><td>' + rows[i][4] + '</td></tr>'; 
          } 
          return ecoli_rows_str; 
         } // end getEcoliData 
        });    // end marker 

        google.maps.event.addListener(marker, 'click', (function (marker) { 
         return function() { 
          infoWindow.setContent("ID is " + this.beach_id + "</br>Beach Name is: " + this.getEcoliData()); 
          infoWindow.open(map, this); 
         } 
        })(marker)); 

       } // end for loop 

      } //end function createMarkers 


      function getEcoliData(beach_id) { 
       console.log(beach_id); 
       var rows; 

       var queryURL = "https://www.googleapis.com/fusiontables/v1/query?sql="; 
       var queryTail = '&key=apiKey=?'; 
       var whereClause = "WHERE 'Beach_ID' = " + beach_id; 
       var query = "SELECT * FROM ecoliTable " 
       + whereClause + " ORDER BY 'Sample_Date' DESC"; 


       var queryText = encodeURI(query); 

       var ecoli_array = new Array(); 

       return $.ajax({ 
        type: "GET", 
        url: queryURL + queryText + queryTail, 
        cache: false, 
        dataType: 'jsonp' 

       }); 
      } 


      // create beach locations dropdown 
      function createDropDownMenu() { 
       var query = 'SELECT Beach_Location, COUNT() FROM beachLocationTable GROUP BY Beach_Location ORDER BY Beach_Location ASC'; 

       var queryText = encodeURIComponent(query); 
       var gvizQuery = new google.visualization.Query(
               'http://www.google.com/fusiontables/gvizdata?tq=' + queryText); 

       //Send query and draw table with data in response 
       gvizQuery.send(function (response) { 
        var numRows = response.getDataTable().getNumberOfRows(); 
        var numCols = response.getDataTable().getNumberOfColumns(); 

        var name = ['<label style="font-weight:bolder;font-size:16px"> Select a Beach:</label><select id="beach_menu" style="font-size:16px;" onchange="select_beach(this.options[this.selectedIndex].value);"><option class="defaultopt" value="">--All--</option>']; 

        for (var i = 0; i < numRows; i++) { 
         var nameValue = response.getDataTable().getValue(i, 0); 

         name.push("<option value=" + "'" + nameValue + "'" + ">" + nameValue + "</option>"); 

        } 
        name.push('</select>'); 

        document.getElementById('beach_location_dropdown').innerHTML = name.join(''); 
       }); 

      } // end createDropDownMenu Function 

      /* start map initialization */ 
      function initialize() { 


       // map 
       latlng = new google.maps.LatLng(49.894634, -97.119141); 
       var myOptions = { 
        center: latlng, 
        zoom: 7, 
        mapTypeId: google.maps.MapTypeId.ROADMAP, 
        zoomControlOptions: { 
         style: google.maps.ZoomControlStyle.SMALL 
        }, 
        mapTypeControl: true, 
        mapTypeControlOptions: { 
         mapTypeIds: [ 
                 google.maps.MapTypeId.ROADMAP, 
                 google.maps.MapTypeId.SATELLITE, 
                 google.maps.MapTypeId.HYBRID, 
                 google.maps.MapTypeId.TERRAIN 
                ], 

         style: google.maps.MapTypeControlStyle.DROPDOWN_MENU 
        }, 
        overviewMapControl: true, 
        overviewMapControlOptions: { 
         opened: true 
        } 
       }; 

       map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 


       // invocation begins here 
       createDropDownMenu(); // not working now. 
       getBeachLocations(); 




       // legend 
       map.controls[google.maps.ControlPosition.RIGHT_BOTTOM].push(
        document.getElementById('legend')); 

       var legend = document.getElementById('legend'); 
       var swim_icon = "swim.jpg"; 


       var div = document.createElement('div'); 
       div.innerHTML = '<h4>Features</h4>' + 
               '<br/><img src="' + swim_icon + '"> ' + "Beaches"; 
       legend.appendChild(div); 

      } // end initialization function 
+0

사용중인 퓨전 테이블이란 무엇입니까? 그것은 어떻게 생겼습니까? – geocodezip

+0

왜 FusionTableLayer를 사용하지 않습니까? 템플릿을 통해 InfoWindow의 내용을 정의 할 수 있습니까? –

+0

필자는 융합 테이블 레이어를 사용하지 않은 마커에 사용자 지정 아이콘 이미지를 사용해야했습니다. 데이터를 쿼리하는 세 개의 테이블이 있습니다. 하나의 표에는 표식과 ID 열에 대한 좌표가 들어 있습니다. 그런 다음이 ID 열을 사용하여 다른 두 테이블을 쿼리합니다. 필요한 경우 테이블 정의를 제공 할 수 있습니다. – Michael

답변

0

FusionTables 인터페이스를 사용하여 테이블에 가입하는 것이 가장 좋습니다.

퓨전 테이블에서 "파일"메뉴를 사용하고 "병합 할 표 찾기"를 선택하십시오.

마지막으로 최종 결과는 단일 쿼리로 정보 창에 배치 할 수있는 3 개의 데이터를 모두 포함하는 단일 테이블이어야합니다.

도움이 되었기를 바랍니다.

0

게시물에 기여한 모든 분들께 감사드립니다. 그것이 단순한 것으로 밝혀 졌을 때 결과를 포기하는 잘못된 테이블을 쿼리했습니다. 나는 infoWindow에 적절한 내용을 가져올 수있었습니다. 이제 배열이 비어 있거나 null 또는 undefined 인 경우 infoWindow에서 사용자에게 메시지를 표시하는 가장 좋은 방법을 결정해야합니다. 다음과 같이 충분합니까? [코드]

(대해서 typeof 행 == '미정의') { rows_str가 = '

유감없이 ecoli 데이터가 현재이 비치 있으면

.

' } 다른 {// 문자열 열 행 데이터}

[/ 코드]

은 언제나 여기에 어떤 suggeestions 크게 감사합니다를 추가합니다. 건배, 마이클

관련 문제