OpenLayers: автоматическое создание слоёв

Решенные задачи, первая запись - описание решения.
Ответить
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

OpenLayers: автоматическое создание слоёв

Сообщение Denis Rykov » 05 май 2011, 07:42

Рассмотрим пример автоматического создания WFS слоев на основе ответа GetCapabilities WFS-сервера.

Если в проекте используется большое число слоев (несколько десятков), то процесс создания соответствующих объектов - довольно утомительное занятие. Другими словами, если ваш проект предполагает 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.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

JavaScript и динамическое создание переменных

Сообщение Mavka » 05 май 2011, 09:25

Немного поясню про создание переменных. В контексте js все глобальные переменные

Код: Выделить всё

<script type="text/javascript">
	var myVar;
</script>
являются элементами ассоциативного массива window. К ним можно обращаться как:

Код: Выделить всё

myVar = 1
alert(window.myVar);
alert(window['myVar']); 
Так как ключи ассоциативного массива являются строками, то динамически создать переменную с нужным именем можно так:

Код: Выделить всё

// вариант 1
window['newVar1'] = 1;
// вариант 2
text = 'newVar2';
window[text] = 2;
// Результат = 3
alert( newVar1 + newVar2 ); 
лангольеры под окном жрали время ом-ном-ном

Ответить

Вернуться в «Рецепты»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость