[OpenLayers-Users] mergeNewParams + Legend

Sascha Müller olaiya at arcor.de
Fri Aug 6 10:22:57 EDT 2010



Hi,

Ok, I've got it a little bit.

1) I changed in VectorLegend.js
GeoExt.VectorLegend.supports = function(layerRecord) {
-    return layerRecord.get("layer") instanceof OpenLayers.Layer.Vector;
+   return layerRecord.get("layer").styleMap;
};

2) I add
"preferredTypes: ["gx_vectorlegend"]" to my LegendPanel.

3) I load a WMS-Layer with a SLD_Body:
var ub = new OpenLayers.Layer.WMS.Post("U-Bahn Test",
                 "http://localhost:8081/geoserver/wms/",
                 {
                     layers: "WL:UBahn",
                     transparent: true,
                     format: 'image/jpeg',
                     sld    : 
"http://localhost:8081/geoserver/styles/myStyle.sld"
                 },
                 {
                     isBaseLayer: false
                 }
             );
             map.addLayer(ub);

4) But, how do I give the WMS layer a styleMap?

var myStyles = new OpenLayers.StyleMap({
         "default": new OpenLayers.Style({
             fillColor: "#ffcc66",
             strokeColor: "#ff9933",
             strokeWidth: 2,
             graphicZIndex: 1
         })
     });

???

4) Do mergeNewParams()



Maybe this is an own thread:
After this works, is there a way, to get the properties out of the sld 
and wrire it in the styleMap? similiar to this thread
http://osgeo-org.1803224.n2.nabble.com/StyleMap-and-dynamic-loaded-styles-td4961340.html#a4961340
The difference is, I got a XML (SLD) back. If not, I have to parse the 
whole SLd and get all the properties and mut them into the styleMap.


regards,

Sascha


> Hi,
>
> On Aug 6, 2010, at 12:23 , Sascha Müller wrote:
>
>    
>> Do I understand it right, for every layer (WMS) I create, I have to
>> give the WMS layer a StyleMap with a "default" render intent? Because I
>> use a VectorLegend?
>>      
> No. The VectorLegend will only be used *if* the WMS layer has a StyleMap. It will still use WMSLegend for other layers
>    
>    
>> I have in my App, depending on the customer, a different number of
>> layers. This sounds like a lot of work for me.
>> Or I have to create a VectorLegend specially for the layer with the
>> large SLD?
>>      
> Yes, just for that layer. Only WMS layers that have a styleMap property will get a VectorLegend if you follow my suggestion.
>
> Regards,
> Andreas.
>
>    
>>      
>>>> This will tell VectorLegend that it supports all layers that have a
>>>>          
>> styleMap.>>  Does it mean, that the Legend accept ONLY layer that have a
>> styleMap or accept ALSO layer that have a styleMap?
>>
>> Another approaches:
>> - If I change from SLD_BODY to SLD (with the URL of the SLD) in
>> mergeNewParams(), prevents this a too long URI?
>> - Is there a way to use 'POST' with GetLegendGraphic?
>>
>> regards,
>>
>> Sascha
>>
>>
>>      
>>> Hi,
>>>
>>> I am pretty sure that the request URI is too long. What you could do is reconfigure the legend type selection sequence, so a VectorLegend rather than a WMSLegend is created. A prerequisite is this non-API hack though:
>>>
>>> GeoExt.VectorLegend.supports = function(layerRecord) {
>>>      return layerRecord.get("layer").styleMap;
>>> };
>>>
>>> This will tell VectorLegend that it supports all layers that have a styleMap.
>>>
>>> Now you can go ahead and create your legendPanel like this:
>>>
>>> var legendPanel = new GeoExt.LegendPanel({
>>>      preferredTypes: ["gx_vectorlegend"]
>>> });
>>>
>>> Finally, when creating your WMS layer with the SLD_BODY (and before you do mergeNewParams), you have to give the WMS layer a StyleMap with a "default" render intent, which you have to give the style object of your SLD.
>>>
>>> Regards,
>>> Andreas.
>>>
>>> On Aug 5, 2010, at 17:45 , Sascha Müller wrote:
>>>
>>>
>>>        
>>>> Hi,
>>>>
>>>> I tried this SLD with only two instead of five rules. It works.
>>>> Could it be, that the request 'GetLegendGraphic' is too long with the
>>>> SLD inside?
>>>> Like mergeNewParams() without 'Post'  in 'OpenLayers.Layer.WMS'.
>>>>
>>>> Is there a way to implement it?
>>>> Or is this more a GeoServer thing?
>>>>
>>>> Sascha
>>>>
>>>>
>>>>
>>>>          
>>>>> Hi,
>>>>>
>>>>> I use:
>>>>>
>>>>> GeoExt: trunk (Revision: 2257)
>>>>> OpenLayers: 2.9
>>>>> GeoExt: 3.2.1
>>>>> GeoServer: 1.7.7
>>>>>
>>>>>
>>>>> I use mergeNewParams() to change the Style of a layer. This approach
>>>>> works except for one layer.
>>>>> This layer contains five rules with filter. The map changes after
>>>>> mergeNewParams(), the legend not.
>>>>> The layername is still there, the images of the five rules are gone.
>>>>>
>>>>> If I use this SLD (see below) for the layer with the GeoServer from
>>>>> start, the layer appears in map and legend. only after
>>>>> mergenewParams() the layer appears not in the legend.
>>>>>
>>>>> The layer uses this:  var addlayer = new OpenLayers.Layer.WMS.Post()
>>>>>
>>>>> SLD
>>>>> ===
>>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>>> <sld:StyledLayerDescriptor xmlns="http://www.opengis.net/sld"
>>>>> xmlns:sld="http://www.opengis.net/sld"
>>>>> xmlns:ogc="http://www.opengis.net/ogc"
>>>>> xmlns:gml="http://www.opengis.net/gml" version="1.0.0">
>>>>> <sld:NamedLayer>
>>>>> <Name>WL:UBahn</Name>
>>>>> <sld:UserStyle>
>>>>> <sld:Name>Default Styler</sld:Name>
>>>>> <sld:Title/>
>>>>> <sld:FeatureTypeStyle>
>>>>> <sld:Name>name</sld:Name>
>>>>> <sld:FeatureTypeName>Feature</sld:FeatureTypeName>
>>>>> <sld:SemanticTypeIdentifier>generic:geometry</sld:SemanticTypeIdentifier>
>>>>> <sld:SemanticTypeIdentifier>colorbrewer:unique:oranges</sld:SemanticTypeIdentifier>
>>>>> <sld:Rule>
>>>>> <sld:MinScaleDenominator>0</sld:MinScaleDenominator>
>>>>> <sld:MaxScaleDenominator>100000000</sld:MaxScaleDenominator>
>>>>> <sld:Name>rule01</sld:Name>
>>>>> <sld:Title>U1</sld:Title>
>>>>> <Filter>
>>>>> <PropertyIsEqualTo>
>>>>> <PropertyName>LINIE</PropertyName>
>>>>> <Literal>U1</Literal>
>>>>> </PropertyIsEqualTo>
>>>>> </Filter>
>>>>> <sld:LineSymbolizer>
>>>>> <sld:Stroke>
>>>>> <sld:CssParameter name="stroke">
>>>>> <Literal>#FEEDDE</Literal>
>>>>> </sld:CssParameter>
>>>>> <sld:CssParameter name="stroke-linecap">
>>>>> <Literal>butt</Literal>
>>>>> </sld:CssParameter>
>>>>> <sld:CssParameter name="stroke-linejoin">
>>>>> <Literal>miter</Literal>
>>>>> </sld:CssParameter>
>>>>> <sld:CssParameter name="stroke-opacity">1</sld:CssParameter>
>>>>> <sld:CssParameter name="stroke-width">3</sld:CssParameter>
>>>>> <sld:CssParameter name="stroke-dashoffset">
>>>>> <Literal>0</Literal>
>>>>> </sld:CssParameter>
>>>>> </sld:Stroke>
>>>>> </sld:LineSymbolizer>
>>>>> </sld:Rule>
>>>>>
>>>>> <!-- The other RULSs looks the same like the one above -->
>>>>>
>>>>> </sld:FeatureTypeStyle>
>>>>> </sld:UserStyle>
>>>>> </sld:NamedLayer>
>>>>> </sld:StyledLayerDescriptor>
>>>>>
>>>>> Is there something wrong with the SLD? Do I have something to consider
>>>>> if I use mergeNewParams(), or something with the Legend?
>>>>>
>>>>> Thanks
>>>>>
>>>>> Sascha
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Users mailing list
>>>>> Users at openlayers.org
>>>>> http://openlayers.org/mailman/listinfo/users
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>            
>>>> _______________________________________________
>>>> Users mailing list
>>>> Users at openlayers.org
>>>> http://openlayers.org/mailman/listinfo/users
>>>>
>>>>          
>>>
>>>
>>>        
>>
>> _______________________________________________
>> Users mailing list
>> Users at openlayers.org
>> http://openlayers.org/mailman/listinfo/users
>>      
>    





More information about the Users mailing list