2

我正在尝试创建一个交互式搜索引擎(用于查找活动门票),其中一个功能是使用 OpenLayers 显示相关场地的可视化地图。我在一个 kml 文件中有大量场地(3000+),我想选择性地显示一个过滤的小节。下面是我的代码,但是当我尝试运行它时出现 JavaScript 错误。运行 firebug 和 chrome 开发人员工具让我认为它没有传递我提供的参数,因为它说变量为空。但是,我无法弄清楚为什么他们没有通过。非常感谢任何见解。

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 而言,该层已正确加载。

所以我做了两件事:我检查加载的数据量是否符合我的原始 php kml 解析器中的预期功能数量(我为此使用 jquery 或 ajax 调用),然后,如果有差异,我尝试重新加载(由于这是一个循环,我将其限制为 5 次尝试,以免无限循环)。

在这里查看我的一些代码

于 2012-08-01T13:37:40.200 回答