From 6411a6c0efd2f232b57bad5ddabbf2c56eda6162 Mon Sep 17 00:00:00 2001 From: Bart van den Eijnden Date: Fri, 24 Feb 2012 14:58:36 +0100 Subject: [PATCH 1/7] implement TextSymbolizer->PointPlacement --- lib/OpenLayers/Feature/.Vector.js.swp | Bin 0 -> 16384 bytes lib/OpenLayers/Format/SLD/v1.js | 126 ++++++++++++++++++++++++++ tests/Format/SLD/v1_0_0.html | 13 +++ 3 files changed, 139 insertions(+) create mode 100644 lib/OpenLayers/Feature/.Vector.js.swp diff --git a/lib/OpenLayers/Feature/.Vector.js.swp b/lib/OpenLayers/Feature/.Vector.js.swp new file mode 100644 index 0000000000000000000000000000000000000000..264aae31ffdf200292c7a018095878b91b52334f GIT binary patch literal 16384 zcmeHNO>87b6)t|V5R&kdAR$0Pg;!*3WA}J%SkP=R%-UYouxnfEnJh>fK}~m!yX>Cs zp}TsV*^L)P;*u2-KPMy({N<1XC>KC*iv&4ucy{gwW)mwOU{WATSw?uHglaSr7FKs^chkue6-b_f3rE(N-RdeE{ z+RcwxJRk6Qo{QZW_iTQ^{9cmm%@5PWixQtjnWWxscA_$_(lOu|IEH}-$kO7O1yy-^>Vx#52fN3#bH$DU z$ADwNG2j?*3^)cH1C9a5!0V9#IXp$ajDfw;4DP_(-*D*unz?*ae)CZMe@*?qDS!D; z{eMjTiYfn`>A?2$Z&SZz>c4%c{!OO*L397xp?Xv7ZjJ%RfMdWh;23ZWI0hU8jseGj zW56-s7;p?6!2k;gSw#7HwE=+N|Lyz#kKaK^1Uw9!0`39+@peLP1HS`)27Dj*DzFbo zAOjNM5-$$23!JGfsX8l{a0_@6=mTBgGVlm+4p;)-54`wRj34+4kOM;?1U>`28@M0%`&$V4D{vcl9vA@) z;La&Ro(8S~4*}2LL&$X?12}LE_#|)^m;t7MKjKWrcYtpJw}2;s5NHD*0X__T0C*4Z zD{PoN0n7upVcQphUjsh{eggauxCuN4bOB}mHt_#nR9&-li=}M9CC+iQh$*u7l@up9 zIAwICPjJwFaiGJaWrHNnWSXnv9W7d&{P4`l53e}+p<6d+XDO_RYmfw@FL=e*bqscuRxnyo%e`$@oUXSOzEBVMvwJ+C=el!YSRp^?}tY*#wq)sV-avTkP@vWyN` zz^#KQ8O9-Nn$0N#YmYE0SWS+n!Wyqdmp6O6@O1k~ImRQ0*6t%_5F3TR7OL$F8Pdzj zzsDv7<_f1wv|!_^5l&a>LEDZ@?Onc;QJldV@>GtM&$0;N7{L5GDg)Z%@Bj|SR~!m? zcfeGSdo}l(h#hSo5UE{?ioVv?s@0x|GMM9Vm}E5Rm*HG9g7S6*ft6Et=#?avX%cx8 zBrVU;{ZRO!>L623QfrfvfO2%b@ks$Prvq?56;i^3dSk1Cl4+a;9-@ZH$8?{AzQTNg zM_2MR<*`J3>1m|SypB3Wz7=<)aFheuj;S%8HofY`hK?p@Vl2wOwHQeHR$O~)eajfS zRr0ATF>C6({s;8}p039jnna8SywCDTPT47>oI!7FW5$ek4lv892efpvQ7PiQTERd>C%vu4Dxc*!-OKIRz`}M*b zOBYZvpga%(zAvH({!b;_gJ==MgPD)0k7do~6Rbk(awz&kCdUy!W+0_`bxX{C6QcB! z#S*9&HH^CWmPxFZ$BDEyu_7zF^gKadty2UzvT`m^Qzr1KQgmQ~ey9D-eVVLwd;BzOPB5njyXo!feZ#N-l#0ssEI8Ez(cfrCYf=S zVj*I*p_OVVT?|9Uu``pg@;YJGuGCk|!H#VhCV^z)L9D~Ev-CAwy!tOA@G}tIs zrS*;NwJRMoU5^ne(v)^LKD)7bbpyrScrQ-&V^glCQ#~7I$~$U)v#n-U_|^^5Y|_q^ z_Vz{ExwyVfl;(ZBL{P~emns=iR=}G9j>;0ui(~6vlI}E- zK*xKvv+Pa#w1hyNVXHjG^b!foljy})NsM|YNz!b_qg#0oH6fe_6Bu$rrNm0aSxV1u zuU6_%kVsdO;TSI&p`_FP3|(AUI6J?%aAr|W-_>~0s_KAFXBYuPo{!!&n za11yG90QI4$ADwNG2j?*3^)cH1FusC4$i4pd7}QAABgZN5ZMrK%-C^`lb9F32sQK; zE^pW$f)3{JE^e-f^?0?}k&@Ly_EWV?&4*(2m4Tj7on{ ztLfvt*gkc7L0`36>~3dTpeS~ZYE{Doo5Va_8>wwgNF9kxV9Rccsp6p4Fifz0x}{oo zW1)80KXhc}6&8pbg3g%DcWAA 1/3 && x < 2/3) { + labelAlign = 'c'; + } else if (x >= 2/3) { + labelAlign = 'r'; + } + if (y <= 1/3) { + labelAlign += 'b'; + } else if (y > 1/3 && y < 2/3) { + labelAlign += 'm'; + } else if (x >= 2/3) { + labelAlign += 't'; + } + symbolizer.labelAlign = labelAlign; + }, + "AnchorPoint": function(node, symbolizer) { + this.readChildNodes(node, symbolizer); + }, + "AnchorPointX": function(node, symbolizer) { + var labelAnchorPointX = this.readers.ogc._expression.call(this, node); + // always string, could be empty string + if(labelAnchorPointX) { + symbolizer.labelAnchorPointX = labelAnchorPointX; + } + }, + "AnchorPointY": function(node, symbolizer) { + var labelAnchorPointY = this.readers.ogc._expression.call(this, node); + // always string, could be empty string + if(labelAnchorPointY) { + symbolizer.labelAnchorPointY = labelAnchorPointY; + } + }, + "Displacement": function(node, symbolizer) { + this.readChildNodes(node, symbolizer); + }, + "DisplacementX": function(node, symbolizer) { + var labelXOffset = this.readers.ogc._expression.call(this, node); + // always string, could be empty string + if(labelXOffset) { + symbolizer.labelXOffset = labelXOffset; + } + }, + "DisplacementY": function(node, symbolizer) { + var labelYOffset = this.readers.ogc._expression.call(this, node); + // always string, could be empty string + if(labelYOffset) { + symbolizer.labelYOffset = labelYOffset; + } + }, "Label": function(node, symbolizer) { var value = this.readers.ogc._expression.call(this, node); if (value) { @@ -881,6 +939,11 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, { symbolizer.fontStyle != null) { this.writeNode("Font", symbolizer, node); } + // add in optional LabelPlacement + if (symbolizer.labelAnchorPointX != null || + symbolizer.labelAnchorPointY != null) { + this.writeNode("LabelPlacement", symbolizer, node); + } // add in optional Halo if(symbolizer.haloRadius != null || symbolizer.haloColor != null || @@ -894,6 +957,69 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, { } return node; }, + "LabelPlacement": function(symbolizer) { + var node = this.createElementNSPlus("sld:LabelPlacement"); + if (symbolizer.labelAnchorPointX != null || + symbolizer.labelAnchorPointY != null) { + this.writeNode("PointPlacement", symbolizer, node); + } + return node; + }, + "PointPlacement": function(symbolizer) { + var node = this.createElementNSPlus("sld:PointPlacement"); + if (symbolizer.labelAnchorPointX != null || + symbolizer.labelAnchorPointY != null) { + this.writeNode("AnchorPoint", symbolizer, node); + } + if (symbolizer.labelXOffset != null || + symbolizer.labelYOffset != null) { + this.writeNode("Displacement", symbolizer, node); + } + if (symbolizer.rotation != null) { + this.writeNode("Rotation", symbolizer.rotation, node); + } + return node; + }, + "AnchorPoint": function(symbolizer) { + var node = this.createElementNSPlus("sld:AnchorPoint"); + if (symbolizer.labelAnchorPointX != null) { + this.writeNode("AnchorPointX", symbolizer.labelAnchorPointX, node); + } + if (symbolizer.labelAnchorPointY != null) { + this.writeNode("AnchorPointY", symbolizer.labelAnchorPointY, node); + } + return node; + }, + "AnchorPointX": function(value) { + return this.createElementNSPlus("sld:AnchorPointX", { + value: value + }); + }, + "AnchorPointY": function(value) { + return this.createElementNSPlus("sld:AnchorPointY", { + value: value + }); + }, + "Displacement": function(symbolizer) { + var node = this.createElementNSPlus("sld:Displacement"); + if (symbolizer.labelXOffset != null) { + this.writeNode("DisplacementX", symbolizer.labelXOffset, node); + } + if (symbolizer.labelYOffset != null) { + this.writeNode("DisplacementY", symbolizer.labelYOffset, node); + } + return node; + }, + "DisplacementX": function(value) { + return this.createElementNSPlus("sld:DisplacementX", { + value: value + }); + }, + "DisplacementY": function(value) { + return this.createElementNSPlus("sld:DisplacementY", { + value: value + }); + }, "Font": function(symbolizer) { var node = this.createElementNSPlus("sld:Font"); // add in CssParameters diff --git a/tests/Format/SLD/v1_0_0.html b/tests/Format/SLD/v1_0_0.html index a31ba6a5f3..37e9e1558a 100644 --- a/tests/Format/SLD/v1_0_0.html +++ b/tests/Format/SLD/v1_0_0.html @@ -47,6 +47,19 @@ 'bold' + 'normal' + '' + + '' + + '' + + '' + + '0.5' + + '0.5' + + '' + + '' + + '5' + + '5' + + '' + + '45' + + '' + + '' + '' + '3' + '' + From f05564cdb3fcb4b071daf01b7cca26396ebea581 Mon Sep 17 00:00:00 2001 From: Bart van den Eijnden Date: Fri, 24 Feb 2012 15:42:49 +0100 Subject: [PATCH 2/7] add support for LinePlacement --- lib/OpenLayers/Format/SLD/v1.js | 28 ++++++++++++++++-- tests/Format/SLD/v1_0_0.html | 51 +++++++++++++++++++++++++++++++-- 2 files changed, 75 insertions(+), 4 deletions(-) diff --git a/lib/OpenLayers/Format/SLD/v1.js b/lib/OpenLayers/Format/SLD/v1.js index ef8dda0ce3..49592aef71 100644 --- a/lib/OpenLayers/Format/SLD/v1.js +++ b/lib/OpenLayers/Format/SLD/v1.js @@ -278,6 +278,16 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, { symbolizer.labelYOffset = labelYOffset; } }, + "LinePlacement": function(node, symbolizer) { + this.readChildNodes(node, symbolizer); + }, + "PerpendicularOffset": function(node, symbolizer) { + var labelPerpendicularOffset = this.readers.ogc._expression.call(this, node); + // always string, could be empty string + if(labelPerpendicularOffset) { + symbolizer.labelPerpendicularOffset = labelPerpendicularOffset; + } + }, "Label": function(node, symbolizer) { var value = this.readers.ogc._expression.call(this, node); if (value) { @@ -940,8 +950,9 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, { this.writeNode("Font", symbolizer, node); } // add in optional LabelPlacement - if (symbolizer.labelAnchorPointX != null || - symbolizer.labelAnchorPointY != null) { + if ((symbolizer.labelAnchorPointX != null || + symbolizer.labelAnchorPointY != null) || + symbolizer.labelPerpendicularOffset != null) { this.writeNode("LabelPlacement", symbolizer, node); } // add in optional Halo @@ -963,8 +974,21 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, { symbolizer.labelAnchorPointY != null) { this.writeNode("PointPlacement", symbolizer, node); } + if (symbolizer.labelPerpendicularOffset != null) { + this.writeNode("LinePlacement", symbolizer, node); + } return node; }, + "LinePlacement": function(symbolizer) { + var node = this.createElementNSPlus("sld:LinePlacement"); + this.writeNode("PerpendicularOffset", symbolizer.labelPerpendicularOffset, node); + return node; + }, + "PerpendicularOffset": function(value) { + return this.createElementNSPlus("sld:PerpendicularOffset", { + value: value + }); + }, "PointPlacement": function(symbolizer) { var node = this.createElementNSPlus("sld:PointPlacement"); if (symbolizer.labelAnchorPointX != null || diff --git a/tests/Format/SLD/v1_0_0.html b/tests/Format/SLD/v1_0_0.html index 37e9e1558a..7b3c50acf2 100644 --- a/tests/Format/SLD/v1_0_0.html +++ b/tests/Format/SLD/v1_0_0.html @@ -522,7 +522,33 @@ t.xml_eq(got, exp, "duplicated rules to write zIndex as FeatureTypeStyle elements"); } - + + function test_label_LinePlacement(t) { + t.plan(1); + var format = new OpenLayers.Format.SLD.v1_0_0({ + multipleSymbolizers: true + }); + var style = new OpenLayers.Style2({ + rules: [ + new OpenLayers.Rule({ + symbolizers: [ + new OpenLayers.Symbolizer.Line({ + strokeColor: "red", + strokeWidth: 3 + }), + new OpenLayers.Symbolizer.Text({ + label: "${FOO}", + labelPerpendicularOffset: 10 + }) + ] + }) + ] + }); + var got = format.writeNode("sld:UserStyle", style); + var exp = readXML("label_lineplacement_test.sld").documentElement; + t.xml_eq(got, exp, "LinePlacement written out correctly"); + } + function test_read_FeatureTypeStyles(t) { t.plan(13); @@ -598,7 +624,6 @@ doc = readXML("polygon_labelhalo.sld"); out = format.write(format.read(doc)); t.xml_eq(out, doc.documentElement, "round-tripped polygon_labelhalo.sld"); - } @@ -880,5 +905,27 @@ --> +
From c7a631c2e5b43616e0ae494855c466c69a068021 Mon Sep 17 00:00:00 2001 From: Bart van den Eijnden Date: Fri, 24 Feb 2012 15:59:14 +0100 Subject: [PATCH 3/7] correct typo --- lib/OpenLayers/Format/SLD/v1.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/OpenLayers/Format/SLD/v1.js b/lib/OpenLayers/Format/SLD/v1.js index 49592aef71..8244c09909 100644 --- a/lib/OpenLayers/Format/SLD/v1.js +++ b/lib/OpenLayers/Format/SLD/v1.js @@ -239,7 +239,7 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, { labelAlign += 'b'; } else if (y > 1/3 && y < 2/3) { labelAlign += 'm'; - } else if (x >= 2/3) { + } else if (y >= 2/3) { labelAlign += 't'; } symbolizer.labelAlign = labelAlign; From 66d3b8192910ec9b5b9b5e3a0bd98d3ea65e2f4c Mon Sep 17 00:00:00 2001 From: Bart van den Eijnden Date: Fri, 24 Feb 2012 17:03:49 +0100 Subject: [PATCH 4/7] remove accidentally commited swap file --- lib/OpenLayers/Feature/.Vector.js.swp | Bin 16384 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 lib/OpenLayers/Feature/.Vector.js.swp diff --git a/lib/OpenLayers/Feature/.Vector.js.swp b/lib/OpenLayers/Feature/.Vector.js.swp deleted file mode 100644 index 264aae31ffdf200292c7a018095878b91b52334f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeHNO>87b6)t|V5R&kdAR$0Pg;!*3WA}J%SkP=R%-UYouxnfEnJh>fK}~m!yX>Cs zp}TsV*^L)P;*u2-KPMy({N<1XC>KC*iv&4ucy{gwW)mwOU{WATSw?uHglaSr7FKs^chkue6-b_f3rE(N-RdeE{ z+RcwxJRk6Qo{QZW_iTQ^{9cmm%@5PWixQtjnWWxscA_$_(lOu|IEH}-$kO7O1yy-^>Vx#52fN3#bH$DU z$ADwNG2j?*3^)cH1C9a5!0V9#IXp$ajDfw;4DP_(-*D*unz?*ae)CZMe@*?qDS!D; z{eMjTiYfn`>A?2$Z&SZz>c4%c{!OO*L397xp?Xv7ZjJ%RfMdWh;23ZWI0hU8jseGj zW56-s7;p?6!2k;gSw#7HwE=+N|Lyz#kKaK^1Uw9!0`39+@peLP1HS`)27Dj*DzFbo zAOjNM5-$$23!JGfsX8l{a0_@6=mTBgGVlm+4p;)-54`wRj34+4kOM;?1U>`28@M0%`&$V4D{vcl9vA@) z;La&Ro(8S~4*}2LL&$X?12}LE_#|)^m;t7MKjKWrcYtpJw}2;s5NHD*0X__T0C*4Z zD{PoN0n7upVcQphUjsh{eggauxCuN4bOB}mHt_#nR9&-li=}M9CC+iQh$*u7l@up9 zIAwICPjJwFaiGJaWrHNnWSXnv9W7d&{P4`l53e}+p<6d+XDO_RYmfw@FL=e*bqscuRxnyo%e`$@oUXSOzEBVMvwJ+C=el!YSRp^?}tY*#wq)sV-avTkP@vWyN` zz^#KQ8O9-Nn$0N#YmYE0SWS+n!Wyqdmp6O6@O1k~ImRQ0*6t%_5F3TR7OL$F8Pdzj zzsDv7<_f1wv|!_^5l&a>LEDZ@?Onc;QJldV@>GtM&$0;N7{L5GDg)Z%@Bj|SR~!m? zcfeGSdo}l(h#hSo5UE{?ioVv?s@0x|GMM9Vm}E5Rm*HG9g7S6*ft6Et=#?avX%cx8 zBrVU;{ZRO!>L623QfrfvfO2%b@ks$Prvq?56;i^3dSk1Cl4+a;9-@ZH$8?{AzQTNg zM_2MR<*`J3>1m|SypB3Wz7=<)aFheuj;S%8HofY`hK?p@Vl2wOwHQeHR$O~)eajfS zRr0ATF>C6({s;8}p039jnna8SywCDTPT47>oI!7FW5$ek4lv892efpvQ7PiQTERd>C%vu4Dxc*!-OKIRz`}M*b zOBYZvpga%(zAvH({!b;_gJ==MgPD)0k7do~6Rbk(awz&kCdUy!W+0_`bxX{C6QcB! z#S*9&HH^CWmPxFZ$BDEyu_7zF^gKadty2UzvT`m^Qzr1KQgmQ~ey9D-eVVLwd;BzOPB5njyXo!feZ#N-l#0ssEI8Ez(cfrCYf=S zVj*I*p_OVVT?|9Uu``pg@;YJGuGCk|!H#VhCV^z)L9D~Ev-CAwy!tOA@G}tIs zrS*;NwJRMoU5^ne(v)^LKD)7bbpyrScrQ-&V^glCQ#~7I$~$U)v#n-U_|^^5Y|_q^ z_Vz{ExwyVfl;(ZBL{P~emns=iR=}G9j>;0ui(~6vlI}E- zK*xKvv+Pa#w1hyNVXHjG^b!foljy})NsM|YNz!b_qg#0oH6fe_6Bu$rrNm0aSxV1u zuU6_%kVsdO;TSI&p`_FP3|(AUI6J?%aAr|W-_>~0s_KAFXBYuPo{!!&n za11yG90QI4$ADwNG2j?*3^)cH1FusC4$i4pd7}QAABgZN5ZMrK%-C^`lb9F32sQK; zE^pW$f)3{JE^e-f^?0?}k&@Ly_EWV?&4*(2m4Tj7on{ ztLfvt*gkc7L0`36>~3dTpeS~ZYE{Doo5Va_8>wwgNF9kxV9Rccsp6p4Fifz0x}{oo zW1)80KXhc}6&8pbg3g%DcWAA Date: Fri, 24 Feb 2012 17:48:35 +0100 Subject: [PATCH 5/7] do not use rotation but use labelRotation instead (thanks @ahocevar for the catch) --- lib/OpenLayers/Format/SLD/v1.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/OpenLayers/Format/SLD/v1.js b/lib/OpenLayers/Format/SLD/v1.js index 8244c09909..3d5bc87c9a 100644 --- a/lib/OpenLayers/Format/SLD/v1.js +++ b/lib/OpenLayers/Format/SLD/v1.js @@ -224,7 +224,10 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, { this.readChildNodes(node, symbolizer); }, "PointPlacement": function(node, symbolizer) { - this.readChildNodes(node, symbolizer); + var config = {}; + this.readChildNodes(node, config); + config.labelRotation = config.rotation; + delete config.rotation; var labelAlign, x = symbolizer.labelAnchorPointX, y = symbolizer.labelAnchorPointY; @@ -242,7 +245,8 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, { } else if (y >= 2/3) { labelAlign += 't'; } - symbolizer.labelAlign = labelAlign; + config.labelAlign = labelAlign; + OpenLayers.Util.applyDefaults(symbolizer, config); }, "AnchorPoint": function(node, symbolizer) { this.readChildNodes(node, symbolizer); @@ -999,8 +1003,8 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, { symbolizer.labelYOffset != null) { this.writeNode("Displacement", symbolizer, node); } - if (symbolizer.rotation != null) { - this.writeNode("Rotation", symbolizer.rotation, node); + if (symbolizer.labelRotation != null) { + this.writeNode("Rotation", symbolizer.labelRotation, node); } return node; }, From 617ba736a29a47e6d218ad9f40b808ab36824494 Mon Sep 17 00:00:00 2001 From: Bart van den Eijnden Date: Fri, 24 Feb 2012 18:20:41 +0100 Subject: [PATCH 6/7] if labelAlign is set, translate to AnchorPointX and AnchorPointY --- lib/OpenLayers/Format/SLD/v1.js | 65 ++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/lib/OpenLayers/Format/SLD/v1.js b/lib/OpenLayers/Format/SLD/v1.js index 3d5bc87c9a..cfd67fa3f7 100644 --- a/lib/OpenLayers/Format/SLD/v1.js +++ b/lib/OpenLayers/Format/SLD/v1.js @@ -948,22 +948,26 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, { } // add in optional Font if(symbolizer.fontFamily != null || - symbolizer.fontSize != null || - symbolizer.fontWeight != null || - symbolizer.fontStyle != null) { - this.writeNode("Font", symbolizer, node); + symbolizer.fontSize != null || + symbolizer.fontWeight != null || + symbolizer.fontStyle != null) { + this.writeNode("Font", symbolizer, node); } // add in optional LabelPlacement - if ((symbolizer.labelAnchorPointX != null || - symbolizer.labelAnchorPointY != null) || + if (symbolizer.labelAnchorPointX != null || + symbolizer.labelAnchorPointY != null || + symbolizer.labelAlign != null || + symbolizer.labelXOffset != null || + symbolizer.labelYOffset != null || + symbolizer.labelRotation != null || symbolizer.labelPerpendicularOffset != null) { - this.writeNode("LabelPlacement", symbolizer, node); + this.writeNode("LabelPlacement", symbolizer, node); } // add in optional Halo if(symbolizer.haloRadius != null || - symbolizer.haloColor != null || - symbolizer.haloOpacity != null) { - this.writeNode("Halo", symbolizer, node); + symbolizer.haloColor != null || + symbolizer.haloOpacity != null) { + this.writeNode("Halo", symbolizer, node); } // add in optional Fill if(symbolizer.fillColor != null || @@ -975,8 +979,12 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, { "LabelPlacement": function(symbolizer) { var node = this.createElementNSPlus("sld:LabelPlacement"); if (symbolizer.labelAnchorPointX != null || - symbolizer.labelAnchorPointY != null) { - this.writeNode("PointPlacement", symbolizer, node); + symbolizer.labelAnchorPointY != null || + symbolizer.labelAlign != null || + symbolizer.labelXOffset != null || + symbolizer.labelYOffset != null || + symbolizer.labelRotation != null) { + this.writeNode("PointPlacement", symbolizer, node); } if (symbolizer.labelPerpendicularOffset != null) { this.writeNode("LinePlacement", symbolizer, node); @@ -996,7 +1004,8 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, { "PointPlacement": function(symbolizer) { var node = this.createElementNSPlus("sld:PointPlacement"); if (symbolizer.labelAnchorPointX != null || - symbolizer.labelAnchorPointY != null) { + symbolizer.labelAnchorPointY != null || + symbolizer.labelAlign != null) { this.writeNode("AnchorPoint", symbolizer, node); } if (symbolizer.labelXOffset != null || @@ -1010,11 +1019,33 @@ OpenLayers.Format.SLD.v1 = OpenLayers.Class(OpenLayers.Format.Filter.v1_0_0, { }, "AnchorPoint": function(symbolizer) { var node = this.createElementNSPlus("sld:AnchorPoint"); - if (symbolizer.labelAnchorPointX != null) { - this.writeNode("AnchorPointX", symbolizer.labelAnchorPointX, node); + var x = symbolizer.labelAnchorPointX, + y = symbolizer.labelAnchorPointY; + if (x != null) { + this.writeNode("AnchorPointX", x, node); } - if (symbolizer.labelAnchorPointY != null) { - this.writeNode("AnchorPointY", symbolizer.labelAnchorPointY, node); + if (y != null) { + this.writeNode("AnchorPointY", y, node); + } + if (x == null && y == null) { + var xAlign = symbolizer.labelAlign.substr(0, 1), + yAlign = symbolizer.labelAlign.substr(1, 1); + if (xAlign === "l") { + x = 0; + } else if (xAlign === "c") { + x = 0.5; + } else if (xAlign === "r") { + x = 1; + } + if (yAlign === "b") { + y = 0; + } else if (yAlign === "m") { + y = 0.5; + } else if (yAlign === "t") { + y = 1; + } + this.writeNode("AnchorPointX", x, node); + this.writeNode("AnchorPointY", y, node); } return node; }, From 12d8220992ba5a6bebb6ac0e9b5989c867729024 Mon Sep 17 00:00:00 2001 From: Bart van den Eijnden Date: Fri, 24 Feb 2012 18:35:20 +0100 Subject: [PATCH 7/7] add a testcase for the labelAlign to AnchorPoint translation --- tests/Format/SLD/v1_0_0.html | 41 ++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/tests/Format/SLD/v1_0_0.html b/tests/Format/SLD/v1_0_0.html index 7b3c50acf2..6fdcd2bf7e 100644 --- a/tests/Format/SLD/v1_0_0.html +++ b/tests/Format/SLD/v1_0_0.html @@ -549,6 +549,28 @@ t.xml_eq(got, exp, "LinePlacement written out correctly"); } + function test_labelAlignToAnchorPosition(t) { + t.plan(1); + var format = new OpenLayers.Format.SLD.v1_0_0({ + multipleSymbolizers: true + }); + var style = new OpenLayers.Style2({ + rules: [ + new OpenLayers.Rule({ + symbolizers: [ + new OpenLayers.Symbolizer.Text({ + label: "${FOO}", + labelAlign: "rb" + }) + ] + }) + ] + }); + var got = format.writeNode("sld:UserStyle", style); + var exp = readXML("label_pointplacement_test.sld").documentElement; + t.xml_eq(got, exp, "PointPlacement with labelAlign written out correctly"); + } + function test_read_FeatureTypeStyles(t) { t.plan(13); @@ -927,5 +949,24 @@ --> +