Если в проекте используется большое число слоев (несколько десятков), то процесс создания соответствующих объектов - довольно утомительное занятие. Другими словами, если ваш проект предполагает 50 слоёв, то для каждого из них нужно написать что-то вроде:
Код: Выделить всё
layerN = new OpenLayers.Layer.Vector("Description of layerN", {
strategies: [new OpenLayers.Strategy.Fixed(), new OpenLayers.Strategy.Save()],
visibility: false,
protocol: new OpenLayers.Protocol.WFS(OpenLayers.Util.applyDefaults({featureType: "layerN"},defaultWFSProperty))
});
layerN+1 = new OpenLayers.Layer.Vector("Description of layerN+1", {
strategies: [new OpenLayers.Strategy.Fixed(), new OpenLayers.Strategy.Save()],
visibility: false,
protocol: new OpenLayers.Protocol.WFS(OpenLayers.Util.applyDefaults({featureType: "layerN+1"},defaultWFSProperty))
});
...
Данный процесс можно автоматизировать, используя ответ WFS-сервера на запрос GetCapabilities, содержащий информацию о доступных на сервере слоях и прочую служебную информацию. Фрагмент ответа GetCapabilities:
Код: Выделить всё
<FeatureType xmlns:rk="http://hostname/sf">
<Name>rk:monastery</Name>
<Title>monastery</Title>
<Abstract>Монастыри</Abstract>
<DefaultSRS>urn:ogc:def:crs:EPSG::4326</DefaultSRS>
<Operations>
<Operation>Insert</Operation>
<Operation>Update</Operation>
<Operation>Delete</Operation>
</Operations>
<ows:WGS84BoundingBox> <ows:LowerCorner>39.520843 56.937698</ows:LowerCorner> <ows:UpperCorner>39.161984 57.267146</ows:UpperCorner> </ows:WGS84BoundingBox>
</FeatureType>
В этом случае процедура создания объектов OpenLayers.Layer значительно сократится и будет выглядеть так:
Код: Выделить всё
function createOverlays(mapObject){
var WFSLayerList;
var defaultWFSProperty = {
url: "http://hostname/tinyows.cgi?",
featureNS: "http://hostname/sf",
geometryName: "wkb_geometry"
};
OpenLayers.Request.GET({
url: defaultWFSProperty.url+'SERVICE=WFS&REQUEST=GetCapabilities',
async: false,
success: function(e) {
WFSLayerList = new OpenLayers.Format.WFSCapabilities().read(e.responseText);
}
});
WFSLayerList.featureTypeList.featureTypes.forEach(function(l) {
window[l.name] = new OpenLayers.Layer.Vector(l.abstract, {
strategies: [new OpenLayers.Strategy.Fixed(), new OpenLayers.Strategy.Save()],
visibility: false,
protocol: new OpenLayers.Protocol.WFS(OpenLayers.Util.applyDefaults({featureType: l.name}, defaultWFSProperty))
});
mapObject.addLayer(window[l.name]);
});
}
В приведенном фрагменте нужно отметить 2 важные особенности:
1. Запрос выполняется синхронно, то есть пока не будет получен ответ от сервера следующие инструкции не будут исполнены;
2. Конструкция вида window[l.name] создает глобальную переменную с именем l.name.