2014-11-24 2 views
1

OL3 벡터 레이어에있는 피쳐의 수를 계산하는 방법을 아는 사람이 있습니까?열린 레이어에서 벡터 레이어의 벡터 요소 수를 얻는 방법 3

다음과 같이 내 벡터 레이어가 정의

, 나는 현재 렌더링되는 얼마나 많은 이상적으로는 얼마나 많은 요소를 알고, 그리고 것 다음 (GeoJSON) 기능이로드되면

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

당신이 할 수있는 벡터 소스에 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 
    } 
}); 

편집 :이 이벤트 이름으로 changechange:state에서 변경 편집.

+0

Ajax 요청 스레드의 비동기 특성을 처리하기 위해 어떻게 기능 수를 얻었는지 말한 후에 궁금해하기 때문에 저에게도 두 가지 질문에 답변 해 주셔서 감사합니다. 훌륭한 대답 비록 내가 궁금해하고 있었지만 ... –

+0

질문의 마지막 부분에서 언급했듯이 렌더링 된 요소의 수를 얻을 수 있는지 궁금합니다. 다시 한번 감사드립니다. –

+1

'view.calculateExtent (map.getSize)'를 사용하여 현재 뷰 범위를 가져오고'vectorSource.getFeaturesInExtent'를 사용하여 해당 범위의 피쳐를 가져올 수 있습니다. 하지만 이것은 방탄하지 않습니다. 왜냐하면'calculateExtent'의 문제로 인해 뷰가 회전 될 때 올바른 결과를 얻지 못할 것이고 범위 밖에 있지만지도에 계속 표시되는 기능이있을 수 있습니다 (왜냐하면 예를 들어 큰 기호로 표시). 따라서주의해서 사용하십시오. – erilem