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

Решенные задачи, первая запись - описание решения.
Ответить
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3323
Зарегистрирован: 11 апр 2008, 21:09
Статьи: 33
Проекты: 9
Репутация: 494
Ваше звание: 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
Статьи: 11
Проекты: 2/1
Репутация: 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 ); 
лангольеры под окном жрали время ом-ном-ном

Ответить

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