diff --git a/examples/data/countries.sld b/examples/data/countries.sld index 79fb36d465..9ae5eebea3 100644 --- a/examples/data/countries.sld +++ b/examples/data/countries.sld @@ -25,6 +25,7 @@ + 20000000 name diff --git a/examples/vector-layer-sld.html b/examples/vector-layer-sld.html index 52b9b0e80d..eda42d859b 100644 --- a/examples/vector-layer-sld.html +++ b/examples/vector-layer-sld.html @@ -44,12 +44,7 @@
vector, geojson, style, SLD, Styled Layer Descriptor
-
-
-   -
-
- + diff --git a/examples/vector-layer-sld.js b/examples/vector-layer-sld.js index aa8f9f5563..585cc66c09 100644 --- a/examples/vector-layer-sld.js +++ b/examples/vector-layer-sld.js @@ -1,6 +1,8 @@ goog.require('ol.Map'); goog.require('ol.RendererHint'); goog.require('ol.View2D'); +goog.require('ol.control'); +goog.require('ol.control.ScaleLine'); goog.require('ol.layer.Tile'); goog.require('ol.layer.Vector'); goog.require('ol.parser.GeoJSON'); @@ -22,7 +24,20 @@ xhr.open('GET', 'data/countries.sld', true); */ xhr.onload = function() { if (xhr.status == 200) { - var sld = new ol.parser.ogc.SLD().read(xhr.responseText); + var map = new ol.Map({ + controls: ol.control.defaults().extend([ + new ol.control.ScaleLine() + ]), + layers: [raster], + renderer: ol.RendererHint.CANVAS, + target: 'map', + view: new ol.View2D({ + center: [0, 0], + zoom: 1 + }) + }); + var units = map.getView().getProjection().getUnits(); + var sld = new ol.parser.ogc.SLD().read(xhr.responseText, units); var style = sld.namedLayers['countries'].userStyles[0]; var vector = new ol.layer.Vector({ source: new ol.source.Vector({ @@ -31,15 +46,7 @@ xhr.onload = function() { }), style: style }); - new ol.Map({ - layers: [raster, vector], - renderer: ol.RendererHint.CANVAS, - target: 'map', - view: new ol.View2D({ - center: [0, 0], - zoom: 1 - }) - }); + map.getLayers().push(vector); } }; xhr.send(); diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc index 78a0e7cbeb..37424a6108 100644 --- a/src/objectliterals.jsdoc +++ b/src/objectliterals.jsdoc @@ -567,6 +567,12 @@ * @todo stability experimental */ + /** + * @typedef {Object} ol.parser.SLDReadOptions + * @property {ol.proj.Units} units The units to use in scale to resolution + * calculations. + */ + /** * @typedef {Object} ol.source.BingMapsOptions * @property {string|undefined} culture Culture. diff --git a/src/ol/parser/ogc/sldparser_v1.js b/src/ol/parser/ogc/sldparser_v1.js index 6917240dac..5708a207f0 100644 --- a/src/ol/parser/ogc/sldparser_v1.js +++ b/src/ol/parser/ogc/sldparser_v1.js @@ -76,10 +76,12 @@ ol.parser.ogc.SLD_v1 = function() { rule.elseFilter = true; }, 'MinScaleDenominator': function(node, rule) { - rule.minScaleDenominator = parseFloat(this.getChildValue(node)); + rule.minResolution = this.getResolutionFromScale_( + parseFloat(this.getChildValue(node))); }, 'MaxScaleDenominator': function(node, rule) { - rule.maxScaleDenominator = parseFloat(this.getChildValue(node)); + rule.maxResolution = this.getResolutionFromScale_( + parseFloat(this.getChildValue(node))); }, 'TextSymbolizer': function(node, rule) { var config = {}; @@ -188,6 +190,7 @@ ol.parser.ogc.SLD_v1 = function() { var ogcreaders = this.readers['http://www.opengis.net/ogc']; var radius = ogcreaders._expression.call(this, node); if (goog.isDef(radius)) { + symbolizer.haloRadius = radius; } }, 'RasterSymbolizer': function(node, rule) { @@ -412,11 +415,31 @@ ol.parser.ogc.SLD_v1.cssMap_ = { }; +/** + * @private + * @param {number} scaleDenominator The scale denominator to convert to + * resolution. + * @return {number} resolution. + */ +ol.parser.ogc.SLD_v1.prototype.getResolutionFromScale_ = + function(scaleDenominator) { + var dpi = 25.4 / 0.28; + var mpu = ol.METERS_PER_UNIT[this.units]; + return 1 / ((1 / scaleDenominator) * (mpu * 39.37) * dpi); +}; + + /** * @param {string|Document|Element} data Data to read. + * @param {ol.parser.SLDReadOptions=} opt_options Read options. * @return {Object} An object representing the document. */ -ol.parser.ogc.SLD_v1.prototype.read = function(data) { +ol.parser.ogc.SLD_v1.prototype.read = function(data, opt_options) { + var units = 'm'; + if (goog.isDef(opt_options) && goog.isDef(opt_options.units)) { + units = opt_options.units; + } + this.units = units; if (goog.isString(data)) { data = goog.dom.xml.loadXml(data); } @@ -425,5 +448,6 @@ ol.parser.ogc.SLD_v1.prototype.read = function(data) { } var obj = {namedLayers: {}}; this.readNode(data, obj); + delete this.units; return obj; };