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 )
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 , 17 years ago
Status: | new → assigned |
---|
comment:2 by , 17 years ago
Description: | modified (diff) |
---|---|
Type: | defect → enhancement |
comment:3 by , 17 years ago
comment:4 by , 17 years ago
Description: | modified (diff) |
---|
comment:5 by , 17 years ago
Cc: | added |
---|
comment:6 by , 17 years ago
Description: | modified (diff) |
---|
follow-up: 9 comment:7 by , 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
follow-up: 10 comment:8 by , 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.
comment:9 by , 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
comment:10 by , 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 , 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 , 17 years ago
commited update write functions in mapfile.c to look for a binding r6248
comment:13 by , 17 years ago
Added setbinding and removebinding functions in phpmapscript on label and style objects (r6251)
comment:15 by , 17 years ago
Component: | MapServer C Library → MapServer Documentation |
---|
comment:16 by , 17 years ago
comment:18 by , 16 years ago
Owner: | changed from | to
---|---|
Status: | assigned → new |
comment:19 by , 16 years ago
Status: | new → assigned |
---|
comment:20 by , 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 , 16 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
- 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.
r6126