Advertisement
Guest User

James Michael DuPont

a guest
Feb 1st, 2010
599
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 5.47 KB | None | 0 0
  1. # Copyright (c) 2006 Gabriel Ebner <ge@gabrielebner.at>
  2. # updated in 2008 by Tobias Wendorff <tobias.wendorff@uni-dortmund.de>
  3. # HTML-Entities based on ideas of Hermann Schw&#65533;rzler
  4. # Gau&#65533;-Kr&#65533;ger implementation based on gauss.pl by Andreas Achtzehn
  5. # version 1.3 (17. September 2008)
  6.  
  7. use Geo::ShapeFile;
  8. use HTML::Entities qw(encode_entities_numeric);
  9. use Math::Trig;
  10. use strict;
  11. use warnings;
  12.  
  13. if(@ARGV == 0) {
  14.    print "usage:\n";
  15.    print "with transformation from GK to WGS84: 'shp2osm.pl shapefile GK'\n";
  16.    print "without transformation: 'shp2osm.pl shapefile'";
  17.    exit;
  18. }
  19. open OUT , ">ways_1.osm";
  20. print OUT <<'END';
  21. <?xml version='1.0'?>
  22. <osm version='0.5' generator='shp2osm.pl'>
  23. END
  24.  
  25. my $i;
  26. my %default_tags;
  27. my $waycount=0;
  28. #BEGIN { our %default_tags = ( natural => 'water', source => 'SWDB' ); }
  29. BEGIN { %default_tags = (  ); }
  30.  
  31. my $file = shift @ARGV;
  32. my $rungk=0;
  33. my $gk=shift @ARGV;
  34.  
  35. if ($gk && $gk eq 'GK')
  36. {
  37.     $rungk=1;
  38. }
  39.  
  40. $file =~ s/\.shp$//;
  41. my $shpf = Geo::ShapeFile->new($file);
  42. warn "File:". $shpf;
  43. proc_shpf($shpf);
  44.  
  45.  
  46. my @nodes;
  47.  
  48. {
  49.      BEGIN { $i = -1; }
  50.  
  51.      sub tags_out {
  52.          my ($tags) = @_;
  53.          my %tags = $tags ? %$tags : ();
  54.          #$tags{'created_by'} ||= 'shp2osm.pl';
  55.          delete $tags{'_deleted'} unless $tags{'_deleted'};
  56.          while ( my ( $k, $v ) = each %tags ) {
  57.              my $key = encode_entities_numeric($k);
  58.              my $val = encode_entities_numeric($v);
  59.              push @nodes , '    <tag k="'. $key .'" v="'. $val ."\"/>\n" if $val;
  60.          }
  61.      }
  62.  
  63.      sub node_out {
  64.          my ( $lon, $lat, $tags ) = @_;
  65.          my $id = $i--;
  66.      
  67.          if($rungk) {
  68.              my ($wgs84lon, $wgs84lat) = gk2geo($lon, $lat);
  69.              push @nodes , "  <node id='$id' visible='true' lat='$wgs84lat' lon='$wgs84lon' />\n";
  70.          } else {
  71.             push @nodes , "  <node id='$id' visible='true' lat='$lat' lon='$lon' />\n";        
  72.          }
  73.          $id;
  74.      }
  75.  
  76.      sub seg_out {
  77.          my $id = $i+1;
  78.          $id;
  79.      }
  80.  
  81.      sub way_out {
  82.          my ( $segs, $tags ) = @_;
  83.          my $id = $i--;
  84.      $waycount++;
  85.      if ($waycount % 100 ==0)
  86.      {
  87.          print "new file $waycount\n";
  88. print OUT <<'END';
  89. </osm>
  90. END
  91.  
  92.  
  93.          close OUT;
  94.          mkdir "out" unless -d "out";
  95.          open OUT , ">out/ways_${waycount}.osm";
  96. print OUT <<'END';
  97. <?xml version='1.0'?>
  98. <osm version='0.5' generator='shp2osm.pl'>
  99. END
  100.  
  101.      }
  102.  
  103.  
  104.      print OUT join "\n",@nodes;
  105.      @nodes=();
  106.  
  107.          print OUT "  <way id='$id' visible='true'>\n";
  108.          print OUT "    <nd ref='$_' />\n" for @$segs;
  109.          tags_out $tags;
  110.          print OUT "  </way>\n";
  111.          $id;
  112.      }
  113. }
  114.  
  115.  
  116. print <<'END';
  117. </osm>
  118. END
  119.  
  120. sub polyline_out {
  121.     my ( $pts, $tags, $connect_last_seg ) = @_;
  122.  
  123.     my ( $first_node, $last_node, @segs );
  124.     for my $pt (@$pts) {
  125.         my $node = node_out @$pt;
  126.         push @segs, seg_out $last_node, $node;
  127.         $last_node = $node;
  128.         $first_node ||= $last_node;
  129.     }
  130.     push @segs, seg_out $last_node, $first_node
  131.       if $first_node && $connect_last_seg;
  132.     way_out \@segs, $tags;
  133. }
  134.  
  135. sub proc_obj {
  136.     my ( $shp, $dbf, $type ) = @_;
  137.     my $tags = { %default_tags, %$dbf };
  138.     my $is_polygon = $type % 10 == 5;
  139.     for ( 1 .. $shp->num_parts ) {
  140.         polyline_out [ map( [ $_->X(), $_->Y() ], $shp->get_part($_) ) ], $tags,
  141.           $is_polygon;
  142.     }
  143.  }
  144.  
  145. sub proc_shpf {
  146.     my ($shpf) = @_;
  147.     my $type = $shpf->shape_type;
  148.     for ( 1 .. $shpf->shapes() ) {
  149.         my $shp = $shpf->get_shp_record($_);
  150.         my %dbf = $shpf->get_dbf_record($_);
  151.         proc_obj $shp, \%dbf, $type;
  152.     }
  153. }
  154.  
  155. sub gk2geo {
  156.   my $sr  = $_[0];
  157.   my $sx  = $_[1];
  158.  
  159.   my $bm  = int($sr/1000000);
  160.   my $y   = $sr-($bm*1000000+500000);
  161.   my $si  = $sx/111120.6196;
  162.   my $px  = $si+0.143885358*sin(2*$si*0.017453292)+0.00021079*sin(4*$si*0.017453292)+0.000000423*sin(6*$si*0.017453292);
  163.   my $t   = (sin($px*0.017453292))/(cos($px*0.017453292));
  164.   my $v   = sqrt(1+0.006719219*cos($px*0.017453292)*cos($px*0.017453292));
  165.   my $ys  = ($y*$v)/6398786.85;
  166.   my $lat = $px-$ys*$ys*57.29577*$t*$v*$v*(0.5-$ys*$ys*(4.97-3*$t*$t)/24);
  167.   my $dl  = $ys*57.29577/cos($px*0.017453292) * (1- $ys * $ys /6*( $v * $v+2 * $t * $t- $ys * $ys *(0.6+1.1*$t*$t)*(0.6+1.1*$t*$t)));
  168.   my $lon = $bm*3+$dl;
  169.  
  170.   my $potsd_a  = 6377397.155;
  171.   my $wgs84_a  = 6378137.0;
  172.   my $potsd_f  = 1/299.152812838;
  173.   my $wgs84_f  = 1/298.257223563;
  174.  
  175.   my $potsd_es = 2*$potsd_f - $potsd_f*$potsd_f;
  176.  
  177.   my $potsd_dx = 606.0;
  178.   my $potsd_dy = 23.0;
  179.   my $potsd_dz = 413.0;
  180.   my $pi = 3.141592654;
  181.   my $latr = $lat/180*$pi;
  182.   my $lonr = $lon/180*$pi;
  183.  
  184.   my $sa = sin($latr);
  185.   my $ca = cos($latr);
  186.   my $so = sin($lonr);
  187.   my $co = cos($lonr);
  188.  
  189.   my $bda  = 1-$potsd_f;
  190.  
  191.   my $delta_a = $wgs84_a - $potsd_a;
  192.   my $delta_f = $wgs84_f - $potsd_f;
  193.  
  194.   my $rn = $potsd_a / sqrt(1-$potsd_es*sin($latr)*sin($latr));
  195.   my $rm = $potsd_a * ((1-$potsd_es)/sqrt(1-$potsd_es*sin($latr)*sin($latr)*1-$potsd_es*sin($latr)*sin($latr)*1-$potsd_es*sin($latr)*sin($latr)));
  196.  
  197.   my $ta = (-$potsd_dx*$sa*$co - $potsd_dy*$sa*$so)+$potsd_dz*$ca;
  198.   my $tb = $delta_a*(($rn*$potsd_es*$sa*$ca)/$potsd_a);
  199.   my $tc = $delta_f*($rm/$bda+$rn*$bda)*$sa*$ca;
  200.   my $dlat = ($ta+$tb+$tc)/$rm;
  201.  
  202.   my $dlon = (-$potsd_dx*$so + $potsd_dy*$co)/($rn*$ca);
  203.  
  204.   my $wgs84lat = ($latr + $dlat)*180/$pi;
  205.   my $wgs84lon = ($lonr + $dlon)*180/$pi;
  206.  
  207.   return( $wgs84lon, $wgs84lat);
  208. }
  209.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement