TrueType line symbol rotation
Steve Lime
Steve.Lime at DNR.STATE.MN.US
Tue Jul 10 17:03:21 EDT 2007
I thought there was a way, perhaps using a negative GAP value, to trigger the
behavior you're looking for. Have you tried that?
Steve
>>> On 7/10/2007 at 11:11 AM, in message <s6936975.091 at snoopy.ci.stpaul.mn.us>, Jim
Klassen <Jim.Klassen at CI.STPAUL.MN.US> wrote:
> I am working on a project to display a sewer system with CGI Mapserver.
> One of the goals of the project is to display the direction of sewer
> flow based on the map. This information is encoded in the by the
> ordering of the endpoints of the lines which represent the sewer system.
> We are doing this by using a TrueType symbol (right now the '^') to
> point in the direction of the flow overlaid on the line.
>
> The problem I am having is sometimes the '^' point the correct direction
> and sometimes they are 180 degrees off. I have checked the data and the
> ordering of the endpoints is correct in the dataset and up to and
> including in the shape pointer that is passed to
> msImageTruetypePolyline() in maplabel.c. It appears that theta is not
> being calculated in msImageTruetypePolyline() in the way I would expect.
> I don't fully understand what the existing code is doing, in particular,
> I don't understand the implications of changing the position variable.
>
> I have commented out the block I don't understand and replaced it with
> the three lines labeled ADDED and the code now functions as I would
> expect, but again I don't know the implications of not messing with the
> position variable. I have also added a bunch of fprintf's to see what
> was going on.
>
> Is there a better approach to showing the direction associated with the
> lines?
> Are there more places in the code that I should change to get the
> desired (by me) behavior?
>
> Mapserver 4.10.0, 4.10.2 and SVN r6263 (from July 5th) all behave the
> same way.
>
> === mapfile fragment
>
> SYMBOL
> NAME "carret"
> TYPE truetype
> FONT 'arial-bold'
> CHARACTER ">"
> GAP 50
> END
> LAYER
> DATA 'sewer_lines'
> STATUS DEFAULT
> TYPE LINE
> CLASS
> STYLE
> SIZE 15
> SYMBOL "carret"
> COLOR 60 60 60
> END
> END
> END
>
> ==== maplabel.c fragment from SVN as modified
>
>
> if(msGetLabelSize(symbol->character, &label, &label_rect,
> symbolset->fontset, scalefactor, MS_FALSE) == -1)
> return(-1);
>
> label_width = (int) label_rect.maxx - (int) label_rect.minx;
>
> fprintf(stderr, "Line: ");
> for(i=0; i<p->numlines; i++) {
> current_length = gap+label_width/2.0; /* initial padding for each
> line */
> fprintf(stderr, " S%d ", i);
> for(j=1;j<p->line[i].numpoints;j++) {
> fprintf(stderr, " %f,%f-%f,%f ", p->line[i].point[j-1].x,
> p->line[i].point[j-1].y,p->line[i].point[j].x, p->line[i].point[j].y);
> length = sqrt((pow((p->line[i].point[j].x -
> p->line[i].point[j-1].x),2) + pow((p->line[i].point[j].y -
> p->line[i].point[j-1].y),2)));
> if(length==0)continue;
> rx = (p->line[i].point[j].x - p->line[i].point[j-1].x)/length;
> ry = (p->line[i].point[j].y - p->line[i].point[j-1].y)/length;
> position = symbol->position;
> theta = asin(ry);
> /* if(rx < 0) {
> if(rot){
> theta += MS_PI;
> if((position == MS_UR)||(position == MS_UL)) position =
> MS_LC;
> if((position == MS_LR)||(position == MS_LL)) position = MS_UC;
> }else{
> if(position == MS_UC) position = MS_LC;
> else if(position == MS_LC) position = MS_UC;
> }
> }
> else theta = -theta; */
> if( rx < 0 && ry > 0) theta = MS_PI - theta; /* Quadrant II
> transform */
> else if(rx < 0 && ry < 0) theta = -MS_PI - theta; /* Quandant III
> transform */
> theta = -theta; /* image space y coords are the reverse of graph
> space */
> fprintf(stderr, " rx: %f ry: %f length: %f theta: %f ", rx, ry, length,
> theta * MS_RAD_TO_DEG);
>
> if((position == MS_UR)||(position == MS_UL)) position = MS_UC;
>
> === Before output
>
> Line: S0 450.000000,640.000000-448.000000,286.000000 rx: -0.005650
> ry: -0.999984 length: 354.005650 theta: -89.676298
> Line: S0 895.000000,280.000000-448.000000,286.000000 rx: -0.999910
> ry: 0.013422 length: 447.040267 theta: 0.769025
> Line: S0 -1.000000,288.000000-448.000000,286.000000 rx: 0.999990 ry:
> -0.004454 length: 449.004454 theta: 0.255213
> Line: S0 448.000000,286.000000-448.000000,205.000000 rx: 0.000000 ry:
> -1.000000 length: 81.000000 theta: 90.000000
>
> === After output (as expected)
>
> Line: S0 450.000000,640.000000-448.000000,286.000000 rx: -0.005650
> ry: -0.999984 length: 354.005650 theta: 90.323702
> Line: S0 895.000000,280.000000-448.000000,286.000000 rx: -0.999910
> ry: 0.013422 length: 447.040267 theta: -179.230975
> Line: S0 -1.000000,288.000000-448.000000,286.000000 rx: 0.999990 ry:
> -0.004454 length: 449.004454 theta: 0.255213
> Line: S0 448.000000,286.000000-448.000000,205.000000 rx: 0.000000 ry:
> -1.000000 length: 81.000000 theta: 90.000000
>
>
>
>
> Jim Klassen
> City of Saint Paul
> Office of Technology and Communications/Public Works
> (651) 266-6098
More information about the mapserver-dev
mailing list