Opened 17 years ago

Last modified 16 years ago

#2100 closed enhancement

Binding feature attributes to styles and labels — at Version 10

Reported by: sdlime Owned by: sdlime
Priority: normal Milestone: 5.0.4 release
Component: Documentation - MapServer Version: 5.0
Severity: normal Keywords:
Cc: dmorissette

Description (last modified by sdlime)

This bug will be used to track the implementation of the RFC 19 http://mapserver.gis.umn.edu/development/rfc/ms-rfc-19/ implementation.

As of the creation of this bug an initial implementation has been checked in to the main trunk. It supports:

  • styles: color, outlinecolor, size and angle
  • labels: color, outlinecolor, size and angle

The main remaining tasks are:

  • adding a binding for a style symbol DONE
  • add more test cases (e.g. what happens when you bind a string to a numeric parameter)
  • removal of old properies (e.g. LABELITEMANGLE) and structure members in header files, code, lexer configuration and PHP/MapScript binding DONE
  • update label and style copy routines to handle bindings DONE
  • creation of setBinding and removeBinding MapScript methods for labelObj and styleObj objects (both Swig-based languages and PHP)
  • update write functions in mapfile.c to look for a binding
  • documentation

Change History (10)

comment:1 by sdlime, 17 years ago

Status: newassigned

comment:2 by sdlime, 17 years ago

Description: modified (diff)
Type: defectenhancement

comment:4 by sdlime, 17 years ago

Description: modified (diff)

comment:5 by dmorissette, 17 years ago

Cc: dmorissette added

comment:6 by sdlime, 17 years ago

Description: modified (diff)

comment:7 by assefa, 17 years ago

Steve,

Couple of points :

1) Can you describe a bit what the set/remove bindings should do ? looking into this we could have a mapscript function that cold look like this

$style->setBinding(MS_STYLE_BINDING_COLOR, "attribute_field")

There could either be 2 functions in maputil.c one for style, one for label which would essantally do something like :

msSetBindingStyle( MS_STYLE_BINDING_ENUM, field)

if (style->bindings[MS_STYLE_BINDING_COLOR].item) {

free(style->bindings[MS_STYLE_BINDING_COLOR].item)

style->numbindings--;

} style->bindings[MS_STYLE_BINDING_COLOR].item = strdup('field') style->numbindings++;

removeBinding can also be done the same way, either having a separate function in maputil or using msSetBindingStyle with a NULL,

Could this work ?

2) Is ther a possiblity to add the FONT parameter for binding ?

In both cases, I am will to add it and test with php mapscript since I need to use it for a client side tool.

Thanks

comment:8 by assefa, 17 years ago

Another point I forgot : how would the save through mapscript work ? In my opinion, It would make sense to save the attribute bindings. Right now the it saves the last values that were using while rendering.

in reply to:  7 comment:9 by sdlime, 17 years ago

Replying to assefa:

Steve,

Couple of points :

1) Can you describe a bit what the set/remove bindings should do ? looking into this we could have a mapscript function that cold look like this

$style->setBinding(MS_STYLE_BINDING_COLOR, "attribute_field")

There could either be 2 functions in maputil.c one for style, one for label which would essantally do something like :

msSetBindingStyle( MS_STYLE_BINDING_ENUM, field)

if (style->bindings[MS_STYLE_BINDING_COLOR].item) {

free(style->bindings[MS_STYLE_BINDING_COLOR].item)

style->numbindings--;

} style->bindings[MS_STYLE_BINDING_COLOR].item = strdup('field') style->numbindings++;

removeBinding can also be done the same way, either having a separate function in maputil or using msSetBindingStyle with a NULL,

Could this work ?

Yes, that's all I was thinking. I was going to write them as helper methods in the swig interface files, so in style.i you'd see:

int addBinding(int binding, char *item) {

if(!item) return MS_FAILURE;

if(binding < 0
binding >= MS_STYLE_BINDING_LENGTH)

return MS_FAILURE;

if(this->bindings[binding].item) {

free(this->bindings[binding].item) this->bindings[binding].index = -1; this->numbindings--;

}

this->bindings[bindings].item = strdup(item); this->numbindings++;

return MS_SUCCESS;

}

int removeBinding(int binding) {

if(binding < 0
binding >= MS_STYLE_BINDING_LENGTH)

return MS_FAILURE;

if(this->bindings[binding].item) {

free(this->bindings[binding].item) this->bindings[binding].index = -1; this->numbindings--;

}

return MS_SUCCESS;

}

I hadn't planned on writing C functions to do it although we could. We'd need a seperate set/remove function for labels and styles unless we did something like:

int msSetBinding(void *obj, int binding, char *item, int max_bindings)

Would have to pass the MS_LABEL_BINDING_LENGTH or MS_STYLE_BINDING_LENGTH for max_bindings, or just ignore that test altogether (a bad idea I think).

The one problem I see is guaranteeing that the binding item index gets populated, which happens via msLayerWhichItems() at draw time. We'll see I guess.

2) Is ther a possiblity to add the FONT parameter for binding ?

Yes, assuming you're talking font name (e.g. arial). I can do that for you if you wish. It's not hard but there are like 3 places you have to touch.

In both cases, I am will to add it and test with php mapscript since I need to use it for a client side tool.

Thanks

in reply to:  8 comment:10 by sdlime, 17 years ago

Description: modified (diff)

Replying to assefa:

Another point I forgot : how would the save through mapscript work ? In my opinion, It would make sense to save the attribute bindings. Right now the it saves the last values that were using while rendering.

Whoops, forgot to fix the writers to check for a binding. Will add to the todo in the main description.

Note: See TracTickets for help on using tickets.