2

その機能の 1 つは、OpenLayers を使用して関連する会場を示すビジュアル マップである (イベント チケットを見つけるための) 対話型検索エンジンを作成しようとしています。フィルター処理されたサブセクションを選択的に表示したい kml ファイルに多数の会場 (3000 以上) があります。以下は私が持っているコードですが、実行しようとすると JavaScript エラーが発生します。firebug および chrome 開発者ツールを実行すると、変数が null であると表示されるため、指定したパラメーターが渡されていないと思います。しかし、なぜ合格しないのかわかりません。どんな洞察も大歓迎です。

var map, drawControls, selectControl, selectedFeature, select;
$('#kml').load('venuesComplete.kml');
kml=$('#kml').html();
function showVenues(state, city, venue){
    filterStrategy = new OpenLayers.Strategy.Filter({});
    var kmllayer = new OpenLayers.Layer.Vector("KML", {
    strategies: [filterStrategy,
        new OpenLayers.Strategy.Fixed()],
    protocol: new OpenLayers.Protocol.HTTP({
        url: "venuesComplete.kml",
        format: new OpenLayers.Format.KML({
        extractStyles: true,
        extractAttributes: true
        })
    })
    });
    select = new OpenLayers.Control.SelectFeature(kmllayer);
    kmllayer.events.on({
        "featureselected": onFeatureSelect,
        "featureunselected": onFeatureUnselect
    });
    map.addControl(select);
    select.activate();
    filter = new OpenLayers.Filter.Comparison({
        type: OpenLayers.Filter.Comparison.LIKE,
        property: "",
        value: ""
    });
    function clearFilter(){
        filterStrategy.setFilter(null);
    }
    function setFilter(property, value){
        filter.value = value;
        filter.property = property;
        filterStrategy.setFilter(filter);
    }
    var vector_style = new OpenLayers.Style();
    if(venue!=""){
        setFilter('name', venue);
    }else if(city!=""){
        setFilter('description', city);
    }else if(state!=""){
        setFilter('description', state);
    }
    map.addLayer(kmllayer);
    function onPopupClose(evt) {
        select.unselectAll();
    }
    function onFeatureSelect(event) {
        var feature = event.feature;
        var selectedFeature = feature;
        var popup = new OpenLayers.Popup.FramedCloud("chicken", 
            feature.geometry.getBounds().getCenterLonLat(),
            new OpenLayers.Size(100,100),
            "<h2>"+feature.attributes.name + "</h2>" + feature.attributes.description +'<br>'+feature.attributes, 
            null, 
            true, 
            onPopupClose
        );
        document.getElementById('venueName').value=feature.attributes.name;
        document.getElementById("output").innerHTML=event.feature.id;
        feature.popup = popup;
        map.addPopup(popup);
    }
    function onFeatureUnselect(event) {
        var feature = event.feature;
        if(feature.popup) {
            map.removePopup(feature.popup);
            feature.popup.destroy();
            delete feature.popup;
        }
    }
}
function init() {
    map = new OpenLayers.Map('map');
    var google_map_layer = new OpenLayers.Layer.Google(
        'Google Map Layer',
        {type: google.maps.MapTypeId.HYBRID}
    );
    map.addLayer(google_map_layer);
    state="";
    state+=document.getElementById('stateProvDesc').value;
    city="";
    city+=document.getElementById('cityZip').value;
    venue="";
    venue+=document.getElementById('venueName').value;
    showVenues(state,city,'Michie Stadium');
    map.addControl(new OpenLayers.Control.LayerSwitcher({}));
    map.zoomToMaxExtent();

}
4

1 に答える 1

0

私の理解が正しければ、あなたの kml は適切にロードされません。そうでない場合は、私の答えを考慮してください。

kml レイヤーが正しく読み込まれたかどうかを確認することは非常に重要です。複数の動的(phpから)kmlレイヤーをロードするマップがあり、大きなレイヤーがロードされないことは珍しくありません。その場合、操作は中止されますが、openlayers に関する限り、レイヤーは適切にロードされています。

だから私は2つのことをします:ロードされたデータの量が元のphp kmlパーサーで予想される機能の数を満たしているかどうかを確認し(jqueryまたはajax呼び出しを使用します)、矛盾がある場合はリロードを試みます(これはループなので、無限にループしないように 5 回に制限します)。

ここで私のコードのいくつかをチェックしてください

于 2012-08-01T13:37:40.200 に答える