3

いくつかのマーカーを含む KML ベクター レイヤーを表示するマップがあります。マーカーをクリックすると、情報ボックスがポップアップ表示されます。ページに渡されたパラメーターに基づいて、情報ボックスを自動的にポップアップできるようにしたいと考えています。getFeaturesByAttribute() を使用して名前を見つける必要があると思いますが、機能配列は常に空のようです。(FireBugだと中身は見えますが)

配列内の項目を取得するにはどうすればよいですか?

コード:

function init()
{
        var options = {
            projection: new OpenLayers.Projection("EPSG:900913"),
            displayProjection: new OpenLayers.Projection("EPSG:4326"),
            units: "m",
        };
        map = new OpenLayers.Map('map', options);
        var mapnik = new OpenLayers.Layer.OSM("OpenStreetMap");
        var gmap = new OpenLayers.Layer.Google("Google", {sphericalMercator:true});
        var gsat = new OpenLayers.Layer.Google(
            "Google Satellite",
            {type: google.maps.MapTypeId.SATELLITE, numZoomLevels: 22}
        );

        groups = new OpenLayers.Layer.Vector("Groups", {
            projection: map.displayProjection,
            strategies: [new OpenLayers.Strategy.Fixed()],
            protocol: new OpenLayers.Protocol.HTTP({
                url: "http://maps.google.co.uk/maps/ms?msa=0&msid=210450558816094618535.0004bd79ceb30e9acb9da&output=kml",
                format: new OpenLayers.Format.KML({
                    extractStyles: true,
                    extractAttributes: true
                })
            })
        });

        map.addLayers([mapnik, gmap, gsat, groups]);

        select = new OpenLayers.Control.SelectFeature(groups);

        groups.events.on({
            "featureselected": onFeatureSelect,
            "featureunselected": onFeatureUnselect
        });

        map.addControl(select);
        select.activate();   

        map.addControl(new OpenLayers.Control.LayerSwitcher());

        var center = new OpenLayers.LonLat(-2.58789,51.52283).transform(map.displayProjection, map.projection);
        var zoom = 12
        map.setCenter(center, zoom);

        alert(groups.features.length);   // is always 0

    }
4

1 に答える 1

2

この問題は、レイヤーの機能を設定するために HTTP 呼び出しが非同期で行われていることが原因だと思います。したがって、HTTP 呼び出しが返される前に alert(groups.features.length) をヒットしているため、レイヤーには機能がないため、groups.features.length は正しく 0 です。この方法で機能の数を表示する必要がある場合は、 HTTP イベントが返された後に呼び出されるレイヤーの loadend イベントに関数をアタッチすると、すべての機能を調べることができます。

于 2012-04-17T18:29:08.910 に答える