[OpenLayers-Users] Problem with styling vectorfeatures depending on their attributes

Paul Spencer pagameba at gmail.com
Thu Sep 17 17:04:28 EDT 2009


You will need to run your app with an uncompressed openlayers and use  
a debugger like FireBug or the one built into IE 8 to figure out what  
is the invalid argument.  You may be returning a string value or a  
negative number, perhaps using parseInt or parseFloat to sanitize the  
number might help

strokeWidth: "${getStyle}"

context: {
   getStyle: function(feature, attribute) {
     if (attribute == 'strokeWidth') {
       var radius = parseFloat(feature.attributes.radius);
       return !isNaN(radius) ? radius + 2 : 1;

     }
   }
}

Cheers

Paul

On 2009-09-17, at 3:58 PM, Max Stephan wrote:

>
> Hey Paul,
>
> it´s helping to reduce my lines of code for sure :-) But my main  
> problem
> still exists: Whenever I try to get the attribute "radius" (also  
> tried it
> with the strokeWidth-attribute, doesnt´s work either) of the  
> vectorfeature
> to be the radius of it the nice error message "Line: 625 Column: 408,
> invalid Argument (OpenLayer.js)" pops up. No matter what I try  
> (defining
> context, parsing the attribute directly to Int in the stylemap or  
> even when
> I add the attribute to the vector), the problem remains the same.
>
> greets
> Max Stephan
>
>
> Paul Spencer wrote:
>>
>> http://trac.openlayers.org/ticket/2146 may help, I filed this a while
>> back with a patch to make it possible to use a context and attribute
>> map.  This lets you use ${} for feature styling from attributes and
>> methods in a context:{} at the same time, reducing the perceived
>> overhead of adding a function for every attribute you want to map.   
>> At
>> the same time, the patch also modifies what is passed to a context
>> function to include the name of the attribute being calculated, which
>> means you can use a single function to handle multiple attributes.
>>
>> This means you can do something like this contrived example:
>>
>> new StyleMap({
>>   default: {
>>     fillColor: "${fillColor}", // should come from feature.attributes
>>     strokeWidth: "${getStyle}", // should come from getStyle
>> function, +2 on attribute value
>>     strokeColor: "${getStyle}" // should come from getStyle function,
>> just strokeColor attribute though.
>>   },
>>   context: {
>>     getStyle: function(feature, attribute) {
>>       if (attribute == 'strokeWidth') {
>>         return feature.attributes.strokeWidth + 2;
>>       } else {
>>         return feature.attributes[attribute];
>>       }
>>   }
>> });
>>
>> Not sure if this is useful for you.
>>
>> Cheers
>>
>> Paul
>>
>>
>> On 2009-09-17, at 10:19 AM, Max Stephan wrote:
>>
>>>
>>> Hi Andreas,
>>>
>>> Thank you for that hint. I already found that out to but it doesn´t
>>> help me
>>> with solving my problem. I prefer to avoid using the context because
>>> of
>>> this. Any other ideas on this?
>>>
>>> greets
>>> Max Stephan
>>>
>>> Andreas Hocevar-2 wrote:
>>>>
>>>> Max Stephan wrote:
>>>>> Hi list,
>>>>>
>>>>> I have a vectorlayer to which the user can add features and modify
>>>>> those
>>>>> features. The user can change the attributes for the features like
>>>>> fillColor, strokeColor etc. in a form. A javascript-method is
>>>>> executed by
>>>>> a
>>>>> button-click and saves those attributes as vectorattributes (e.g.
>>>>> feature.attributes.fillColor).
>>>>>
>>>>> In the styleMap I´m reading those values from the vectorattributes
>>>>> to
>>>>> change
>>>>> the styling. The stylemap-Code looks like this:
>>>>> var pointStyleMap = new OpenLayers.StyleMap({
>>>>> 	"default": new OpenLayers.Style({
>>>>> 	fillColor: "${fillColor}",
>>>>> 	fillOpacity: 0.5,
>>>>> 	strokeColor: "${strokeColor}",
>>>>> 	strokeWidth: "${strokeWidth}",
>>>>> 	pointRadius: 10,
>>>>> 	graphicZIndex: "${graphicZIndex}"
>>>>> 	}
>>>>> 	),
>>>>> 	"select": new OpenLayers.Style({
>>>>> 	pointRadius: 10,
>>>>> 	strokeColor: '#FF3333',
>>>>> 	strokeWidth: "${strokeWidth}"
>>>>> 	}
>>>>> 	)
>>>>> });This works so far. But now I want to add 2 to the strokeWidth
>>>>> when the
>>>>> feature is selected, so I tried it like this:
>>>>> strokeWidth: "${strokeWidth}" + 2The effect is that the 2 is only
>>>>> appended
>>>>> (the code seems to interprete strokeWidth as a String although I
>>>>> parsed
>>>>> it
>>>>> to an Int via parseInt(), e.g. for a strokeWidth of 2 I get 22  
>>>>> as a
>>>>> result).
>>>>> It´s possible to solve this problem by defining a context for the
>>>>> style
>>>>> but
>>>>> in my opinion that´s a little overkill for such a simple task.
>>>>> {context:
>>>>> 	{strokeWidth: function (feature){return
>>>>> (feature.attributes.strokeWidth
>>>>> +
>>>>> 2)}}
>>>>> }Now I want to get the pointRadius from the attributes but no  
>>>>> matter
>>>>> which
>>>>> method I try, it always ends in the error message: "Line: 625
>>>>> Column:
>>>>> 408,
>>>>> invalid Argument (OpenLayer.js)". Also tried to parse it to an Int
>>>>> again
>>>>> directly in the styleMap .. no effect.
>>>>> I have to use IE for this project so no further debug  
>>>>> information is
>>>>> available (I´m also not able to install IE8 with it´s debugging
>>>>> features
>>>>> due
>>>>> to limited admin rights at my workstation).
>>>>>
>>>>> Any idea how I could solve this problem?
>>>>>
>>>>
>>>> As soon as you define a context, feature.attributes will no  
>>>> longer be
>>>> what is available in the template. So you should define your  
>>>> context
>>>> like this:
>>>>
>>>> context: {
>>>>   strokeWidth: function(feature){...},
>>>>   strokeColor: function(feature){...},
>>>>   fillColor: function(feature){...},
>>>>   graphicZIndex: function(feature){...},
>>>>   pointRadius: function(feature){...}
>>>> }
>>>>
>>>> Regards,
>>>> Andreas.
>>>>
>>>>> Thx in advance
>>>>> Max Stephan
>>>>>
>>>>>
>>>>
>>>>
>>>> -- 
>>>> Andreas Hocevar
>>>> OpenGeo - http://opengeo.org/
>>>> Expert service straight from the developers.
>>>>
>>>> _______________________________________________
>>>> Users mailing list
>>>> Users at openlayers.org
>>>> http://openlayers.org/mailman/listinfo/users
>>>>
>>>>
>>>
>>> -- 
>>> View this message in context:
>>> http://n2.nabble.com/Problem-with-styling-vectorfeatures-depending-on-their-attributes-tp3663197p3663407.html
>>> Sent from the OpenLayers Users mailing list archive at Nabble.com.
>>> _______________________________________________
>>> 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
>>
>>
>
> -- 
> View this message in context: http://n2.nabble.com/Problem-with-styling-vectorfeatures-depending-on-their-attributes-tp3663197p3664933.html
> Sent from the OpenLayers Users mailing list archive at Nabble.com.
> _______________________________________________
> Users mailing list
> Users at openlayers.org
> http://openlayers.org/mailman/listinfo/users




More information about the Users mailing list