Ticket #2100 (closed enhancement: fixed)

Opened 3 years ago

Last modified 2 years ago

Binding feature attributes to styles and labels

Reported by: sdlime Assigned to: jmckenna
Priority: normal Milestone: 5.0.4 release
Component: MapServer Documentation 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

05/21/2007 01:02:09 PM changed by sdlime

  • status changed from new to assigned.

05/21/2007 01:06:50 PM changed by sdlime

  • type changed from defect to enhancement.
  • description changed.

05/21/2007 01:09:18 PM changed by hobu

05/22/2007 12:03:09 AM changed by sdlime

  • description changed.

05/22/2007 08:55:40 AM changed by dmorissette

  • cc set to dmorissette.

06/06/2007 12:31:24 AM changed by sdlime

  • description changed.

(follow-up: ↓ 9 ) 06/27/2007 04:46:33 PM changed by 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 ?

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

(follow-up: ↓ 10 ) 06/27/2007 05:29:15 PM changed by 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.

(in reply to: ↑ 7 ) 06/28/2007 12:49:44 AM changed by sdlime

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 ) 06/28/2007 12:51:49 AM changed by sdlime

  • description changed.

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.

06/28/2007 01:06:50 AM changed by assefa

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

06/29/2007 08:25:49 AM changed by assefa

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

06/29/2007 03:28:43 PM changed by assefa

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

07/10/2007 11:36:25 PM changed by sdlime

Added setBinding and removeBinding methods to mapscript (SWIG).

07/11/2007 01:03:16 AM changed by sdlime

  • component changed from MapServer C Library to MapServer Documentation.

07/12/2007 10:20:09 AM changed by dmorissette

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

09/12/2007 09:07:13 AM changed by tomkralidis

Should this be reassigned to Jeff?

03/05/2008 11:23:56 AM changed by jmckenna

  • owner changed from sdlime to jmckenna.
  • status changed from assigned to new.

07/17/2008 10:54:56 AM changed by jmckenna

  • status changed from new to assigned.

07/17/2008 12:26:31 PM changed by jmckenna

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.

07/17/2008 03:10:30 PM changed by jmckenna

  • status changed from assigned to closed.
  • resolution set to fixed.

- 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.