PERL/Mapscript postGIS examples?
Eric Bridger
eric at GOMOOS.ORG
Mon Mar 20 14:02:10 PST 2006
Not sure why this would work in CGI mode.
shp2img is the best tool for debugging postgis layers. Well, turning on
postgres logging works as well.
Just a guess but I suspect a projection issue.
Does your postgis data really have an SRID of 4284? You many need to
change your DATA statement in the postgis layer to something like:
DATA "the_geom (select * from probe) using unique oid using SRID=4284"
The postgis queries below look like they are attempting to use the
standard SRID of -1 or lat/lon projection.
Also I don't see any EXTENT in your map file. That should throw an
error.
I would try getting it all to work with no projection (proj=latlong or
EPGS:4326) first then start messing with the projections.
Eric
On Sat, 2006-03-18 at 01:15, Stephen Davies wrote:
> Thanks for the feedback.
>
> Turning on PostgreSQL logging did indeed reveal more information.
> However, it leaves even more confused than before.
>
> It seems that the underlying cause of my results is that the extent
> being used by mapscript bears no relation to the extent that I
> specified.
>
> Here is the sql statement generated from mapscript:
>
> 2006-03-18 16:22:47 CST LOG: 00000: duration: 33.759 ms statement:
> DECLARE mycursor BINARY CURSOR FOR SELECT
> location::text,asbinary(force_collection(force_2d(geom)),'NDR'),id::text
> from probe WHERE geom && setSRID('BOX3D(139.522253226183
> -0.000314231148091942,139.522253452601 -0.000314003203767908)'::BOX3D,
> find_srid('','probe','geom') )
>
> The actual extent specified (and the one that works from CGI mapserv)
> was:
>
> 139.5143351 -34.7459112 139.5278707 -34.7207064
>
> The "correct" query as generated by a CGI call with the above mapext is:
>
> 2006-03-18 16:11:57 CST LOG: 00000: duration: 33.703 ms statement:
> DECLARE mycursor BINARY CURSOR FOR SELECT
> location::text,asbinary(force_collection(force_2d
> (geom)),'NDR'),id::text from probe WHERE geom &&
> setSRID('BOX3D(139.508530404246 -34.7456930137356,139.533675395754
> -34.7204885334377)'::BOX3D, find_srid('','probe','geom') )
>
> Again the extent is changed but nowhere as drastically.
>
> I then tried hard-wiring the extent into the map file and removing the
> mapext argument from the CGI call and got the same result and the same
> query.
>
> I then modified my PERL script to use the extent in the map file and
> again got the same result and the same query generated.
>
> It looks as if the mapscript setExtent method does something strange and
> different from the CGI mapext option and that both do strange things
> with extent statements in map files in some circumstances.
>
> I tried changing the UNITS to DD but this made no difference (METERS is
> required to make reference maps etc work properly in the CGI world.)
>
> Cheers,
> Stephen
>
> On Friday 17 March 2006 23:42, Simpson wrote:
> > Stephen,
> >
> > You might try checking the Postgresql logs to see if Mapserver is
> > connecting and requesting data. Turn on statement logging in
> > Postgresql config to get details of exactly what is being sent. You
> > can then run the statement from psql to see if it is returning what
> > you expect.
> >
> > Drew.
> >
> > -----Original Message-----
> > From: UMN MapServer Users List
> > [mailto:MAPSERVER-USERS at LISTS.UMN.EDU]On Behalf Of Stephen Davies
> > Sent: Friday, March 17, 2006 12:48 AM
> > To: MAPSERVER-USERS at LISTS.UMN.EDU
> > Subject: [UMN_MAPSERVER-USERS] PERL/Mapscript postGIS examples?
> >
> >
> > Could somebody please send me or point me at an example of a
> > PERL/Mapscript script that displays layers populated from a postGIS
> > database and/or raster layers?
> > The following PERL/Mapscript and map file generates an image
> > containing only the copyright layer.
> > Exactly the same map file with mapserver invoked as CGI generates all
> > layers.
> > (In both cases the extent is provided as args.
> > eg ./genpics q 1 jpg 139.5143351 -34.7459112 139.5278707 -34.7207064)
> >
> > Cheers and thanks,
> > Stephen Davies
> >
> > #! /usr/bin/perl
> > #
> > # args are UID (for mapfile), pic sequence #, image type (extension),
> > extent
> > #
> > use strict;
> > #use CGI;
> > use mapscript;
> > my $uno = $ARGV[0];
> > my $seq = $ARGV[1];
> > my $ext = $ARGV[2];
> > my $minx = $ARGV[3];
> > my $miny = $ARGV[4];
> > my $maxx = $ARGV[5];
> > my $maxy = $ARGV[6];
> > #
> > # if sequence = 1, create/empty directory (ignoring errors)
> > #
> > if ($seq == 1){
> > mkdir("/var/www/html/status_images/$uno",0777);
> > unlink </var/www/html/status_images/$uno/*>;
> > }
> > #
> > my $mapfile = "/tmp/$uno.map";
> > my $map = mapscript::mapObj->new($mapfile);
> > my $i=$map->setExtent($minx,$miny,$maxx,$maxy);
> > #
> > #my $img = $map->prepareImage();
> > my $img = $map->draw();
> > my $fname = "/var/www/html/status_images/$uno/$seq.$ext";
> > $img->save($fname);
> > ===================================================
> > MAP
> > NAME perltest
> >
> >
> > PROJECTION
> > "proj=eqc"
> > "lon_0=139.521e"
> > END
> >
> > SIZE 600 600
> > FONTSET "/var/www/html/benparts/fonts.list"
> > SYMBOLSET "/var/www/html/benparts/symbols"
> > UNITS METERS
> > IMAGETYPE jpeg
> > OUTPUTFORMAT
> > NAME jpeg
> > DRIVER "GD/JPEG"
> > MIMETYPE "image/jpeg"
> > IMAGEMODE RGB
> > EXTENSION "jpg"
> > FORMATOPTION "QUALITY=75"
> > END
> > IMAGECOLOR 255 255 255
> >
> > WEB
> > template /var/www/html/benparts/templates/test1.html
> > imagepath "/var/www/html/tmp/"
> > imageurl "/tmp/"
> > END
> >
> > LAYER
> > TYPE RASTER
> > NAME "bkgrnd"
> > STATUS DEFAULT
> > PROJECTION
> > "init=epsg:28354"
> > END
> > DATA "/var/www/html/benparts/rasters/walker.ecw"
> > # OFFSITE 0 0 0
> > PROCESSING "DITHER=YES"
> > END
> >
> > LAYER
> > CONNECTIONTYPE postgis
> > NAME "probe"
> > DATA "geom from probe"
> > CONNECTION "user=scldad dbname=benparts"
> > STATUS DEFAULT
> > TYPE POINT
> > # FILTER "id in (0)"
> > PROJECTION
> > "init=epsg:4284"
> > END
> > MAXSCALE 5000000
> > LABELITEM "location"
> > CLASS
> > NAME "Probe (Right Click to select)"
> > STYLE
> > COLOR 0 214 0
> > SYMBOL 'circle'
> > SIZE 7
> > END
> > LABEL
> > MINDISTANCE 15
> > POSITION CR
> > SIZE SMALL
> > COLOR 0 0 0
> > FORCE TRUE
> > END
> > END
> > END
> >
> > LAYER
> > NAME 'copyright'
> > TYPE ANNOTATION
> > STATUS DEFAULT
> > TRANSFORM FALSE # coordinates are in pixels
> > FEATURE
> > POINTS 10 595 END
> > END
> > CLASS
> > LABEL
> > TYPE TRUETYPE
> > FONT arial
> > SIZE 8
> > COLOR 255 0 0
> > POSITION CR
> > END
> > TEXT 'Photography supplied by MAPLAND, Environment
> > Information, Dept Environment & Heritage'
> > END
> > END
> > END
> > --
> > =====================================================================
> >=== This email is for the person(s) identified above, and is
> > confidential to the sender and the person(s). No one else is
> > authorised to use or disseminate this email or its contents.
> >
> > Stephen Davies Consulting Voice: 08-8177
> > 1595 Adelaide, South Australia. Fax:
> > 08-8177 0133 Computing & Network solutions.
> > Mobile:0403 0405 83
>
> --
> ========================================================================
> This email is for the person(s) identified above, and is confidential to
> the sender and the person(s). No one else is authorised to use or
> disseminate this email or its contents.
>
> Stephen Davies Consulting Voice: 08-8177 1595
> Adelaide, South Australia. Fax: 08-8177 0133
> Computing & Network solutions. Mobile:0403 0405 83
More information about the MapServer-users
mailing list