Bienvenue sur PostGIS.fr

Bienvenue sur PostGIS.fr , le site de la communauté des utilisateurs francophones de PostGIS.

PostGIS ajoute le support d'objets géographique à la base de données PostgreSQL. En effet, PostGIS "spatialise" le serverur PostgreSQL, ce qui permet de l'utiliser comme une base de données SIG.

Maintenu à jour, en fonction de nos disponibilités et des diverses sorties des outils que nous testons, nous vous proposons l'ensemble de nos travaux publiés en langue française.

source: trunk/workshop-routing-foss4g/web/OpenLayers/lib/OpenLayers/Format/SLD/v1.js @ 76

Revision 76, 42.3 KB checked in by djay, 12 years ago (diff)

Ajout du répertoire web

  • Property svn:executable set to *
Line 
1/* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for
2 * full list of contributors). Published under the Clear BSD license. 
3 * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
4 * full text of the license. */
5
6/**
7 * @requires OpenLayers/Rule.js
8 * @requires OpenLayers/Format/SLD.js
9 * @requires OpenLayers/Format/Filter/v1_0_0.js
10 */
11
12/**
13 * Class: OpenLayers.Format.SLD.v1
14 * Superclass for SLD version 1 parsers.
15 *
16 * Inherits from:
17 *  - <OpenLayers.Format.Filter.v1_0_0>
18 */
19OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, {
20   
21    /**
22     * Property: namespaces
23     * {Object} Mapping of namespace aliases to namespace URIs.
24     */
25    namespaces: {
26        sld: "http://www.opengis.net/sld",
27        ogc: "http://www.opengis.net/ogc",
28        gml: "http://www.opengis.net/gml",
29        xlink: "http://www.w3.org/1999/xlink",
30        xsi: "http://www.w3.org/2001/XMLSchema-instance"
31    },
32   
33    /**
34     * Property: defaultPrefix
35     */
36    defaultPrefix: "sld",
37
38    /**
39     * Property: schemaLocation
40     * {String} Schema location for a particular minor version.
41     */
42    schemaLocation: null,
43   
44    /**
45     * APIProperty: multipleSymbolizers
46     * {Boolean} Support multiple symbolizers per rule.  Default is false.  if
47     *     true, an OpenLayers.Style2 instance will be created to represent
48     *     user styles instead of an OpenLayers.Style instace.  The
49     *     OpenLayers.Style2 class allows collections of rules with multiple
50     *     symbolizers, but is not currently useful for client side rendering.
51     *     If multiple symbolizers is true, multiple FeatureTypeStyle elements
52     *     are preserved in reading/writing by setting symbolizer zIndex values.
53     *     In addition, the <defaultSymbolizer> property is ignored if
54     *     multiple symbolizers are supported (defaults should be applied
55     *     when rendering).
56     */
57    multipleSymbolizers: false,
58
59    /**
60     * Property: featureTypeCounter
61     * {Number} Private counter for multiple feature type styles.
62     */
63    featureTypeCounter: null,
64
65    /**
66     * APIProperty: defaultSymbolizer.
67     * {Object} A symbolizer with the SLD defaults.
68     */
69    defaultSymbolizer: {
70        fillColor: "#808080",
71        fillOpacity: 1,
72        strokeColor: "#000000",
73        strokeOpacity: 1,
74        strokeWidth: 1,
75        strokeDashstyle: "solid",
76        pointRadius: 3,
77        graphicName: "square"
78    },
79   
80    /**
81     * Constructor: OpenLayers.Format.SLD.v1
82     * Instances of this class are not created directly.  Use the
83     *     <OpenLayers.Format.SLD> constructor instead.
84     *
85     * Parameters:
86     * options - {Object} An optional object whose properties will be set on
87     *     this instance.
88     */
89    initialize: function(options) {
90        OpenLayers.Format.Filter.v1_0_0.prototype.initialize.apply(this, [options]);
91    },
92   
93    /**
94     * Method: read
95     *
96     * Parameters:
97     * data - {DOMElement} An SLD document element.
98     * options - {Object} Options for the reader.
99     *
100     * Valid options:
101     * namedLayersAsArray - {Boolean}  Generate a namedLayers array.  If false,
102     *     the namedLayers property value will be an object keyed by layer name.
103     *     Default is false.
104     *
105     * Returns:
106     * {Object} An object representing the SLD.
107     */
108    read: function(data, options) {
109        options = OpenLayers.Util.applyDefaults(options, this.options);
110        var sld = {
111            namedLayers: options.namedLayersAsArray === true ? [] : {}
112        };
113        this.readChildNodes(data, sld);
114        return sld;
115    },
116   
117    /**
118     * Property: readers
119     * Contains public functions, grouped by namespace prefix, that will
120     *     be applied when a namespaced node is found matching the function
121     *     name.  The function will be applied in the scope of this parser
122     *     with two arguments: the node being read and a context object passed
123     *     from the parent.
124     */
125    readers: OpenLayers.Util.applyDefaults({
126        "sld": {
127            "StyledLayerDescriptor": function(node, sld) {
128                sld.version = node.getAttribute("version");
129                this.readChildNodes(node, sld);
130            },
131            "Name": function(node, obj) {
132                obj.name = this.getChildValue(node);
133            },
134            "Title": function(node, obj) {
135                obj.title = this.getChildValue(node);
136            },
137            "Abstract": function(node, obj) {
138                obj.description = this.getChildValue(node);
139            },
140            "NamedLayer": function(node, sld) {
141                var layer = {
142                    userStyles: [],
143                    namedStyles: []
144                };
145                this.readChildNodes(node, layer);
146                // give each of the user styles this layer name
147                for(var i=0, len=layer.userStyles.length; i<len; ++i) {
148                    layer.userStyles[i].layerName = layer.name;
149                }
150                if(sld.namedLayers instanceof Array) {
151                    sld.namedLayers.push(layer);               
152                } else {
153                    sld.namedLayers[layer.name] = layer;
154                }
155            },
156            "NamedStyle": function(node, layer) {
157                layer.namedStyles.push(
158                    this.getChildName(node.firstChild)
159                );
160            },
161            "UserStyle": function(node, layer) {
162                var obj = {defaultsPerSymbolizer: true, rules: []};
163                this.featureTypeCounter = -1;
164                this.readChildNodes(node, obj);
165                var style;
166                if (this.multipleSymbolizers) {
167                    delete obj.defaultsPerSymbolizer;
168                    style = new OpenLayers.Style2(obj);
169                } else {
170                    style = new OpenLayers.Style(this.defaultSymbolizer, obj);
171                }
172                layer.userStyles.push(style);
173            },
174            "IsDefault": function(node, style) {
175                if(this.getChildValue(node) == "1") {
176                    style.isDefault = true;
177                }
178            },
179            "FeatureTypeStyle": function(node, style) {
180                ++this.featureTypeCounter;
181                var obj = {
182                    rules: this.multipleSymbolizers ? style.rules : []
183                };
184                this.readChildNodes(node, obj);
185                if (!this.multipleSymbolizers) {
186                    style.rules = obj.rules;
187                }
188            },
189            "Rule": function(node, obj) {
190                var config;
191                if (this.multipleSymbolizers) {
192                    config = {symbolizers: []};
193                }
194                var rule = new OpenLayers.Rule(config);
195                this.readChildNodes(node, rule);
196                obj.rules.push(rule);
197            },
198            "ElseFilter": function(node, rule) {
199                rule.elseFilter = true;
200            },
201            "MinScaleDenominator": function(node, rule) {
202                rule.minScaleDenominator = parseFloat(this.getChildValue(node));
203            },
204            "MaxScaleDenominator": function(node, rule) {
205                rule.maxScaleDenominator = parseFloat(this.getChildValue(node));
206            },
207            "TextSymbolizer": function(node, rule) {
208                var config = {};
209                this.readChildNodes(node, config);
210                if (this.multipleSymbolizers) {
211                    config.zIndex = this.featureTypeCounter;
212                    rule.symbolizers.push(
213                        new OpenLayers.Symbolizer.Text(config)
214                    );
215                } else {
216                    rule.symbolizer["Text"] = OpenLayers.Util.applyDefaults(
217                        config, rule.symbolizer["Text"]
218                    );
219                }
220            },
221            "Label": function(node, symbolizer) {
222                // only supporting literal or property name
223                var obj = {};
224                this.readChildNodes(node, obj);
225                if(obj.property) {
226                    symbolizer.label = "${" + obj.property + "}";
227                } else {
228                    var value = this.readOgcExpression(node);
229                    if(value) {
230                        symbolizer.label = value;
231                    }
232                }
233            },
234            "Font": function(node, symbolizer) {
235                this.readChildNodes(node, symbolizer);
236            },
237            "Halo": function(node, symbolizer) {
238                // halo has a fill, so send fresh object
239                var obj = {};
240                this.readChildNodes(node, obj);
241                symbolizer.haloRadius = obj.haloRadius;
242                symbolizer.haloColor = obj.fillColor;
243                symbolizer.haloOpacity = obj.fillOpacity;
244            },
245            "Radius": function(node, symbolizer) {
246                var radius = this.readOgcExpression(node);
247                if(radius != null) {
248                    // radius is only used for halo
249                    symbolizer.haloRadius = radius;
250                }
251            },
252            "RasterSymbolizer": function(node, rule) {
253                var config = {};
254                this.readChildNodes(node, config);
255                if (this.multipleSymbolizers) {
256                    config.zIndex = this.featureTypeCounter;
257                    rule.symbolizers.push(
258                        new OpenLayers.Symbolizer.Raster(config)
259                    );
260                } else {
261                    rule.symbolizer["Raster"] = OpenLayers.Util.applyDefaults(
262                        config, rule.symbolizer["Raster"]
263                    );
264                }
265            },
266            "Geometry": function(node, obj) {
267                obj.geometry = {};
268                this.readChildNodes(node, obj.geometry);
269            },
270            "ColorMap": function(node, symbolizer) {
271                symbolizer.colorMap = [];
272                this.readChildNodes(node, symbolizer.colorMap);
273            },
274            "ColorMapEntry": function(node, colorMap) {
275                var q = node.getAttribute("quantity");
276                var o = node.getAttribute("opacity");
277                colorMap.push({
278                    color: node.getAttribute("color"),
279                    quantity: q !== null ? parseFloat(q) : undefined,
280                    label: node.getAttribute("label") || undefined,
281                    opacity: o !== null ? parseFloat(o) : undefined
282                });
283            },
284            "LineSymbolizer": function(node, rule) {
285                var config = {};
286                this.readChildNodes(node, config);
287                if (this.multipleSymbolizers) {
288                    config.zIndex = this.featureTypeCounter;
289                    rule.symbolizers.push(
290                        new OpenLayers.Symbolizer.Line(config)
291                    );
292                } else {
293                    rule.symbolizer["Line"] = OpenLayers.Util.applyDefaults(
294                        config, rule.symbolizer["Line"]
295                    );
296                }
297            },
298            "PolygonSymbolizer": function(node, rule) {
299                var config = {
300                    fill: false,
301                    stroke: false
302                };
303                if (!this.multipleSymbolizers) {
304                    config = rule.symbolizer["Polygon"] || config;
305                }
306                this.readChildNodes(node, config);
307                if (this.multipleSymbolizers) {
308                    config.zIndex = this.featureTypeCounter;
309                    rule.symbolizers.push(
310                        new OpenLayers.Symbolizer.Polygon(config)
311                    );
312                } else {
313                    rule.symbolizer["Polygon"] = config;
314                }
315            },
316            "PointSymbolizer": function(node, rule) {
317                var config = {
318                    fill: false,
319                    stroke: false,
320                    graphic: false
321                };
322                if (!this.multipleSymbolizers) {
323                    config = rule.symbolizer["Point"] || config;
324                }
325                this.readChildNodes(node, config);
326                if (this.multipleSymbolizers) {
327                    config.zIndex = this.featureTypeCounter;
328                    rule.symbolizers.push(
329                        new OpenLayers.Symbolizer.Point(config)
330                    );
331                } else {
332                    rule.symbolizer["Point"] = config;
333                }
334            },
335            "Stroke": function(node, symbolizer) {
336                symbolizer.stroke = true;
337                this.readChildNodes(node, symbolizer);
338            },
339            "Fill": function(node, symbolizer) {
340                symbolizer.fill = true;
341                this.readChildNodes(node, symbolizer);
342            },
343            "CssParameter": function(node, symbolizer) {
344                var cssProperty = node.getAttribute("name");
345                var symProperty = this.cssMap[cssProperty];
346                if(symProperty) {
347                    // Limited support for parsing of OGC expressions
348                    var value = this.readOgcExpression(node);
349                    // always string, could be an empty string
350                    if(value) {
351                        symbolizer[symProperty] = value;
352                    }
353                }
354            },
355            "Graphic": function(node, symbolizer) {
356                symbolizer.graphic = true;
357                var graphic = {};
358                // painter's order not respected here, clobber previous with next
359                this.readChildNodes(node, graphic);
360                // directly properties with names that match symbolizer properties
361                var properties = [
362                    "stroke", "strokeColor", "strokeWidth", "strokeOpacity",
363                    "strokeLinecap", "fill", "fillColor", "fillOpacity",
364                    "graphicName", "rotation", "graphicFormat"
365                ];
366                var prop, value;
367                for(var i=0, len=properties.length; i<len; ++i) {
368                    prop = properties[i];
369                    value = graphic[prop];
370                    if(value != undefined) {
371                        symbolizer[prop] = value;
372                    }
373                }
374                // set other generic properties with specific graphic property names
375                if(graphic.opacity != undefined) {
376                    symbolizer.graphicOpacity = graphic.opacity;
377                }
378                if(graphic.size != undefined) {
379                    symbolizer.pointRadius = graphic.size / 2;
380                }
381                if(graphic.href != undefined) {
382                    symbolizer.externalGraphic = graphic.href;
383                }
384                if(graphic.rotation != undefined) {
385                    symbolizer.rotation = graphic.rotation;
386                }
387            },
388            "ExternalGraphic": function(node, graphic) {
389                this.readChildNodes(node, graphic);
390            },
391            "Mark": function(node, graphic) {
392                this.readChildNodes(node, graphic);
393            },
394            "WellKnownName": function(node, graphic) {
395                graphic.graphicName = this.getChildValue(node);
396            },
397            "Opacity": function(node, obj) {
398                var opacity = this.readOgcExpression(node);
399                // always string, could be empty string
400                if(opacity) {
401                    obj.opacity = opacity;
402                }
403            },
404            "Size": function(node, obj) {
405                var size = this.readOgcExpression(node);
406                // always string, could be empty string
407                if(size) {
408                    obj.size = size;
409                }
410            },
411            "Rotation": function(node, obj) {
412                var rotation = this.readOgcExpression(node);
413                // always string, could be empty string
414                if(rotation) {
415                    obj.rotation = rotation;
416                }
417            },
418            "OnlineResource": function(node, obj) {
419                obj.href = this.getAttributeNS(
420                    node, this.namespaces.xlink, "href"
421                );
422            },
423            "Format": function(node, graphic) {
424                graphic.graphicFormat = this.getChildValue(node);
425            }
426        }
427    }, OpenLayers.Format.Filter.v1_0_0.prototype.readers),
428   
429    /**
430     * Property: cssMap
431     * {Object} Object mapping supported css property names to OpenLayers
432     *     symbolizer property names.
433     */
434    cssMap: {
435        "stroke": "strokeColor",
436        "stroke-opacity": "strokeOpacity",
437        "stroke-width": "strokeWidth",
438        "stroke-linecap": "strokeLinecap",
439        "stroke-dasharray": "strokeDashstyle",
440        "fill": "fillColor",
441        "fill-opacity": "fillOpacity",
442        "font-family": "fontFamily",
443        "font-size": "fontSize",
444        "font-weight": "fontWeight",
445        "font-style": "fontStyle"
446    },
447   
448    /**
449     * Method: getCssProperty
450     * Given a symbolizer property, get the corresponding CSS property
451     *     from the <cssMap>.
452     *
453     * Parameters:
454     * sym - {String} A symbolizer property name.
455     *
456     * Returns:
457     * {String} A CSS property name or null if none found.
458     */
459    getCssProperty: function(sym) {
460        var css = null;
461        for(var prop in this.cssMap) {
462            if(this.cssMap[prop] == sym) {
463                css = prop;
464                break;
465            }
466        }
467        return css;
468    },
469   
470    /**
471     * Method: getGraphicFormat
472     * Given a href for an external graphic, try to determine the mime-type.
473     *     This method doesn't try too hard, and will fall back to
474     *     <defautlGraphicFormat> if one of the known <graphicFormats> is not
475     *     the file extension of the provided href.
476     *
477     * Parameters:
478     * href - {String}
479     *
480     * Returns:
481     * {String} The graphic format.
482     */
483    getGraphicFormat: function(href) {
484        var format, regex;
485        for(var key in this.graphicFormats) {
486            if(this.graphicFormats[key].test(href)) {
487                format = key;
488                break;
489            }
490        }
491        return format || this.defautlGraphicFormat;
492    },
493   
494    /**
495     * Property: defaultGraphicFormat
496     * {String} If none other can be determined from <getGraphicFormat>, this
497     *     default will be returned.
498     */
499    defaultGraphicFormat: "image/png",
500   
501    /**
502     * Property: graphicFormats
503     * {Object} Mapping of image mime-types to regular extensions matching
504     *     well-known file extensions.
505     */
506    graphicFormats: {
507        "image/jpeg": /\.jpe?g$/i,
508        "image/gif": /\.gif$/i,
509        "image/png": /\.png$/i
510    },
511
512    /**
513     * Method: write
514     *
515     * Parameters:
516     * sld - {Object} An object representing the SLD.
517     *
518     * Returns:
519     * {DOMElement} The root of an SLD document.
520     */
521    write: function(sld) {
522        return this.writers.sld.StyledLayerDescriptor.apply(this, [sld]);
523    },
524   
525    /**
526     * Property: writers
527     * As a compliment to the readers property, this structure contains public
528     *     writing functions grouped by namespace alias and named like the
529     *     node names they produce.
530     */
531    writers: OpenLayers.Util.applyDefaults({
532        "sld": {
533            "StyledLayerDescriptor": function(sld) {
534                var root = this.createElementNSPlus(
535                    "sld:StyledLayerDescriptor",
536                    {attributes: {
537                        "version": this.VERSION,
538                        "xsi:schemaLocation": this.schemaLocation
539                    }}
540                );
541
542                // For ArcGIS Server it is necessary to define this
543                // at the root level (see ticket:2166).
544                root.setAttribute("xmlns:ogc", this.namespaces.ogc);
545                root.setAttribute("xmlns:gml", this.namespaces.gml);
546
547                // add in optional name
548                if(sld.name) {
549                    this.writeNode("Name", sld.name, root);
550                }
551                // add in optional title
552                if(sld.title) {
553                    this.writeNode("Title", sld.title, root);
554                }
555                // add in optional description
556                if(sld.description) {
557                    this.writeNode("Abstract", sld.description, root);
558                }
559                // add in named layers
560                // allow namedLayers to be an array
561                if(sld.namedLayers instanceof Array) {
562                    for(var i=0, len=sld.namedLayers.length; i<len; ++i) {
563                        this.writeNode("NamedLayer", sld.namedLayers[i], root);
564                    }
565                } else {
566                    for(var name in sld.namedLayers) {
567                        this.writeNode("NamedLayer", sld.namedLayers[name], root);
568                    }
569                }
570                return root;
571            },
572            "Name": function(name) {
573                return this.createElementNSPlus("sld:Name", {value: name});
574            },
575            "Title": function(title) {
576                return this.createElementNSPlus("sld:Title", {value: title});
577            },
578            "Abstract": function(description) {
579                return this.createElementNSPlus(
580                    "sld:Abstract", {value: description}
581                );
582            },
583            "NamedLayer": function(layer) {
584                var node = this.createElementNSPlus("sld:NamedLayer");
585
586                // add in required name
587                this.writeNode("Name", layer.name, node);
588
589                // optional sld:LayerFeatureConstraints here
590
591                // add in named styles
592                if(layer.namedStyles) {
593                    for(var i=0, len=layer.namedStyles.length; i<len; ++i) {
594                        this.writeNode(
595                            "NamedStyle", layer.namedStyles[i], node
596                        );
597                    }
598                }
599               
600                // add in user styles
601                if(layer.userStyles) {
602                    for(var i=0, len=layer.userStyles.length; i<len; ++i) {
603                        this.writeNode(
604                            "UserStyle", layer.userStyles[i], node
605                        );
606                    }
607                }
608               
609                return node;
610            },
611            "NamedStyle": function(name) {
612                var node = this.createElementNSPlus("sld:NamedStyle");
613                this.writeNode("Name", name, node);
614                return node;
615            },
616            "UserStyle": function(style) {
617                var node = this.createElementNSPlus("sld:UserStyle");
618
619                // add in optional name
620                if(style.name) {
621                    this.writeNode("Name", style.name, node);
622                }
623                // add in optional title
624                if(style.title) {
625                    this.writeNode("Title", style.title, node);
626                }
627                // add in optional description
628                if(style.description) {
629                    this.writeNode("Abstract", style.description, node);
630                }
631               
632                // add isdefault
633                if(style.isDefault) {
634                    this.writeNode("IsDefault", style.isDefault, node);
635                }
636               
637                // add FeatureTypeStyles
638                if (this.multipleSymbolizers && style.rules) {
639                    // group style objects by symbolizer zIndex
640                    var rulesByZ = {
641                        0: []
642                    };
643                    var zValues = [0];
644                    var rule, ruleMap, symbolizer, zIndex, clone;
645                    for (var i=0, ii=style.rules.length; i<ii; ++i) {
646                        rule = style.rules[i];
647                        if (rule.symbolizers) {
648                            ruleMap = {};
649                            for (var j=0, jj=rule.symbolizers.length; j<jj; ++j) {
650                                symbolizer = rule.symbolizers[j];
651                                zIndex = symbolizer.zIndex;
652                                if (!(zIndex in ruleMap)) {
653                                    clone = rule.clone();
654                                    clone.symbolizers = [];
655                                    ruleMap[zIndex] = clone;
656                                }
657                                ruleMap[zIndex].symbolizers.push(symbolizer.clone());
658                            }
659                            for (zIndex in ruleMap) {
660                                if (!(zIndex in rulesByZ)) {
661                                    zValues.push(zIndex);
662                                    rulesByZ[zIndex] = [];
663                                }
664                                rulesByZ[zIndex].push(ruleMap[zIndex]);
665                            }
666                        } else {
667                            // no symbolizers in rule
668                            rulesByZ[0].push(rule.clone());
669                        }
670                    }
671                    // write one FeatureTypeStyle per zIndex
672                    zValues.sort();
673                    var rules;
674                    for (var i=0, ii=zValues.length; i<ii; ++i) {
675                        rules = rulesByZ[zValues[i]];
676                        if (rules.length > 0) {
677                            clone = style.clone();
678                            clone.rules = rulesByZ[zValues[i]];
679                            this.writeNode("FeatureTypeStyle", clone, node);
680                        }
681                    }                   
682                } else {
683                    this.writeNode("FeatureTypeStyle", style, node);
684                }
685               
686                return node;
687            },
688            "IsDefault": function(bool) {
689                return this.createElementNSPlus(
690                    "sld:IsDefault", {value: (bool) ? "1" : "0"}
691                );
692            },
693            "FeatureTypeStyle": function(style) {
694                var node = this.createElementNSPlus("sld:FeatureTypeStyle");
695               
696                // OpenLayers currently stores no Name, Title, Abstract,
697                // FeatureTypeName, or SemanticTypeIdentifier information
698                // related to FeatureTypeStyle
699               
700                // add in rules
701                for(var i=0, len=style.rules.length; i<len; ++i) {
702                    this.writeNode("Rule", style.rules[i], node);
703                }
704               
705                return node;
706            },
707            "Rule": function(rule) {
708                var node = this.createElementNSPlus("sld:Rule");
709
710                // add in optional name
711                if(rule.name) {
712                    this.writeNode("Name", rule.name, node);
713                }
714                // add in optional title
715                if(rule.title) {
716                    this.writeNode("Title", rule.title, node);
717                }
718                // add in optional description
719                if(rule.description) {
720                    this.writeNode("Abstract", rule.description, node);
721                }
722               
723                // add in LegendGraphic here
724               
725                // add in optional filters
726                if(rule.elseFilter) {
727                    this.writeNode("ElseFilter", null, node);
728                } else if(rule.filter) {
729                    this.writeNode("ogc:Filter", rule.filter, node);
730                }
731               
732                // add in scale limits
733                if(rule.minScaleDenominator != undefined) {
734                    this.writeNode(
735                        "MinScaleDenominator", rule.minScaleDenominator, node
736                    );
737                }
738                if(rule.maxScaleDenominator != undefined) {
739                    this.writeNode(
740                        "MaxScaleDenominator", rule.maxScaleDenominator, node
741                    );
742                }
743               
744                var type, symbolizer;
745                if (this.multipleSymbolizers && rule.symbolizers) {
746                    var symbolizer;
747                    for (var i=0, ii=rule.symbolizers.length; i<ii; ++i) {
748                        symbolizer = rule.symbolizers[i];
749                        type = symbolizer.CLASS_NAME.split(".").pop();
750                        this.writeNode(
751                            type + "Symbolizer", symbolizer, node
752                        );
753                    }
754                } else {
755                    // add in symbolizers (relies on geometry type keys)
756                    var types = OpenLayers.Style.SYMBOLIZER_PREFIXES;
757                    for(var i=0, len=types.length; i<len; ++i) {
758                        type = types[i];
759                        symbolizer = rule.symbolizer[type];
760                        if(symbolizer) {
761                            this.writeNode(
762                                type + "Symbolizer", symbolizer, node
763                            );
764                        }
765                    }
766                }
767                return node;
768
769            },
770            "ElseFilter": function() {
771                return this.createElementNSPlus("sld:ElseFilter");
772            },
773            "MinScaleDenominator": function(scale) {
774                return this.createElementNSPlus(
775                    "sld:MinScaleDenominator", {value: scale}
776                );
777            },
778            "MaxScaleDenominator": function(scale) {
779                return this.createElementNSPlus(
780                    "sld:MaxScaleDenominator", {value: scale}
781                );
782            },
783            "LineSymbolizer": function(symbolizer) {
784                var node = this.createElementNSPlus("sld:LineSymbolizer");
785                this.writeNode("Stroke", symbolizer, node);
786                return node;
787            },
788            "Stroke": function(symbolizer) {
789                var node = this.createElementNSPlus("sld:Stroke");
790
791                // GraphicFill here
792                // GraphicStroke here
793
794                // add in CssParameters
795                if(symbolizer.strokeColor != undefined) {
796                    this.writeNode(
797                        "CssParameter",
798                        {symbolizer: symbolizer, key: "strokeColor"},
799                        node
800                    );
801                }
802                if(symbolizer.strokeOpacity != undefined) {
803                    this.writeNode(
804                        "CssParameter",
805                        {symbolizer: symbolizer, key: "strokeOpacity"},
806                        node
807                    );
808                }
809                if(symbolizer.strokeWidth != undefined) {
810                    this.writeNode(
811                        "CssParameter",
812                        {symbolizer: symbolizer, key: "strokeWidth"},
813                        node
814                    );
815                }
816                if(symbolizer.strokeDashstyle != undefined && symbolizer.strokeDashstyle !== "solid") {
817                    // assumes valid stroke-dasharray value
818                    this.writeNode(
819                        "CssParameter", 
820                        {symbolizer: symbolizer, key: "strokeDashstyle"},
821                        node
822                    );
823                }
824                if(symbolizer.strokeLinecap != undefined) {
825                    this.writeNode(
826                        "CssParameter", 
827                        {symbolizer: symbolizer, key: "strokeLinecap"},
828                        node
829                    );
830                }
831                return node;
832            },
833            "CssParameter": function(obj) {
834                // not handling ogc:expressions for now
835                return this.createElementNSPlus("sld:CssParameter", {
836                    attributes: {name: this.getCssProperty(obj.key)},
837                    value: obj.symbolizer[obj.key]
838                });
839            },
840            "TextSymbolizer": function(symbolizer) {
841                var node = this.createElementNSPlus("sld:TextSymbolizer");
842                // add in optional Label
843                if(symbolizer.label != null) {
844                    this.writeNode("Label", symbolizer.label, node);
845                }
846                // add in optional Font
847                if(symbolizer.fontFamily != null ||
848                   symbolizer.fontSize != null ||
849                   symbolizer.fontWeight != null ||
850                   symbolizer.fontStyle != null) {
851                    this.writeNode("Font", symbolizer, node);
852                }
853                // add in optional Halo
854                if(symbolizer.haloRadius != null ||
855                   symbolizer.haloColor != null ||
856                   symbolizer.haloOpacity != null) {
857                    this.writeNode("Halo", symbolizer, node);
858                }
859                // add in optional Fill
860                if(symbolizer.fillColor != null ||
861                   symbolizer.fillOpacity != null) {
862                    this.writeNode("Fill", symbolizer, node);
863                }
864                return node;
865            },
866            "Font": function(symbolizer) {
867                var node = this.createElementNSPlus("sld:Font");
868                // add in CssParameters
869                if(symbolizer.fontFamily) {
870                    this.writeNode(
871                        "CssParameter",
872                        {symbolizer: symbolizer, key: "fontFamily"},
873                        node
874                    );
875                }
876                if(symbolizer.fontSize) {
877                    this.writeNode(
878                        "CssParameter",
879                        {symbolizer: symbolizer, key: "fontSize"},
880                        node
881                    );
882                }
883                if(symbolizer.fontWeight) {
884                    this.writeNode(
885                        "CssParameter",
886                        {symbolizer: symbolizer, key: "fontWeight"},
887                        node
888                    );
889                }
890                if(symbolizer.fontStyle) {
891                    this.writeNode(
892                        "CssParameter",
893                        {symbolizer: symbolizer, key: "fontStyle"},
894                        node
895                    );
896                }
897                return node;
898            },
899            "Label": function(label) {
900                // only the simplest of ogc:expression handled
901                // {label: "some text and a ${propertyName}"}
902                var node = this.createElementNSPlus("sld:Label");
903                var tokens = label.split("${");
904                node.appendChild(this.createTextNode(tokens[0]));
905                var item, last;
906                for(var i=1, len=tokens.length; i<len; i++) {
907                    item = tokens[i];
908                    last = item.indexOf("}"); 
909                    if(last > 0) {
910                        this.writeNode(
911                            "ogc:PropertyName",
912                            {property: item.substring(0, last)},
913                            node
914                        );
915                        node.appendChild(
916                            this.createTextNode(item.substring(++last))
917                        );
918                    } else {
919                        // no ending }, so this is a literal ${
920                        node.appendChild(
921                            this.createTextNode("${" + item)
922                        );
923                    }
924                }
925                return node;
926            },
927            "Halo": function(symbolizer) {
928                var node = this.createElementNSPlus("sld:Halo");
929                if(symbolizer.haloRadius) {
930                    this.writeNode("Radius", symbolizer.haloRadius, node);
931                }
932                if(symbolizer.haloColor || symbolizer.haloOpacity) {
933                    this.writeNode("Fill", {
934                        fillColor: symbolizer.haloColor,
935                        fillOpacity: symbolizer.haloOpacity
936                    }, node);
937                }
938                return node;
939            },
940            "Radius": function(value) {
941                return this.createElementNSPlus("sld:Radius", {
942                    value: value
943                });
944            },
945            "RasterSymbolizer": function(symbolizer) {
946                var node = this.createElementNSPlus("sld:RasterSymbolizer");
947                if (symbolizer.geometry) {
948                    this.writeNode("Geometry", symbolizer.geometry, node);
949                }
950                if (symbolizer.opacity) {
951                    this.writeNode("Opacity", symbolizer.opacity, node);
952                }
953                if (symbolizer.colorMap) {
954                    this.writeNode("ColorMap", symbolizer.colorMap, node);
955                }
956                return node;
957            },
958            "Geometry": function(geometry) {
959                var node = this.createElementNSPlus("sld:Geometry");
960                if (geometry.property) {
961                    this.writeNode("ogc:PropertyName", geometry, node);
962                }
963                return node;
964            },
965            "ColorMap": function(colorMap) {
966                var node = this.createElementNSPlus("sld:ColorMap");
967                for (var i=0, len=colorMap.length; i<len; ++i) {
968                    this.writeNode("ColorMapEntry", colorMap[i], node);
969                }
970                return node;
971            },
972            "ColorMapEntry": function(colorMapEntry) {
973                var node = this.createElementNSPlus("sld:ColorMapEntry");
974                var a = colorMapEntry;
975                node.setAttribute("color", a.color);
976                a.opacity !== undefined && node.setAttribute("opacity",
977                    parseFloat(a.opacity));
978                a.quantity !== undefined && node.setAttribute("quantity",
979                    parseFloat(a.quantity));
980                a.label !== undefined && node.setAttribute("label", a.label);
981                return node;
982            },
983            "PolygonSymbolizer": function(symbolizer) {
984                var node = this.createElementNSPlus("sld:PolygonSymbolizer");
985                if(symbolizer.fill !== false) {
986                    this.writeNode("Fill", symbolizer, node);
987                }
988                if(symbolizer.stroke !== false) {
989                    this.writeNode("Stroke", symbolizer, node);
990                }
991                return node;
992            },
993            "Fill": function(symbolizer) {
994                var node = this.createElementNSPlus("sld:Fill");
995               
996                // GraphicFill here
997               
998                // add in CssParameters
999                if(symbolizer.fillColor) {
1000                    this.writeNode(
1001                        "CssParameter",
1002                        {symbolizer: symbolizer, key: "fillColor"},
1003                        node
1004                    );
1005                }
1006                if(symbolizer.fillOpacity != null) {
1007                    this.writeNode(
1008                        "CssParameter",
1009                        {symbolizer: symbolizer, key: "fillOpacity"},
1010                        node
1011                    );
1012                }
1013                return node;
1014            },
1015            "PointSymbolizer": function(symbolizer) {
1016                var node = this.createElementNSPlus("sld:PointSymbolizer");
1017                this.writeNode("Graphic", symbolizer, node);
1018                return node;
1019            },
1020            "Graphic": function(symbolizer) {
1021                var node = this.createElementNSPlus("sld:Graphic");
1022                if(symbolizer.externalGraphic != undefined) {
1023                    this.writeNode("ExternalGraphic", symbolizer, node);
1024                } else {
1025                    this.writeNode("Mark", symbolizer, node);
1026                }
1027               
1028                if(symbolizer.graphicOpacity != undefined) {
1029                    this.writeNode("Opacity", symbolizer.graphicOpacity, node);
1030                }
1031                if(symbolizer.pointRadius != undefined) {
1032                    this.writeNode("Size", symbolizer.pointRadius * 2, node);
1033                }
1034                if(symbolizer.rotation != undefined) {
1035                    this.writeNode("Rotation", symbolizer.rotation, node);
1036                }
1037                return node;
1038            },
1039            "ExternalGraphic": function(symbolizer) {
1040                var node = this.createElementNSPlus("sld:ExternalGraphic");
1041                this.writeNode(
1042                    "OnlineResource", symbolizer.externalGraphic, node
1043                );
1044                var format = symbolizer.graphicFormat ||
1045                             this.getGraphicFormat(symbolizer.externalGraphic);
1046                this.writeNode("Format", format, node);
1047                return node;
1048            },
1049            "Mark": function(symbolizer) {
1050                var node = this.createElementNSPlus("sld:Mark");
1051                if(symbolizer.graphicName) {
1052                    this.writeNode("WellKnownName", symbolizer.graphicName, node);
1053                }
1054                if (symbolizer.fill !== false) {
1055                    this.writeNode("Fill", symbolizer, node);
1056                }
1057                if (symbolizer.stroke !== false) {
1058                    this.writeNode("Stroke", symbolizer, node);
1059                }
1060                return node;
1061            },
1062            "WellKnownName": function(name) {
1063                return this.createElementNSPlus("sld:WellKnownName", {
1064                    value: name
1065                });
1066            },
1067            "Opacity": function(value) {
1068                return this.createElementNSPlus("sld:Opacity", {
1069                    value: value
1070                });
1071            },
1072            "Size": function(value) {
1073                return this.createElementNSPlus("sld:Size", {
1074                    value: value
1075                });
1076            },
1077            "Rotation": function(value) {
1078                return this.createElementNSPlus("sld:Rotation", {
1079                    value: value
1080                });
1081            },
1082            "OnlineResource": function(href) {
1083                return this.createElementNSPlus("sld:OnlineResource", {
1084                    attributes: {
1085                        "xlink:type": "simple",
1086                        "xlink:href": href
1087                    }
1088                });
1089            },
1090            "Format": function(format) {
1091                return this.createElementNSPlus("sld:Format", {
1092                    value: format
1093                });
1094            }
1095        }
1096    }, OpenLayers.Format.Filter.v1_0_0.prototype.writers),
1097   
1098    CLASS_NAME: "OpenLayers.Format.SLD.v1" 
1099
1100});
Note: See TracBrowser for help on using the repository browser.