2017-01-24 5 views
0

Мне нужно загрузить некоторые функции в векторном слое и иметь функцию стиля.OL3: Clustering Vector Особенности, когда не удается определить Тип функции

var features = new ol.format.GeoJSON().readFeatures(geojsonStr, { 
    featureProjection: 'EPSG:3857' 
});   

var vectorSource = new ol.source.Vector({ 
    features: features, 
}); 


/* 
var clusterSource = new ol.source.Cluster({ 
    distance: 15, 
    source: vectorSource 
}); 
*/   

var customStyleFunction = function(feature, resolution) { 
    .... 
} 

var vectorLayer = new ol.layer.Vector({ 
    //source: clusterSource, 
    source: vectorSource, 
    style : customStyleFunction 
}); 

map.addLayer(vectorLayer); 

Я не знаю, какую геометрию я буду получать в geojsonStr. Проблема в том, что когда моя коллекция имеет тип «Точка», я могу ее сгруппировать, но с любыми другими типами я не вижу слой ... Как я могу кластерные точки и игнорировать полигоны и линии? или пусть OL3 будет достаточно умен, чтобы решить?

EDIT: Я прочитал https://github.com/openlayers/openlayers/pull/4917

+0

Итак, вы хотите получить все функции и проверить их индивидуально, чтобы добавить их в источник вектора в случае, если они являются Точкой, и полностью игнорировать их, если они что-то еще, не так ли? Или вы хотите сделать что-то еще с другими функциями? – Icarus

+0

Нет. У меня есть строка GeoJSON с FeatureCollection. Пока мы можем предположить, что все геометрии одного типа. Проблема в том, что я должен установить источник, прежде чем я узнаю, какие геометрии у меня есть в коллекции, и не могу определить, могу ли я использовать «clusterSource» или «vectorSource» в моем «vectorLayer». Но .... (не главная проблема) было бы здорово, если бы я мог получить смешанный FeatureCollection и кластер только Точки, оставляющие другие геометрии нетронутыми. –

+0

После прочтения https://github.com/openlayers/openlayers/pull/4917 Я почти там, но все еще не могу условно выбрать 'vectorSource' или' clusterSource' для присоединения к 'vectorLayer'. –

ответ

1

Я бы порекомендовал вам создать 2 разных слоев: один для кластеризации и еще один для общего векторного слоя.

Чтобы решить вашу проблему, вы можете перебрать функции и проверить тип геометрии каждого из них, и добавить его к уже существующему источнику с addFeature способом:

for (var i = 0; i < geojsonFeatures.length; i++) { 
    if (geojsonFeatures[i].getGeometry().getType() === 'Point') { 
     clusterSource.addFeature(geojsonFeatures[i]); 
    } else { 
     vectorSource.addFeature(geojsonFeatures[i]); 
    } 
} 

Я создал jsfiddle, который получает несколько функций от объекта GeoJSON и добавить их в разные источники в зависимости от типа геометрии. Если вы хотите увидеть больше очков в кластере, чтобы убедиться, что он работает правильно, вы также можете использовать прокомментированные строки.

+0

Ты гений! Отличное решение! Работал как шарм. –