[mapserver-users] Designing a wrapper around mapserv which can be used with fcgi
Dan Little
danlittle at yahoo.com
Wed Nov 4 06:41:34 PST 2009
If you can you might want to consider python... the syntax is a little cleaner with Mapscript. Of course, that's an opinion but I also am a little allergic to sigils (I get all itchy).
----- Original Message ----
> From: Andy Colson <andy at squeakycode.net>
> To: Adrian Popa <adrian_gh.popa at romtelecom.ro>
> Cc: mapserver-users at lists.osgeo.org
> Sent: Wed, November 4, 2009 8:38:52 AM
> Subject: Re: [mapserver-users] Designing a wrapper around mapserv which can be used with fcgi
>
> >
> > Andy Colson wrote:
> >>> Andy Colson wrote:
> >>>> Adrian Popa wrote:
> >>>>> Hello everyone,
> >>>>>
> >>>>> I am currently using a wrapper around mapserv which receives the URL
> parameters, builds the map file (actually I only need to set some filters in the
> map file, but the filters need to be built after running some SQL queries with
> the passed in parameters). After the map file is built, mapserv is called (as a
> shell script), and the map gets sent to the user. Currently this wrapper is
> written in perl - so it's not terribly fast as a cgi process.
> >>>>>
> >>>>> While this approach works, it is terribly inefficient. I would like to use
> mapserv as a fcgi process (or something faster than plain cgi). My question is -
> how can I /should I build a wrapper around mapserv that can "customize" the MAP
> file on the fly and run as a fcgi process?
> >>>>>
> >>>>> Any ideas on where I should start? An example of such a wrapper?
> >>>>>
> >>>>> Also, I suspect I can send parameters to mapserver and use some sort of
> variables in the map file to set up my filters - but I haven't seen an example.
> Can someone point me to such a documentation?
> >>>>>
> >>>>> Thanks,
> >>>>> Adrian
> >>>>
> >>>> Have you seen mapscript? You can use mapserver directly from perl. And
> perl can do fast-cgi. Here is a little, ad-hoc, non-tested, perl fcgi:
> >>>>
> >>>>
> >>>> #!/usr/bin/perl
> >>>>
> >>>> use strict;
> >>>> use mapscript;
> >>>> use FCGI;
> >>>>
> >>>>
> >>>> my $request = FCGI::Request( );
> >>>> while($request->Accept() >= 0)
> >>>> {
> >>>> my($req, $x, $at, $xmap, $xpin, $sid, $y, $q);
> >>>>
> >>>> $req = new mapscript::OWSRequest();
> >>>> $req->loadParams();
> >>>>
> >>>> $xmap = $req->getValueByName('map');
> >>>> $xpin = $req->getValueByName('pin');
> >>>>
> >>>> my $map = new mapscript::mapObj( "/maps/$xmap.map" );
> >>>> if (! $map)
> >>>> {
> >>>> #print STDERR "----- Error loading map: $xmap.map\n";
> >>>> print("Content-type: text/text\r\n\r\n");
> >>>> print "cant load $xmap.map";
> >>>> $request->Finish();
> >>>> next;
> >>>> }
> >>>>
> >>>> mapscript::msIO_installStdoutToBuffer();
> >>>>
> >>>> $x = $map->OWSDispatch( $req );
> >>>> if ($x)
> >>>> {
> >>>> print STDERR "OWSDispatch: $x\n";
> >>>> my $errObj = new mapscript::errorObj();
> >>>> while ($errObj) {
> >>>> print STDERR "ERROR:
> $errObj->{code}:$errObj->{message}:$errObj->{routine} \n";
> >>>> $errObj = $errObj->next();
> >>>> }
> >>>> }
> >>>>
> >>>> my $content_type = mapscript::msIO_stripStdoutBufferContentType();
> >>>>
> >>>> $x = mapscript::msIO_getStdoutBufferBytes();
> >>>>
> >>>>
> >>>> print("Content-type: $content_type\r\n\r\n");
> >>>> if (mapscript::msGetVersionInt() >= 50500)
> >>>> {
> >>>> print $$x;
> >>>> } else {
> >>>> print $x;
> >>>> }
> >>>>
> >>>> mapscript::msIO_resetHandlers();
> >>>> $request->Finish();
> >>>> }
> >>>>
> >>>>
> >>>>
> >>>> I'd recommend using mapserver 5.6.0.
> >>>>
> >>>> -Andy
> >>>>
> >>>
> >>
> >> Adrian Popa wrote:
> >> > Thank you,
> >> >
> >> > I will look into it. I guess through mapscript I can redefine the
> >> > parameters that get sent to mapserver? Or do I rewrite the whole map?
> >> >
> >>
> >>
> >> You can load a map into memory (I assume you were already doing that). You
> said "..perl.. receives the URL parameters ...and... builds the map file".
> >>
> >>
> >> I assume your perl does: use mapscript?
> >>
> >> and at some point: my $map = new mapscript::mapObj( "/maps/$xmap.map" );
> >>
> >> You kind of imbed mapserver into your perl script, and can call its functions
> and what not. After you load the map you can do things to it, in memory.
> >>
> >> In my example above, I'm using the WMS features ($map->OWSDispatch), but you
> can also generate an image:
> >>
> >> my $img = $map->draw();
> >> $img->save('x.jpg', $mapscript::MS_JPG);
> >>
> >> -Andy
> >>
> >
> >
>
> Adrian Popa wrote:
> > Thank you Andy for explaining.
> >
> > Actually my wrapper is very hard-core, meaning I don't use mapscript
> > (because I had to build it quickly and didn't have time to research
> > which was the best approach). Now I have more time and I'd like to tune
> > things up, so I will definitely start studying mapscript (If you have a
> > link to a good tutorial/function reference for it I am in your debt).
> >
> > My wrapper just copied over a template map file, edited it (rewrites
> > some filters) and then it set
> > $ENV{'QUERY_STRING'} = $ENV{'QUERY_STRING'}."&map=$file";
> >
> > ...and then called
> >
> > print `/var/www/cgi-bin/mapserv`;
> >
> >
> > It's barbaric, I know, but it worked for me. :)
> > It will take a bit of rewrite to add fcgi support and mapscript, but in
> > the long run it will be more mantainable... :)
> >
> > Thanks again,
> > Adrian
>
> So are you using the template html stuff? Humm... I've never used that stuff,
> not sure how it'll all translate.
>
> For documentation, I used the mapscript reference:
> http://mapserver.org/mapscript/mapscript.html
>
> I found a few example perl scripts that helped with the syntax (my $c = new
> mapscript::colorObj(), $c->{blue} = 255;, etc...). Other than that, I had more
> problems comming up with nice looking colors for my map, than actually writing
> the perl code.
>
> -Andy
> _______________________________________________
> mapserver-users mailing list
> mapserver-users at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/mapserver-users
More information about the MapServer-users
mailing list