[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