2014-11-24 2 views
1

Кто-нибудь знает, как получить число для количества объектов, присутствующих в векторном слое OL3?Как получить количество векторных элементов внутри векторного слоя в открытых слоях 3

Мой векторный слой определяется следующим образом, я хотел бы знать, сколько элементов он имеет, и, в идеале, сколько в настоящее время оказывается:

var styleCache = {}; 
var WFS_layer_Traffic_Lights = new ol.layer.Vector({ 
source : new ol.source.GeoJSON({ 
    projection : 'EPSG:3857', 
    url : "Vector_Data/Traffic_Lights_Bordeaux.geojson" 
}), 


style : function(feature, resolution) { 

    var path; 
    var x_anchor; 
    var y_anchor;  

    if(resolution < 4){ 
    path = 'Icons/Traffic_Lights_Sign_Icon_Small.png'; 
    x_anchor = 23; 
    y_anchor = 90; 
    } 
    if(resolution >= 4 && resolution < 10){ 
    path = 'Icons/Traffic_Lights_Sign_Small.png'; 
    x_anchor = 16; 
    y_anchor = 16; 
    }  
    if(resolution >= 10){ 
    path = 'Icons/Traffic_Lights_Sign_Tiny.png';   
    x_anchor = 10; 
    y_anchor = 10; 
    } 


    if (!styleCache[path]) { 
     styleCache[path] = [new ol.style.Style({ 
      fill : new ol.style.Fill({ 
       color : 'rgba(255, 255, 255, 0.1)' 
      }), 
      stroke : new ol.style.Stroke({ 
       color : '#319FD3', 
       width : 1 
      }), 
      image: new ol.style.Icon(({ 
        anchor: [x_anchor, y_anchor], 
        anchorXUnits: 'pixels', 
        anchorYUnits: 'pixels', 
        src: path 
       })), 
      text : new ol.style.Text({ 
       font : '12px Calibri,sans-serif', 
       text : "", 
       fill : new ol.style.Fill({ 
        color : '#000' 
       }), 
       stroke : new ol.style.Stroke({ 
        color : '#fff', 
        width : 4 
       }) 
      }), 
      zIndex : 1 
     })]; 
    } 
    return styleCache[path]; 
} 
}); 

ответ

5

После загрузки (GeoJSON) функции вы можете звоните getFeatures на источник вектора, чтобы получить массив со ссылками на функции, включенные в источник вектора. Таким образом, для получения количества функций вы можете использовать следующее:

var featureCount = vectorLayer.getSource().getFeatures().length; 

Как указано выше, для этого необходимо загрузить источник. Если вы передадите опцию url исходному конструктору, источник будет использовать запрос Ajax для загрузки функций. Это происходит асинхронно, что означает, что источник не будет содержать функции после построения.

Вы можете зарегистрировать change слушателя на источник вектора, чтобы знать, когда он загружен:

var vectorSource = vectorLayer.getSource(); 
var listenerKey = vectorSource.on('change', function(e) { 
    if (vectorSource.getState() == 'ready') { 
    var featureCount = vectorSource.getFeatures().length; 
    // ... 
    ol.Observable.unByKey(listenerKey); 
    // use vectorSource.unByKey(listenerKey) instead 
    // if you do use the "master" branch of ol3 
    } 
}); 

EDIT: Я редактировал это изменить от change:state к change в качестве имени события.

+0

Спасибо, вы ответили на два вопроса в одном для меня, потому что мне было интересно, как я собираюсь разобраться с асинхронным характером потока запроса Ajax, как только мне сказали, как получить количество функций. Такой замечательный ответ Хотя мне было интересно ... –

+0

Как уже упоминалось в последней части вопроса, мне было интересно узнать, может ли я получить количество отображаемых элементов? Еще раз спасибо. –

+1

Вы можете использовать 'view.calculateExtent (map.getSize)', чтобы получить текущую длину представления и 'vectorSource.getFeaturesInExtent', чтобы получить возможности для этой цели. Но это не пуленепробино, потому что оно не даст вам правильного результата при повороте представления из-за проблемы в 'calculateExtent' и потому, что, возможно, объекты, которые находятся вне масштаба, но все еще видны на карте (потому что они например, с большими символами). Поэтому используйте это с осторожностью. – erilem

Смежные вопросы