-
-
Save iljya/e67a2a245c6968e685c11498a8361fe0 to your computer and use it in GitHub Desktop.
| MAP | |
| NAME SVG_ICON_ANCHORPOINT_TEST | |
| STATUS ON | |
| SIZE 100 100 | |
| EXTENT 0 0 0.001 0.001 | |
| IMAGECOLOR 255 255 255 | |
| IMAGETYPE svg | |
| CONFIG "MS_ERRORFILE" "stderr" | |
| SYMBOL | |
| NAME "square_0_0" | |
| TYPE svg | |
| IMAGE "./square.svg" | |
| ANCHORPOINT 0 0 | |
| END | |
| SYMBOL | |
| NAME "square_05_05" | |
| TYPE svg | |
| IMAGE "./square.svg" | |
| ANCHORPOINT 0.5 0.5 | |
| END | |
| SYMBOL | |
| NAME "square_1_1" | |
| TYPE svg | |
| IMAGE "./square.svg" | |
| ANCHORPOINT 1 1 | |
| END | |
| SYMBOL | |
| NAME "DEBUG" | |
| TYPE ellipse | |
| FILLED true | |
| POINTS | |
| 1 1 | |
| END | |
| END | |
| LAYER | |
| TYPE POINT | |
| STATUS ON | |
| FEATURE | |
| POINTS | |
| 0.0004 0.0005 | |
| END | |
| TEXT "P" | |
| END | |
| CLASS | |
| STYLE | |
| SYMBOL "square_0_0" | |
| END | |
| STYLE | |
| COLOR 255 0 0 | |
| SYMBOL "DEBUG" | |
| END | |
| END | |
| END | |
| LAYER | |
| TYPE POINT | |
| STATUS ON | |
| FEATURE | |
| POINTS | |
| 0.0005 0.0005 | |
| END | |
| TEXT "P" | |
| END | |
| CLASS | |
| STYLE | |
| SYMBOL "square_05_05" | |
| END | |
| STYLE | |
| COLOR 255 0 0 | |
| SYMBOL "DEBUG" | |
| END | |
| END | |
| END | |
| LAYER | |
| TYPE POINT | |
| STATUS ON | |
| FEATURE | |
| POINTS | |
| 0.0006 0.0005 | |
| END | |
| TEXT "P" | |
| END | |
| CLASS | |
| STYLE | |
| SYMBOL "square_1_1" | |
| END | |
| STYLE | |
| COLOR 255 0 0 | |
| SYMBOL "DEBUG" | |
| END | |
| END | |
| END | |
| END |
MapServer version 7.4.3 OUTPUT=PNG OUTPUT=JPEG OUTPUT=KML SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=CAIRO SUPPORTS=SVG_SYMBOLS SUPPORTS=RSVG SUPPORTS=ICONV SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER SUPPORTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER SUPPORTS=SOS_SERVER SUPPORTS=FASTCGI SUPPORTS=THREADS SUPPORTS=GEOS SUPPORTS=PBF INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE
Also doesn't work with 7.6.2.
MapServer version 7.6.2 OUTPUT=PNG OUTPUT=JPEG SUPPORTS=PROJ SUPPORTS=AGG SUPPORTS=FREETYPE SUPPORTS=CAIRO SUPPORTS=SVG_SYMBOLS SUPPORTS=RSVG SUPPORTS=ICONV SUPPORTS=FRIBIDI SUPPORTS=WMS_SERVER SUPPORTS=WFS_SERVER SUPPORTS=WCS_SERVER SUPPORTS=FASTCGI SUPPORTS=GEOS SUPPORTS=POINT_Z_M INPUT=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE
I found the issue! The SVG symbol (square.svg) does not have a width/height set. If the width/height is set, the symbol is correctly anchored at the set anchorpoints.
The reason the results are so strange seems to be related to the fractional maxx/maxy set in the viewbox: they are apparently being cast to ints! I verified this by adding a print statement in mapcairo.c::msPreloadSVGSymbol() [0]:
rsvg_handle_get_dimensions_sub (cache->svgc, &dim, NULL);
symbol->sizex = dim.width;
symbol->sizey = dim.height;
fprintf( stderr, "width: %d height: %d\n", dim.width, dim.height);
The dimensions returned by rsvg_handle_get_dimensions_sub(...) are always ints [1].
[0] https://github.com/MapServer/MapServer/blob/main/mapcairo.c#L1000
[1] https://github.com/ImageMagick/librsvg/blob/main/rsvg-base.c#L1458
Thanks for all of this research. Added to docs as a note (MapServer/MapServer-documentation#446)
SVG symbols, SVG output, and Anchorpoints
Note the strange output produced by the above map file. It has:
Note how the anchor points are not where they should be (see map.svg above). You have to zoom in to see properly.

I use this command to render the map:
shp2img -o map.svg -m svg.mapIf I change the output type to png, I get the expected result, with the symbols anchored at the correct point:
It is possible that this is related to these issues, but I'm not sure:
MapServer/MapServer#5593
https://trac.osgeo.org/mapserver/ticket/4184