0

Google InfoWindows に動的コンテンツを入力するのに苦労しています。私の計画は、多くのマーカー (60 個) をロードし、それぞれにクリック イベント ハンドラーをアタッチすることです。各マーカーがクリックされると、一意の ID 列に基づいて融合テーブルから対応するデータを取得したいと考えています。つまり、各マーカーには異なるデータが関連付けられており、2 つのマーカーが同じデータセットをそれぞれの 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
4

2 に答える 2

0

投稿に貢献してくれたすべての人に感謝します。単純なものであることが判明したため、結果をスローしていた誤ったテーブルをクエリしていました。適切なコンテンツを infoWindow に取り込むことができました。次に、配列が空、null、または未定義の場合に、infoWindow でユーザーにメッセージを表示する最善の方法を決定する必要があります。以下で十分でしょうか?[コード]

if (行の種類 == '未定義' ) {row_str = '

申し訳ありませんが、現在このビーチのエコリ データはありません。

' } else { //列の行データを文字列に追加 }

[/コード]

いつものように、ここでの提案は大歓迎です。乾杯、マイケル

于 2013-10-22T17:01:34.787 に答える
0

FusionTables インターフェイスを使用してテーブルを結合すると、最適なサービスが得られる場合があります。

FusionTables で [ファイル] メニューを使用し、[結合するテーブルを検索] を選択します。

最後に、最終結果は、3 つすべてのデータを含む単一のテーブルになるはずです。これは、単一のクエリで情報ウィンドウに配置できます。

それが役立つことを願っています。

于 2013-10-22T15:04:12.613 に答える