【问题标题】:Filtering a loaded kml file in OpenLayers在 OpenLayers 中过滤加载的 kml 文件
【发布时间】:2012-06-25 20:31:22
【问题描述】:

我正在尝试创建一个交互式搜索引擎(用于查找活动门票),其中一个功能是使用 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();

}

【问题讨论】:

    标签: filter openlayers kml


    【解决方案1】:

    如果我理解正确,您的 kml 加载不正确。如果不是这种情况,请不要考虑我的回答。

    检查您的 kml 层是否正确加载非常重要。我有一个加载多个动态(来自 php)kml 图层的地图,并且有一个大图层根本不加载并不罕见。发生这种情况时,操作将中止,但就 openlayers 而言,图层已正确加载。

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

    查看我的一些代码here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      相关资源
      最近更新 更多