[Mapserver-users] PERL mapscript polygon shapefile creation

Eric Bridger eric at gomoos.org
Tue Feb 25 12:12:55 EST 2003


--=-tXobYR1b8yN9iCuMfdz5
Content-Type: text/plain
Content-Transfer-Encoding: 7bit

Joe,

Turns out I just wrote such a script today.  The only  problem I see
with your script is that I think you should call $shape->setBounds()
after you've added all your lines and before $shapeFile->add($shape).

I've attached my script.  It reads a list of polygon centroids in
decimal degrees and creates 10 minute squares.

Eric




On Tue, 2003-02-25 at 19:41, Joe Bussell wrote:
> Greetings Listers,
>     I am having difficulty porting a technique we use to create point 
> and line type shapefiles to create a polygon shapefile.  Has anyone used 
> PERL to create polygon shapefiles from data files?  I have attached my 
> attempt for review.  The script creates a shapefile that is readable by 
> dump.pl, but I have not been able to use it in a map render.
>     I tried this with a data file with the following lines:
> 40.0 -116.0
> 45.0 -116.0
> 45.0 -120.0
> 40.0 -120.0
> 
> The script "closes" the polygon by inserting the first record at the end.
> 
>     Any ideas?
> 
> Cordially,
> 
> Joe Bussell


--=-tXobYR1b8yN9iCuMfdz5
Content-Disposition: attachment; filename=nmfs2shp.pl
Content-Transfer-Encoding: quoted-printable
Content-Type: text/x-perl; name=nmfs2shp.pl; charset=ISO-8859-15

#!/usr/bin/perl -w
use strict;

use mapscript;
use XBase;

# NNFS INPUT comma separated centroids.

#0 NFNS 10 minute square id
#1 Total catch pounds
#2 Centroid Latitude (decimal degrees)
#3 Centroid Longitude (decimal degrees)


my $file =3D shift or die "No input file\n";

my $shapeFile =3D new mapscript::shapefileObj("nmfs_squares", $mapscript::M=
S_SHAPEFILE_POLYGON);

my $dbf_file =3D XBase->create(
"name" =3D> "nmfs_squares.dbf",
"field_names" =3D> ["NMFSID", "TOTAL_CATCH"],
"field_types" =3D> ["C", "N"],
"field_lengths" =3D> [7, 6],
"field_decimals" =3D> [undef, 0]);

my $count =3D 0;
open(IN, $file) or die "Could not open $file\n";
while(my $line =3D <IN>){
	chomp $line;
	$line =3D~ s/"//g;
	my @flds =3D split(/,/, $line);
	my $shape =3D create_rect($flds[2], $flds[3]);
	if(!$shape){
		warn "No shape\n";=09
		next;
	}
	$shapeFile->add($shape);
	$dbf_file->set_record($count, $flds[0], $flds[1]);
	$count++;
}
close (IN);

undef $shapeFile;
$dbf_file->close();

print "Created: $count\n";
exit;

sub create_rect{
	my($lat, $lon) =3D @_;=09
	my $point =3D new mapscript::pointObj();
    my $line =3D new mapscript::lineObj();
	# max xy point
	$point->{x} =3D $lon + .0833;
	$point->{y} =3D $lat + .0833;
	$line->add($point);
	# max x min y
	$point->{x} =3D $lon + .0833;
	$point->{y} =3D $lat - .0833;
	$line->add($point);
	# min xy
	$point->{x} =3D $lon - .0833;
	$point->{y} =3D $lat - .0833;
	$line->add($point);
	# min x max y
	$point->{x} =3D $lon - .0833;
	$point->{y} =3D $lat + .0833;
	$line->add($point);

	# max xy point again to close polygon
	$point->{x} =3D $lon + .0833;
	$point->{y} =3D $lat + .0833;
	$line->add($point);

	my $shp =3D new mapscript::shapeObj($mapscript::MS_SHAPE_POLYGON);
	$shp->add($line);
	$shp->setBounds();

	return $shp;
}

--=-tXobYR1b8yN9iCuMfdz5--




More information about the mapserver-users mailing list