Opened 17 years ago

Closed 16 years ago

#2100 closed enhancement (fixed)

Binding feature attributes to styles and labels

Reported by: sdlime Owned by: jmckenna
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 (21)

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.

comment:11 by assefa, 17 years ago

I think we can add the addBinding (or is it setBinding ??) and removeBinding at the mapscript level as you descibed it. I will add the php methods on both style and label adn do the tests.

as for the Font : yes I meant the font name and yes you can add it :)

I have also locally modified mapfile.c to save the bindings when the map file is written (writeStyle and writeLabel functions). It looks something like :

if(style->numbindings > 0 && style->bindings[MS_STYLE_BINDING_ANGLE].item)

fprintf(stream, " ANGLE [%s]\n", style->bindings[MS_STYLE_BINDING_ANGLE].item);

else if(style->angle != 0) fprintf(stream, " ANGLE %g\n", style->angle);

It seems to work and I would like to commit if you agree. I will also add the FONT saving when you are done binding the FONT.

Thanks

comment:12 by assefa, 17 years ago

commited update write functions in mapfile.c to look for a binding r6248

comment:13 by assefa, 17 years ago

Added setbinding and removebinding functions in phpmapscript on label and style objects (r6251)

comment:14 by sdlime, 17 years ago

Added setBinding and removeBinding methods to mapscript (SWIG).

comment:15 by sdlime, 17 years ago

Component: MapServer C LibraryMapServer Documentation

comment:16 by dmorissette, 17 years ago

FYI I have added missing MS_LABEL_BINDING_FONT and MS_LABEL_BINDING_PRIORITY constants in PHP MapScript in r6296

comment:17 by tomkralidis, 17 years ago

Should this be reassigned to Jeff?

comment:18 by jmckenna, 16 years ago

Owner: changed from sdlime to jmckenna
Status: assignednew

comment:19 by jmckenna, 16 years ago

Status: newassigned

comment:20 by jmckenna, 16 years ago

Am I correct that for this ticket several existing parameters such as ANGLEITEM were totally removed, causing existing mapfiles with those parameters to break? I assumed both ways would still exist, but the docs would state "deprecated" for the old parameters. If I am correct, then I will open a new ticket to add the old parameters back into the code.

comment:21 by jmckenna, 16 years ago

Resolution: fixed
Status: assignedclosed
  • updated mapfile reference for new attribute binding
  • re: removed parameters: I've discussed this with Daniel and Howard on IRC. I have updated the docs accordingly.
  • I have also created ticket#2707 to inquire about some more possible parameters to "bind" to attributes.
Note: See TracTickets for help on using tickets.