Mapscript, SVG and Annotations
Martin Weinelt
mweinelt at PLANIGLOBE.COM
Thu Jul 12 00:45:43 PDT 2007
We talked a bit about that issue here and one guy brought up the
anti-overposting feature with labels POSITION set to 'auto'. I did
not look at the code, but he mentioned that anti-overposting often is
based on matrices. This would be straight forward for output on
raster maps, but would that count for vector output as well?
Just an idea,
Martin
On Mittwoch 11 Juli 2007, Martin Weinelt wrote:
> Thanks a lot,
>
> your tips at least kept trying. What I did was translate your
> example to Perl mapscript. Some PHP methods are not available or a
> bit different in the SWIG versions. That looks like this:
>
> my $oShp = new mapscript::shapeObj($mapscript::MS_SHAPE_POINT);
> my $oLine = new mapscript::lineObj;
> my $oPt = new mapscript::pointObj;
> $oPt->setXY(-11, 22); # DD
> $oLine->add($oPt);
> $oShp->add($oLine);
> $oShp->{text} = 'Hello World';
> my $numlayers = $map->{numlayers};
> my $oLayer;
> for (my $h=0; $h<$numlayers; $h++) {
> $oLayer = $map->getLayer($h);
> $oLayer->{status} = $mapscript::MS_OFF;
> }
>
> $oLayer = $map->getLayerByName('popplace');
> $oLayer->{status} = $mapscript::MS_ON;
> $oLayer->addFeature($oShp);
> # here the loop below is going to be inserted
> my $SVGimg = $map->draw();
> my $svg_file = '/path/to/willi.svg';
> $SVGimg->save($svg_file);
>
> The result is exactly like yours: including the label. Ok.
> But now I add the following:
>
> for (my $foo=0; $foo < 3; $foo++) {
> $oShp = new mapscript::shapeObj($mapscript::MS_SHAPE_POINT);
> $oLine = new mapscript::lineObj;
> $oPt = new mapscript::pointObj;
> $oPt->setXY($foo,$foo);
> $oLine->add($oPt);
> $oShp->add($oLine);
> $oShp->{text} = 'Hello World ' . "$foo";
> $oLayer->addFeature($oShp);
> $oShp=$oLine=$oPt=undef; # don't know if this is needed
> }
>
> this is the result:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <svg version="1.1" width="530" height="350"
> xmlns="http://www.w3.org/2000/svg"
> xmlns:xlink="http://www.w3.org/1999/xlink">
>
> <!-- START LAYER popplace -->
> <ellipse cx="249" cy="143" rx="3" ry="3" fill="#0000ff" />
> <ellipse cx="265" cy="175" rx="3" ry="3" fill="#0000ff" />
> <ellipse cx="266" cy="174" rx="3" ry="3" fill="#0000ff" />
> <ellipse cx="268" cy="172" rx="3" ry="3" fill="#0000ff" />
> <text x="249" y="142" font-family="Arial" font-size="12pt"
> fill="#ff0000" stroke="#ffffff" stroke-width="0.5"
> transform="rotate(-10.000000 249 142)">Hello World</text>
> </svg>
>
> What you see is that the labels from the loop are missing while the
> label from the first addFeature is there. Weird.
>
> Going through the MAP-file reference I find the 'FORCE' property
> for labels. Setting 'FORCE' to 'true' did the trick. All labels,
> including those from the loop, do now appear in the SVG. I do not
> know if this is exactly what I want, but at least I got my labels.
>
> Cheers,
>
> Martin
>
> On Dienstag 10 Juli 2007, Yewondwossen Assefa wrote:
> > Hi there,
> >
> > I did a quick test using php mapscript and an svg output. The
> > poplace layer in the map file is a point layer and has a class
> > with a label object (note that there is no labelitem set)
> >
> > LAYER
> > NAME popplace
> > TYPE POINT
> > STATUS ON
> > ...
> > CLASS
> > style
> > SYMBOL 'circle'
> > SIZE 6
> > COLOR 0 0 255
> > END
> > LABEL
> > COLOR 255 0 0
> > # FONT fritqat-italic
> > FONT Arial
> > TYPE truetype
> > SIZE 12
> > ANGLE 10
> > POSITION AUTO
> > PARTIALS FALSE
> > OUTLINECOLOR 255 255 255
> > END
> > ...
> >
> > script looks something like this
> >
> > $oMap = ms_newmapobj("c:/msapps/gmap-ms40/htdocs/gmap75.map");
> >
> > $oShp = ms_newShapeObj(MS_SHAPE_POINT);
> >
> > $oLine = ms_newLineObj();
> >
> > $oLine->addXY(-2299954.0642738,-612631);
> > $oShp->add( $oLine );
> >
> > $oShp->set("text", "mytext");
> >
> > $numlayers = $oMap->numlayers;
> > for ($i=0; $i<$numlayers; $i++)
> > {
> > $oLayer = $oMap->getlayer($i);
> > $oLayer->set("status", MS_OFF);
> > }
> > $oLayer = $oMap->getlayerbyname('popplace');
> > $oLayer->set("status", MS_ON);
> > $oLayer->addfeature($oShp);
> >
> > $img = $oMap->draw();
> > $url = $img->saveWebImage();
> >
> > header("Content-type: image/svg+xml");
> > $url = $img->saveImage("");
> >
> >
> > It produces an svg point with the label my text :
> >
> > ...
> > <!-- START LAYER popplace -->
> > <ellipse cx="39" cy="586" rx="3" ry="3" fill="#0000ff" />
> > <text x="38" y="581" font-family="Arial" font-size="12pt"
> > fill="#ff0000" stroke="#ffffff" stroke-width="0.5"
> > transform="rotate(-10.000000 38 581)">mytext</text>
> > </svg>
> >
> > Not sure what the issue would be in your case, the only time I
> > did not have the text produced was when I set the labelitem
> > object. Could that be the case ?
> >
> >
> > Later
> >
> > kk+w - digitale kartografie GmbH wrote:
> > > Hi,
> > >
> > > I am using addFeature to dynamically add site locations with a
> > > label to a map. It's Perl mapscript.
> > >
> > > @sites is an array of hash references, $sitesLyr is from the
> > > map file:
> > >
> > > ###############
> > > foreach my $site (@sites) {
> > > my $site_pt = $$site{'site_loc'};
> > > $site_pt =~s/.*\((.*)\)*./$1/; # extract the points x
> > > and y my $line = new mapscript::lineObj();
> > > my $siteShp = new
> > > mapscript::shapeObj($mapscript::MS_SHAPE_POINT);
> > >
> > > my $point = new mapscript::pointObj();
> > > my($x,$y) = split(/ /, $site_pt);
> > > $point->setXY($x,$y);
> > > $line->add($point);
> > > $siteShp->add($line);
> > > $siteShp->{text} = $$site{'site_name'};
> > > $siteShp->setBounds();
> > > $sitesLyr->addFeature($siteShp);
> > > }
> > >
> > > my $img = $map->draw();
> > >
> > > #############
> > >
> > > This works perfectly for the usual PNG output map. Using the
> > > same routine for a SVG 'image' results in the symbols/markers
> > > getting plotted, but the labels are missing. If I switch to a
> > > static shapefile for this layer, the labels do appear in the
> > > SVG.
> > >
> > > Is there anything special with SVG output and the 'addFeature'
> > > method for layers that I am missing?
> > >
> > > Thanks,
> > >
> > > Martin
More information about the MapServer-users
mailing list