Adding some serious enhancements to the WMC format. With this, OL map and layer objects can be created from WMC context objects and vice versa. Thanks for the great patch bbinet. r=me (closes #2251)
git-svn-id: http://svn.openlayers.org/trunk/openlayers@9733 dc9f47b5-9b13-0410-9fdd-eb0c1a62fdaf
This commit is contained in:
+152
-172
@@ -157,7 +157,8 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
* Method: read_wmc_LayerList
|
||||
*/
|
||||
read_wmc_LayerList: function(context, node) {
|
||||
context.layers = [];
|
||||
// layersContext is an array containing info for each layer
|
||||
context.layersContext = [];
|
||||
this.runChildNodes(context, node);
|
||||
},
|
||||
|
||||
@@ -165,47 +166,16 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
* Method: read_wmc_Layer
|
||||
*/
|
||||
read_wmc_Layer: function(context, node) {
|
||||
var layerInfo = {
|
||||
params: this.layerParams || {},
|
||||
options: {
|
||||
visibility: (node.getAttribute("hidden") != "1"),
|
||||
queryable: (node.getAttribute("queryable") == "1")
|
||||
|
||||
},
|
||||
var layerContext = {
|
||||
visibility: (node.getAttribute("hidden") != "1"),
|
||||
queryable: (node.getAttribute("queryable") == "1"),
|
||||
formats: [],
|
||||
styles: []
|
||||
};
|
||||
this.runChildNodes(layerInfo, node);
|
||||
|
||||
this.runChildNodes(layerContext, node);
|
||||
// set properties common to multiple objects on layer options/params
|
||||
layerInfo.params.layers = layerInfo.name;
|
||||
layerInfo.options.maxExtent = layerInfo.maxExtent;
|
||||
// create the layer
|
||||
var layer = this.getLayerFromInfo(layerInfo);
|
||||
context.layers.push(layer);
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: getLayerFromInfo
|
||||
* Create a WMS layer from a layerInfo object.
|
||||
*
|
||||
* Parameters:
|
||||
* layerInfo - {Object} An object representing a WMS layer.
|
||||
*
|
||||
* Returns:
|
||||
* {<OpenLayers.Layer.WMS>} A WMS layer.
|
||||
*/
|
||||
getLayerFromInfo: function(layerInfo) {
|
||||
var options = layerInfo.options;
|
||||
if (this.layerOptions) {
|
||||
OpenLayers.Util.applyDefaults(options, this.layerOptions);
|
||||
}
|
||||
var layer = new OpenLayers.Layer.WMS(
|
||||
layerInfo.title,
|
||||
layerInfo.href,
|
||||
layerInfo.params,
|
||||
options
|
||||
);
|
||||
return layer;
|
||||
context.layersContext.push(layerContext);
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -218,8 +188,8 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
/**
|
||||
* Method: read_ol_units
|
||||
*/
|
||||
read_ol_units: function(layerInfo, node) {
|
||||
layerInfo.options.units = this.getChildValue(node);
|
||||
read_ol_units: function(layerContext, node) {
|
||||
layerContext.units = this.getChildValue(node);
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -236,100 +206,95 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
/**
|
||||
* Method: read_ol_transparent
|
||||
*/
|
||||
read_ol_transparent: function(layerInfo, node) {
|
||||
layerInfo.params.transparent = this.getChildValue(node);
|
||||
read_ol_transparent: function(layerContext, node) {
|
||||
layerContext.transparent = this.getChildValue(node);
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: read_ol_numZoomLevels
|
||||
*/
|
||||
read_ol_numZoomLevels: function(layerInfo, node) {
|
||||
layerInfo.options.numZoomLevels = parseInt(this.getChildValue(node));
|
||||
read_ol_numZoomLevels: function(layerContext, node) {
|
||||
layerContext.numZoomLevels = parseInt(this.getChildValue(node));
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: read_ol_opacity
|
||||
*/
|
||||
read_ol_opacity: function(layerInfo, node) {
|
||||
layerInfo.options.opacity = parseFloat(this.getChildValue(node));
|
||||
read_ol_opacity: function(layerContext, node) {
|
||||
layerContext.opacity = parseFloat(this.getChildValue(node));
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: read_ol_singleTile
|
||||
*/
|
||||
read_ol_singleTile: function(layerInfo, node) {
|
||||
layerInfo.options.singleTile = (this.getChildValue(node) == "true");
|
||||
read_ol_singleTile: function(layerContext, node) {
|
||||
layerContext.singleTile = (this.getChildValue(node) == "true");
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: read_ol_isBaseLayer
|
||||
*/
|
||||
read_ol_isBaseLayer: function(layerInfo, node) {
|
||||
layerInfo.options.isBaseLayer = (this.getChildValue(node) == "true");
|
||||
read_ol_isBaseLayer: function(layerContext, node) {
|
||||
layerContext.isBaseLayer = (this.getChildValue(node) == "true");
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: read_ol_displayInLayerSwitcher
|
||||
*/
|
||||
read_ol_displayInLayerSwitcher: function(layerInfo, node) {
|
||||
layerInfo.options.displayInLayerSwitcher =
|
||||
(this.getChildValue(node) == "true");
|
||||
read_ol_displayInLayerSwitcher: function(layerContext, node) {
|
||||
layerContext.displayInLayerSwitcher = (this.getChildValue(node) == "true");
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: read_wmc_Server
|
||||
*/
|
||||
read_wmc_Server: function(layerInfo, node) {
|
||||
layerInfo.params.version = node.getAttribute("version");
|
||||
this.runChildNodes(layerInfo, node);
|
||||
read_wmc_Server: function(layerContext, node) {
|
||||
layerContext.version = node.getAttribute("version");
|
||||
var server = {};
|
||||
var links = node.getElementsByTagName("OnlineResource");
|
||||
if(links.length > 0) {
|
||||
this.read_wmc_OnlineResource(server, links[0]);
|
||||
}
|
||||
layerContext.url = server.href;
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: read_wmc_FormatList
|
||||
*/
|
||||
read_wmc_FormatList: function(layerInfo, node) {
|
||||
this.runChildNodes(layerInfo, node);
|
||||
read_wmc_FormatList: function(layerContext, node) {
|
||||
this.runChildNodes(layerContext, node);
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: read_wmc_Format
|
||||
*/
|
||||
read_wmc_Format: function(layerInfo, node) {
|
||||
var format = this.getChildValue(node);
|
||||
layerInfo.formats.push(format);
|
||||
read_wmc_Format: function(layerContext, node) {
|
||||
var format = {
|
||||
value: this.getChildValue(node)
|
||||
};
|
||||
if(node.getAttribute("current") == "1") {
|
||||
layerInfo.params.format = format;
|
||||
format.current = true;
|
||||
}
|
||||
layerContext.formats.push(format);
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: read_wmc_StyleList
|
||||
*/
|
||||
read_wmc_StyleList: function(layerInfo, node) {
|
||||
this.runChildNodes(layerInfo, node);
|
||||
read_wmc_StyleList: function(layerContext, node) {
|
||||
this.runChildNodes(layerContext, node);
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: read_wmc_Style
|
||||
*/
|
||||
read_wmc_Style: function(layerInfo, node) {
|
||||
read_wmc_Style: function(layerContext, node) {
|
||||
var style = {};
|
||||
this.runChildNodes(style, node);
|
||||
if(node.getAttribute("current") == "1") {
|
||||
// three style types to consider
|
||||
// 1) linked SLD
|
||||
// 2) inline SLD
|
||||
// 3) named style
|
||||
// running child nodes always gets name, optionally gets href or body
|
||||
if(style.href) {
|
||||
layerInfo.params.sld = style.href;
|
||||
} else if(style.body) {
|
||||
layerInfo.params.sld_body = style.body;
|
||||
} else {
|
||||
layerInfo.params.styles = style.name;
|
||||
}
|
||||
style.current = true;
|
||||
}
|
||||
layerInfo.styles.push(style);
|
||||
layerContext.styles.push(style);
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -380,13 +345,13 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
/**
|
||||
* Method: read_wmc_MetadataURL
|
||||
*/
|
||||
read_wmc_MetadataURL: function(layerInfo, node) {
|
||||
read_wmc_MetadataURL: function(layerContext, node) {
|
||||
var metadataURL = {};
|
||||
var links = node.getElementsByTagName("OnlineResource");
|
||||
if(links.length > 0) {
|
||||
this.read_wmc_OnlineResource(metadataURL, links[0]);
|
||||
}
|
||||
layerInfo.options.metadataURL = metadataURL.href;
|
||||
layerContext.metadataURL = metadataURL.href;
|
||||
|
||||
},
|
||||
|
||||
@@ -400,17 +365,18 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
}
|
||||
},
|
||||
|
||||
//FIXME: LatLonBoundingBox is not in spec
|
||||
/**
|
||||
* Method: read_wmc_LatLonBoundingBox
|
||||
*/
|
||||
read_wmc_LatLonBoundingBox: function(layer, node) {
|
||||
layer.llbbox = [
|
||||
parseFloat(node.getAttribute("minx")),
|
||||
parseFloat(node.getAttribute("miny")),
|
||||
parseFloat(node.getAttribute("maxx")),
|
||||
parseFloat(node.getAttribute("maxy"))
|
||||
];
|
||||
},
|
||||
//read_wmc_LatLonBoundingBox: function(layer, node) {
|
||||
//layer.llbbox = [
|
||||
//parseFloat(node.getAttribute("minx")),
|
||||
//parseFloat(node.getAttribute("miny")),
|
||||
//parseFloat(node.getAttribute("maxx")),
|
||||
//parseFloat(node.getAttribute("maxy"))
|
||||
//];
|
||||
//},
|
||||
|
||||
/**
|
||||
* Method: read_wmc_LegendURL
|
||||
@@ -594,12 +560,8 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
write_wmc_LayerList: function(context) {
|
||||
var list = this.createElementDefaultNS("LayerList");
|
||||
|
||||
var layer;
|
||||
for(var i=0, len=context.layers.length; i<len; ++i) {
|
||||
layer = context.layers[i];
|
||||
if(layer instanceof OpenLayers.Layer.WMS) {
|
||||
list.appendChild(this.write_wmc_Layer(layer));
|
||||
}
|
||||
for(var i=0, len=context.layersContext.length; i<len; ++i) {
|
||||
list.appendChild(this.write_wmc_Layer(context.layersContext[i]));
|
||||
}
|
||||
|
||||
return list;
|
||||
@@ -607,38 +569,38 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
|
||||
/**
|
||||
* Method: write_wmc_Layer
|
||||
* Create a Layer node given a layer object.
|
||||
* Create a Layer node given a layer context object.
|
||||
*
|
||||
* Parameters:
|
||||
* layer - {<OpenLayers.Layer.WMS>} Layer object.
|
||||
* context - {Object} A layer context object.}
|
||||
*
|
||||
* Returns:
|
||||
* {Element} A WMC Layer element node.
|
||||
*/
|
||||
write_wmc_Layer: function(layer) {
|
||||
write_wmc_Layer: function(context) {
|
||||
var node = this.createElementDefaultNS(
|
||||
"Layer", null, {
|
||||
queryable: layer.queryable ? "1" : "0",
|
||||
hidden: layer.visibility ? "0" : "1"
|
||||
queryable: context.queryable ? "1" : "0",
|
||||
hidden: context.visibility ? "0" : "1"
|
||||
}
|
||||
);
|
||||
|
||||
// required Server element
|
||||
node.appendChild(this.write_wmc_Server(layer));
|
||||
node.appendChild(this.write_wmc_Server(context));
|
||||
|
||||
// required Name element
|
||||
node.appendChild(this.createElementDefaultNS(
|
||||
"Name", layer.params["LAYERS"]
|
||||
"Name", context.name
|
||||
));
|
||||
|
||||
// required Title element
|
||||
node.appendChild(this.createElementDefaultNS(
|
||||
"Title", layer.name
|
||||
"Title", context.title
|
||||
));
|
||||
|
||||
// optional MetadataURL element
|
||||
if (layer.metadataURL) {
|
||||
node.appendChild(this.write_wmc_MetadataURL(layer));
|
||||
if (context.metadataURL) {
|
||||
node.appendChild(this.write_wmc_MetadataURL(context.metadataURL));
|
||||
}
|
||||
|
||||
return node;
|
||||
@@ -649,15 +611,15 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
* Add OpenLayers specific layer parameters to an Extension element.
|
||||
*
|
||||
* Parameters:
|
||||
* layer - {<OpenLayers.Layer.WMS>} A WMS layer.
|
||||
* context - {Object} A layer context object.
|
||||
*
|
||||
* Returns:
|
||||
* {Element} A WMC Extension element (for a layer).
|
||||
*/
|
||||
write_wmc_LayerExtension: function(layer) {
|
||||
write_wmc_LayerExtension: function(context) {
|
||||
var node = this.createElementDefaultNS("Extension");
|
||||
|
||||
var bounds = layer.maxExtent;
|
||||
var bounds = context.maxExtent;
|
||||
var maxExtent = this.createElementNS(
|
||||
this.namespaces.ol, "ol:maxExtent"
|
||||
);
|
||||
@@ -669,22 +631,13 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
});
|
||||
node.appendChild(maxExtent);
|
||||
|
||||
var param = layer.params["TRANSPARENT"];
|
||||
if(param) {
|
||||
var trans = this.createElementNS(
|
||||
this.namespaces.ol, "ol:transparent"
|
||||
);
|
||||
trans.appendChild(this.createTextNode(param));
|
||||
node.appendChild(trans);
|
||||
}
|
||||
|
||||
var properties = [
|
||||
"numZoomLevels", "units", "isBaseLayer",
|
||||
"transparent", "numZoomLevels", "units", "isBaseLayer",
|
||||
"opacity", "displayInLayerSwitcher", "singleTile"
|
||||
];
|
||||
var child;
|
||||
for(var i=0, len=properties.length; i<len; ++i) {
|
||||
child = this.createOLPropertyNode(layer, properties[i]);
|
||||
child = this.createOLPropertyNode(context, properties[i]);
|
||||
if(child) {
|
||||
node.appendChild(child);
|
||||
}
|
||||
@@ -716,116 +669,143 @@ OpenLayers.Format.WMC.v1 = OpenLayers.Class(OpenLayers.Format.XML, {
|
||||
|
||||
/**
|
||||
* Method: write_wmc_Server
|
||||
* Create a Server node given a layer object.
|
||||
* Create a Server node given a layer context object.
|
||||
*
|
||||
* Parameters:
|
||||
* layer - {<OpenLayers.Layer.WMS>} Layer object.
|
||||
* context - {Object} Layer context object.
|
||||
*
|
||||
* Returns:
|
||||
* {Element} A WMC Server element node.
|
||||
*/
|
||||
write_wmc_Server: function(layer) {
|
||||
write_wmc_Server: function(context) {
|
||||
var node = this.createElementDefaultNS("Server");
|
||||
this.setAttributes(node, {
|
||||
service: "OGC:WMS",
|
||||
version: layer.params["VERSION"]
|
||||
version: context.version
|
||||
});
|
||||
|
||||
// required OnlineResource element
|
||||
node.appendChild(this.write_wmc_OnlineResource(layer.url));
|
||||
node.appendChild(this.write_wmc_OnlineResource(context.url));
|
||||
|
||||
return node;
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: write_wmc_MetadataURL
|
||||
* Create a MetadataURL node given a layer object.
|
||||
* Create a MetadataURL node given a metadataURL string.
|
||||
*
|
||||
* Parameters:
|
||||
* layer - {<OpenLayers.Layer.WMS>} Layer object.
|
||||
* metadataURL - {String} MetadataURL string value.
|
||||
*
|
||||
* Returns:
|
||||
* {Element} A WMC metadataURL element node.
|
||||
*/
|
||||
write_wmc_MetadataURL: function(layer) {
|
||||
write_wmc_MetadataURL: function(metadataURL) {
|
||||
var node = this.createElementDefaultNS("MetadataURL");
|
||||
|
||||
// required OnlineResource element
|
||||
node.appendChild(this.write_wmc_OnlineResource(layer.metadataURL));
|
||||
node.appendChild(this.write_wmc_OnlineResource(metadataURL));
|
||||
|
||||
return node;
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: write_wmc_FormatList
|
||||
* Create a FormatList node given a layer.
|
||||
* Create a FormatList node given a layer context.
|
||||
*
|
||||
* Parameters:
|
||||
* layer - {<OpenLayers.Layer.WMS>} Layer object.
|
||||
* context - {Object} Layer context object.
|
||||
*
|
||||
* Returns:
|
||||
* {Element} A WMC FormatList element node.
|
||||
*/
|
||||
write_wmc_FormatList: function(layer) {
|
||||
write_wmc_FormatList: function(context) {
|
||||
var node = this.createElementDefaultNS("FormatList");
|
||||
node.appendChild(this.createElementDefaultNS(
|
||||
"Format", layer.params["FORMAT"], {current: "1"}
|
||||
));
|
||||
for (var i=0, len=context.formats.length; i<len; i++) {
|
||||
var format = context.formats[i];
|
||||
node.appendChild(this.createElementDefaultNS(
|
||||
"Format",
|
||||
format.value,
|
||||
(format.current && format.current == true) ?
|
||||
{current: "1"} : null
|
||||
));
|
||||
}
|
||||
|
||||
return node;
|
||||
},
|
||||
|
||||
/**
|
||||
* Method: write_wmc_StyleList
|
||||
* Create a StyleList node given a layer.
|
||||
* Create a StyleList node given a layer context.
|
||||
*
|
||||
* Parameters:
|
||||
* layer - {<OpenLayers.Layer.WMS>} Layer object.
|
||||
* context - {Object} Layer context object.
|
||||
*
|
||||
* Returns:
|
||||
* {Element} A WMC StyleList element node.
|
||||
*/
|
||||
write_wmc_StyleList: function(layer) {
|
||||
var node = this.createElementDefaultNS("StyleList");
|
||||
var style = this.createElementDefaultNS(
|
||||
"Style", null, {current: "1"}
|
||||
);
|
||||
|
||||
// Style can come from one of three places (prioritized as below):
|
||||
// 1) an SLD parameter
|
||||
// 2) and SLD_BODY parameter
|
||||
// 3) the STYLES parameter
|
||||
|
||||
if(layer.params["SLD"]) {
|
||||
// create link from SLD parameter
|
||||
var sld = this.createElementDefaultNS("SLD");
|
||||
var link = this.write_wmc_OnlineResource(layer.params["SLD"]);
|
||||
sld.appendChild(link);
|
||||
style.appendChild(sld);
|
||||
} else if(layer.params["SLD_BODY"]) {
|
||||
// include sld fragment from SLD_BODY parameter
|
||||
var sld = this.createElementDefaultNS("SLD");
|
||||
var body = layer.params["SLD_BODY"];
|
||||
// read in body as xml doc - assume proper namespace declarations
|
||||
var doc = OpenLayers.Format.XML.prototype.read.apply(this, [body]);
|
||||
// append to StyledLayerDescriptor node
|
||||
var imported = doc.documentElement;
|
||||
if(sld.ownerDocument && sld.ownerDocument.importNode) {
|
||||
imported = sld.ownerDocument.importNode(imported, true);
|
||||
|
||||
var styles = layer.styles;
|
||||
if (styles && styles instanceof Array) {
|
||||
var sld;
|
||||
for (var i=0, len=styles.length; i<len; i++) {
|
||||
var s = styles[i];
|
||||
// three style types to consider
|
||||
// [1] linked SLD
|
||||
// [2] inline SLD
|
||||
// [3] named style
|
||||
// running child nodes always gets name, optionally gets href or body
|
||||
var style = this.createElementDefaultNS(
|
||||
"Style",
|
||||
null,
|
||||
(s.current && s.current == true) ?
|
||||
{current: "1"} : null
|
||||
);
|
||||
if(s.href) { // [1]
|
||||
sld = this.createElementDefaultNS("SLD");
|
||||
var link = this.write_wmc_OnlineResource(s.href);
|
||||
sld.appendChild(link);
|
||||
// Name is required.
|
||||
sld.appendChild(this.createElementDefaultNS("Name", s.name));
|
||||
// Title is optionnal.
|
||||
if (s.title) {
|
||||
sld.appendChild(this.createElementDefaultNS("Title", s.title));
|
||||
}
|
||||
style.appendChild(sld);
|
||||
} else if(s.body) { // [2]
|
||||
sld = this.createElementDefaultNS("SLD");
|
||||
// read in body as xml doc - assume proper namespace declarations
|
||||
var doc = OpenLayers.Format.XML.prototype.read.apply(this, [s.body]);
|
||||
// append to StyledLayerDescriptor node
|
||||
var imported = doc.documentElement;
|
||||
if(sld.ownerDocument && sld.ownerDocument.importNode) {
|
||||
imported = sld.ownerDocument.importNode(imported, true);
|
||||
}
|
||||
sld.appendChild(imported);
|
||||
// Name is required.
|
||||
sld.appendChild(this.createElementDefaultNS("Name", s.name));
|
||||
// Title is optionnal.
|
||||
if (s.title) {
|
||||
sld.appendChild(this.createElementDefaultNS("Title", s.title));
|
||||
}
|
||||
style.appendChild(sld);
|
||||
} else { // [3]
|
||||
// both Name and Title are required.
|
||||
style.appendChild(this.createElementDefaultNS("Name", s.name));
|
||||
style.appendChild(this.createElementDefaultNS("Title", s.title));
|
||||
// Abstract is optionnal
|
||||
if (s['abstract']) { // abstract is a js keyword
|
||||
style.appendChild(this.createElementDefaultNS(
|
||||
"Abstract", s['abstract']
|
||||
));
|
||||
}
|
||||
}
|
||||
node.appendChild(style);
|
||||
}
|
||||
sld.appendChild(imported);
|
||||
style.appendChild(sld);
|
||||
} else {
|
||||
// use name(s) from STYLES parameter
|
||||
var name = layer.params["STYLES"] ?
|
||||
layer.params["STYLES"] : this.defaultStyleName;
|
||||
|
||||
style.appendChild(this.createElementDefaultNS("Name", name));
|
||||
style.appendChild(this.createElementDefaultNS(
|
||||
"Title", this.defaultStyleTitle
|
||||
));
|
||||
}
|
||||
node.appendChild(style);
|
||||
|
||||
return node;
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user