--- shp2osm.pl.orig	2009-09-29 18:19:40.000000000 -0400
+++ shp2osm.pl	2009-09-29 18:48:28.000000000 -0400
@@ -1,8 +1,9 @@
 # Copyright (c) 2006 Gabriel Ebner <ge@gabrielebner.at>
 # updated in 2008 by Tobias Wendorff <tobias.wendorff@uni-dortmund.de>
+# updated in 2009 by Anthony DiPierro <osm@inbox.org>
 # HTML-Entities based on ideas of Hermann Schwärzler
 # Gauß-Krüger implementation based on gauss.pl by Andreas Achtzehn
-# version 1.3 (17. September 2008)
+# version 1.4 (29. September 2009)
 
 use Geo::ShapeFile;
 use HTML::Entities qw(encode_entities_numeric);
@@ -44,7 +45,7 @@
      }
 
      sub node_out {
-         my ( $lon, $lat, $tags ) = @_;
+         my ( $lon, $lat ) = @_;
          my $id = $i--;
          if(@ARGV[1] eq 'GK') {
              my ($wgs84lon, $wgs84lat) = gk2geo($lon, $lat);
@@ -76,8 +77,23 @@
 </osm>
 END
 
+sub polygon_out {
+    my ( $shp, $partnum, $tags ) = @_;
+
+    my @pts=$shp->get_part($partnum);
+    my ( $first_node, $last_node, @segs, $i );
+    for ($i=0; $i<scalar(@pts)-1; $i++) {
+        my $node = node_out($pts[$i]->X, $pts[$i]->Y);
+        push @segs, seg_out $last_node, $node;
+        $last_node = $node;
+        $first_node ||= $last_node;
+    }
+    push @segs, $first_node;
+    way_out \@segs, $tags;
+}
+
 sub polyline_out {
-    my ( $pts, $tags, $connect_last_seg ) = @_;
+    my ( $pts, $tags ) = @_;
 
     my ( $first_node, $last_node, @segs );
     for my $pt (@$pts) {
@@ -86,8 +102,6 @@
         $last_node = $node;
         $first_node ||= $last_node;
     }
-    push @segs, seg_out $last_node, $first_node
-      if $first_node && $connect_last_seg;
     way_out \@segs, $tags;
 }
 
@@ -96,8 +110,11 @@
     my $tags = { %default_tags, %$dbf };
     my $is_polygon = $type % 10 == 5;
     for ( 1 .. $shp->num_parts ) {
-        polyline_out [ map( [ $_->X(), $_->Y() ], $shp->get_part($_) ) ], $tags,
-          $is_polygon;
+        if ($is_polygon) {
+            polygon_out($shp, $_, $tags);
+        } else {
+            polyline_out [ map( [ $_->X(), $_->Y() ], $shp->get_part($_) ) ], $tags;
+        }
     }
  }
 
