[mapserver-users] questions re. MapScript

Mr. Puneet Kishor punk.kish at gmail.com
Sat Sep 3 19:48:03 EDT 2011


for you MapScript mavens --


A few things have me puzzled about MapScript. I have the following code, and it works --

my $dbh = DBI->connect("dbi:Pg:dbname=$dbname;host=$dbhost;port=$dbport", $dbuser, $dbpswd);
my $msh = "host=$dbhost port=$dbport dbname=$dbname user=$dbuser password=$dbpswd";

my $map = new mapscript::mapObj();

my $classOutline = new mapscript::colorObj;
$classOutline->setHex('#444444');

######### Layer One
my $layer_one = new mapscript::layerObj($map);
$layer_one->{name} = 'Layer One';
$layer_one->{status} = $mapscript::MS_ON;
$layer_one->{type} = $mapscript::MS_LAYER_POLYGON;
$layer_one->setConnectionType($mapscript::MS_POSTGIS, '');
$layer_one->{connection} = $msh;
$layer_one->{data} = 'the_geom FROM (SELECT gid, class_name, the_geom FROM table1) foo USING UNIQUE gid';
$layer_one->setFilter('gid NOT IN (.. bunch of gids ..)');
$layer_one->{classitem} = 'class_name';

my $sth = $dbh->prepare("SELECT class_name, class_color FROM color_table");
$sth->execute;
while (my ($class_name, $class_color) = $sth->fetchrow_array) {
	my $classObj = new mapscript::classObj( $layer_one );
	$classObj->{name} = $class_name;
	$classObj->setExpression( $class_name );

	my $styleObj = new mapscript::styleObj($classObj);
	
	my $classFill = new mapscript::colorObj;
	$classFill->setHex($class_color);
	
    $styleObj->{color} = $classFill;
    $styleObj->{outlinecolor} = $classOutline;
}

Question 0: Is there are more efficient way to accomplish the above?

Question 1: I am assuming there is no way I can reuse the same db handle above, 
once for MapServer, and the other time to make my own queries. Neverthless, I 
would like to confirm.

Question 2: I tried to add a WHERE clause in the "data" value, but that caused 
error. I am assuming that is not allowed, but I would like to confirm.

Now, here is a really puzzling thing. If I add another layer, exactly after the 
above pattern, for example, see the code below, MapServer crashes with the 
message "prepareImage() error: Can't call method 'save on an undefined value."
Seems like there is an error somewhere, and $map gets all messsed up. 

######### Layer Two
my $layer_two = new mapscript::layerObj($map);
$layer_two->{name} = 'Layer Two';
$layer_two->{status} = $mapscript::MS_ON;
$layer_two->{type} = $mapscript::MS_LAYER_POLYGON;
$layer_two->setConnectionType($mapscript::MS_POSTGIS, '');
$layer_two->{connection} = $msh;
$layer_two->{data} = 'the_geom FROM (SELECT gid, class_id, the_geom FROM table2) bar USING UNIQUE gid';
$layer_two->{classitem} = 'class_id';

$sth = $dbh->prepare("SELECT class_id, class_color FROM another_color_table");
$sth->execute;
while (my ($class_id, $class_color) = $sth->fetchrow_array) {
	my $classObj = new mapscript::classObj( $layer_two );
	$classObj->{name} = $class_name;
	$classObj->setExpression( $class_name );

	my $styleObj = new mapscript::styleObj($classObj);
	
	my $classFill = new mapscript::colorObj;
	$classFill->setHex($class_color);
	
    $styleObj->{color} = $classFill;
    $styleObj->{outlinecolor} = $classOutline;
}


How do I get MapServer to write out detailed error messages? 

There seems to be an `errorObj` that allows inspection of the MapServer error 
stack. "Only needed for the Perl module as the other language modules expose 
the error stack through exceptions." Alright, but there is no constructor for 
this object. How do I use this?


--
Puneet Kishor 


More information about the mapserver-users mailing list