I added an <IsDefault>true</IsDefault> element to the UserStyle I wish to use for the requested layer. This made no difference unfortunately. Either with or without the IsDefault element the correct UserStyle is applied for the layer and all styles work correctly except for the TextSymbolizer - it will render a literal character string fine but doesn't work with a property name. If I specify a non-existent property name I receive an error message which suggests that GeoServer is attempting to apply the TextSymbolizer:
The requested Style can not be used with this layer. The style specifies an attribute of <non-existent property> and the layer is: gis_geosmart:Test2 Cheers Adam ________________________________________ From: [email protected] [[email protected]] On Behalf Of Andrea Aime [[email protected]] Sent: 15 July 2011 20:22 To: Adam Ratcliffe Cc: [email protected] Subject: Re: [Geoserver-users] Problem with dynamic label values when using an external SLD On Fri, Jul 15, 2011 at 1:41 AM, Adam Ratcliffe <[email protected]<mailto:[email protected]>> wrote: I believe I am using "library mode", that's triggered when both the SLD and LAYERS parameters are included in the request right? Nope, &sld and layers are all that's needed. From the spec: ------------- To make the HTTP-GET methods more practical for use, the SLD can also be used in one of two different modes depending on whether the LAYERS parameter is present in the request. If it is not present, then all layers identified in the SLD document are rendered with all defined styles, which is equivalent to the XML-POST method of usage. If the LAYERS parameter is present, then only the layers identified by that parameter are rendered and the SLD is used as a “style library”. ------------- The correct UserStyle is being applied from the external SLD as the PointSymbolizer from the UserStyle is being used and even the TextSymbolizer works if I use a static string instead of referencing a feature property. Here's an example request and the full SLD: http://localhost:8080/geoserver/wms?TILED=true&TRANSPARENT=true&FORMAT=image%2Fpng&SLD=http%3A%2F%2Flocalhost%2Fprojects%2Fol-wfs%2Fwww%2Fcompanies%2F1%2Fstyles.sld&DC=1310686489420&LAYERS=gis_geosmart%3ATest2&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&SRS=EPSG%3A900913&BBOX=19450471.961275,-4441908.5877125,19470039.840512,-4422340.708475&WIDTH=256&HEIGHT=256 <sld:StyledLayerDescriptor xmlns:sld="http://www.opengis.net/sld" version="1.0.0" xsi:schemaLocation="http://www.opengis.net/sld http://schemas.opengis.net/sld/1.0.0/StyledLayerDescriptor.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml"> <sld:NamedLayer> <sld:Name>gis_geosmart:Test2</sld:Name> <sld:UserStyle> <sld:Name>default</sld:Name> <sld:FeatureTypeStyle> <sld:Rule> <sld:PointSymbolizer> <sld:Graphic> <sld:Mark> <sld:WellKnownName>circle</sld:WellKnownName> <sld:Fill> <sld:CssParameter name="fill">#3886D9</sld:CssParameter> <sld:CssParameter name="fill-opacity">0.4</sld:CssParameter> </sld:Fill> <sld:Stroke> <sld:CssParameter name="stroke">#3886D9</sld:CssParameter> <sld:CssParameter name="stroke-opacity">1</sld:CssParameter> <sld:CssParameter name="stroke-width">1</sld:CssParameter> </sld:Stroke> </sld:Mark> <sld:Size>12</sld:Size> </sld:Graphic> </sld:PointSymbolizer> <sld:TextSymbolizer> <sld:Label> <ogc:PropertyName>Type_CODE</ogc:PropertyName> </sld:Label> <sld:Fill> <sld:CssParameter name="fill">#000000</sld:CssParameter> </sld:Fill> </sld:TextSymbolizer> </sld:Rule> </sld:FeatureTypeStyle> </sld:UserStyle> <sld:UserStyle> <sld:Name>select</sld:Name> <sld:FeatureTypeStyle> <sld:Rule> <sld:PointSymbolizer> <sld:Graphic> <sld:Mark> <sld:WellKnownName>circle</sld:WellKnownName> <sld:Fill> <sld:CssParameter name="fill">#0000FF</sld:CssParameter> <sld:CssParameter name="fill-opacity">0.4</sld:CssParameter> </sld:Fill> <sld:Stroke> <sld:CssParameter name="stroke">#0000FF</sld:CssParameter> <sld:CssParameter name="stroke-opacity">1</sld:CssParameter> <sld:CssParameter name="stroke-width">1</sld:CssParameter> </sld:Stroke> </sld:Mark> <sld:Size>12</sld:Size> </sld:Graphic> </sld:PointSymbolizer> </sld:Rule> </sld:FeatureTypeStyle> </sld:UserStyle> <sld:UserStyle> <sld:Name>temporary</sld:Name> <sld:FeatureTypeStyle> <sld:Rule> <sld:PointSymbolizer> <sld:Graphic> <sld:Mark> <sld:WellKnownName>circle</sld:WellKnownName> <sld:Fill> <sld:CssParameter name="fill">#A80510</sld:CssParameter> <sld:CssParameter name="fill-opacity">0.4</sld:CssParameter> </sld:Fill> <sld:Stroke> <sld:CssParameter name="stroke">#A80510</sld:CssParameter> <sld:CssParameter name="stroke-opacity">1</sld:CssParameter> <sld:CssParameter name="stroke-width">1</sld:CssParameter> </sld:Stroke> </sld:Mark> <sld:Size>12</sld:Size> </sld:Graphic> </sld:PointSymbolizer> </sld:Rule> </sld:FeatureTypeStyle> </sld:UserStyle> <sld:UserStyle> <sld:FeatureTypeStyle/> </sld:UserStyle> </sld:NamedLayer> </sld:StyledLayerDescriptor> The above won't work in library mode. When in library mode the code will look in the sld in turn for each layer in layers. If you specified a style name for that layer, it will pick the userstyle with that name under the current layer. If you did not specify a style the following rule applies (again, citing verbatim from the spec): ---- The IsDefault element identifies whether a style is the default style of a layer, for use in SLD ‘library mode’ when rendering or for storing inside of a map server. IsDefault uses “1” for true and “0” for false. The default value is “0”. ---- Unfortunately you don't have any style there marked as default, so the style library will get ignored and the built-in default style in the server will be used instead Cheers Andrea -- ------------------------------------------------------- Ing. Andrea Aime GeoSolutions S.A.S. Tech lead Via Poggio alle Viti 1187 55054 Massarosa (LU) Italy phone: +39 0584 962313 fax: +39 0584 962313 http://www.geo-solutions.it http://geo-solutions.blogspot.com/ http://www.youtube.com/user/GeoSolutionsIT http://www.linkedin.com/in/andreaaime http://twitter.com/geowolf ------------------------------------------------------- ------------------------------------------------------------------------------ AppSumo Presents a FREE Video for the SourceForge Community by Eric Ries, the creator of the Lean Startup Methodology on "Lean Startup Secrets Revealed." This video shows you how to validate your ideas, optimize your ideas and identify your business strategy. http://p.sf.net/sfu/appsumosfdev2dev _______________________________________________ Geoserver-users mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/geoserver-users
