В настоящее время я работаю над инструментом выбора полигонов в Openlayers 3 и разрабатываю код, размещенный here.Опция выбора многоугольника в Openlayers 3
В приведенном выше примере показан слой с возможностью поиска (в данном случае WFS) с момента загрузки приложения, но поскольку мой слой WFS содержит 80 000+ функций, которые мне нужно выполнить, я пытаюсь адаптировать их так, чтобы WFS слой отображается только после того, как пользователь завершит поиск многоугольника поиска, чтобы уменьшить время загрузки, и показаны только функции в ограничивающей рамке рисованного многоугольника.
Библиотека JSTS затем используется для пространственного пересечения между рисованным многоугольником пользователя и функциями WFS, добавленными к карте.
Код ниже работает нормально, так как он правильно отображает функции WFS в вытянутой области многоугольника, но не возвращает атрибуты (-и) функции в консоли.
Я пытаюсь работать, если это потому, что слой полностью не загружен, прежде чем мы попытаемся вернуть атрибуты функции? Нужно ли включать что-то, чтобы дождаться загрузки слоя до выполнения метода forEachFeatureInExtent?
var myDrawSource = new ol.source.Vector({wrapX: false});
var myDrawVector = new ol.layer.Vector({
source: myDrawSource,
style: new ol.style.Style({
fill: new ol.style.Fill({
color: 'rgba(255, 255, 255, 0.5)'
}),
stroke: new ol.style.Stroke({
color: '#ffcc33',
width: 2
}),
image: new ol.style.Circle({
radius: 7,
fill: new ol.style.Fill({
color: '#ffcc33'
})
})
})
});
var mySelectionsSource = new ol.source.Vector({wrapX: false});
var mySelectionsVector = new ol.layer.Vector({
source: mySelectionsSource,
style: new ol.style.Style({
fill: new ol.style.Fill({
color: 'rgba(255, 0, 0, 0.5)'
}),
stroke: new ol.style.Stroke({
color: 'rgba(255, 0, 0, 1)',
width: 2
}),
image: new ol.style.Circle({
radius: 7,
fill: new ol.style.Fill({
color: '#ffcc33'
})
})
})
});
var map = new ol.Map({
layers: [raster,myDrawVector,mySelectionsVector],
target: 'map',
view: new ol.View({
projection: bng,
resolutions: resolutions,
center: [501776, 167214],
zoom: 5
})
});
var draw = new ol.interaction.Draw({
source: myDrawSource,
type: "Polygon",
});
map.addInteraction(draw);
draw.on('drawend',function(e){
myDrawSource.clear();
mySelectionsSource.clear();
var waterAreasVecSource = new ol.source.Vector({
format: new ol.format.GeoJSON(),
url: function() {
var featuresExtent = e.feature.getGeometry().getExtent();
return '../../geoserver/wfs?service=WFS&' +
'version=1.1.0&request=GetFeature&typename=waterfeature&' +
'outputFormat=application/json&srsname=EPSG:27700&' +
'bbox=' + featuresExtent.join(',') + ',EPSG:27700';
},
strategy: ol.loadingstrategy.tile(ol.tilegrid.createXYZ({
maxZoom: 13
}))
});
var waterAreasVector = new ol.layer.Vector({
source: waterAreasVecSource
});
map.addLayer(waterAreasVector);
var extent = e.feature.getGeometry().getExtent();
var geomA = e.feature.getGeometry();
waterAreasVecSource.forEachFeatureInExtent(extent,function(aa){
console.log("forEachFeatureInExtent",aa.get('name'));
if (polyIntersectsPoly(geomA,aa.getGeometry()) === true){
mySelectionsSource.addFeature(aa);
}
});
});
/**
* check whether the supplied polygons have any spatial interaction
* @{ol.geometry.Polygon} polygeomA
* @{ol.geometry.Polygon} polygeomB
* @returns {Boolean} true||false
*/
function polyIntersectsPoly(polygeomA, polygeomB) {
var geomA = new jsts.io.GeoJSONReader().read(new ol.format.GeoJSON().writeFeatureObject(
new ol.Feature({
geometry: polygeomA
})
)
).geometry;
var geomB = new jsts.io.GeoJSONReader().read(new ol.format.GeoJSON().writeFeatureObject(
new ol.Feature({
geometry: polygeomB
})
)
).geometry;
return geomA.intersects(geomB);
};
Удостоверьтесь, что вы возвращаете атрибуты объектов при загрузке слоя wfs ?. Я использовал 'console.log (« forEachFeatureInExtent », aa.get ('landuse'));' внутри скрипта, который вы предоставляете, и работает отлично. проверьте это здесь http://jsfiddle.net/p_tsagkis/p8qhowy9/7/ – pavlos
Я пытаюсь динамически добавлять слой и задавать степень в текущем виде карты при инициировании взаимодействия с ничьей - да, ваша скрипка работает, но это загружает слой из пуска. Я не могу заставить его работать при добавлении слоя при активации опции draw. – Chris
Я обновил скрипку, чтобы попытаться и в идеале получить то, что мне нужно, где слой загружается по завершении розыгрыша, причем слой с водными областями загружается только до ограниченной протяженности рисованной функции, но вы заметите, что функции не вывод на консоль - нужен ли мне дальнейший шаг? Fiddle здесь http://jsfiddle.net/p8qhowy9/14/ – Chris