#!/usr/bin/perl -w use strict; use LWP::Simple; use XML::Simple; use POSIX qw(atan2); my $xml = "http://www.tinymicros.com/pm/monks.xml"; # Step 1 : Get data my $data = get( $xml ); my $ref = XMLin( $data ); # Step 2 : Calculate Center of Mass, need to write out coordinates too my $coordfile = "monk.coord"; open FILE, ">$coordfile" or die $!; my ( $total, $avg_x, $avg_y, $avg_z ) = ( 0,0,0,0 ); foreach my $monk ( keys %{ $ref->{ monk } } ) { my $lat = $ref->{ monk }->{ $monk }->{ location }->{ latitude }; my $long = $ref->{ monk }->{ $monk }->{ location }->{ longitude }; print FILE "$lat $long color=white\n"; $lat *= 3.14159/180; $long *= 3.14159/180; $total++; $avg_x += cos( $lat ) * sin( $long ); $avg_y += -cos( $lat ) * cos( $long ); $avg_z += sin( $lat ); } $avg_x = $avg_x/$total; $avg_y = $avg_y/$total; $avg_z = $avg_z/$total; close FILE; my $lat_av = atan2( $avg_z, sqrt( $avg_x*$avg_x + $avg_y*$avg_y ) ); my $long_av = atan2( $avg_x, -$avg_y ); $lat_av *= 180/3.14159; $long_av *= 180/3.14159; # Step 3: Write arcs to file my $arcfile = "monk.arcs"; open FILE, ">$arcfile" or die $!; foreach my $monk ( keys %{ $ref->{ monk } } ) { my $lat = $ref->{ monk }->{ $monk }->{ location }->{ latitude }; my $long = $ref->{ monk }->{ $monk }->{ location }->{ longitude }; printf FILE "%+8.2f %+8.2f %+8.2f %+8.2f color=ForestGreen spacing=0.5\n", $lat, $long, $lat_av, $long_av; } close FILE; my $avgfile = "monk.avg"; open FILE, ">$avgfile" or die $!; printf FILE "%+8.2f %+8.2f \"Average\" color=white\n", $lat_av, $long_av; close FILE; # Step 4 : Run xplanet my $mercator_map = "map1.png"; my $globe_map = "map2.png"; my $caption = "Copyright Michael K. Neylon -- Generated on " . localtime(time); my $lat_long = sprintf "Average location: Latitude %+3.2f, Longitude %+3.2f", $lat_av, $long_av; my $capfile = "monks.cap"; open FILE, ">$capfile" or die $!; print FILE "15 15 \"$caption\" image=none position=pixel color=yellow\n"; print FILE "580 15 \"$lat_long\" image=none position=pixel color=yellow\n"; close FILE; my $capfile2 = "monks2.cap"; open FILE, ">$capfile2" or die $!; print FILE "15 15 \"$caption\" image=none position=pixel color=darkred\n"; print FILE "580 15 \"$lat_long\" image=none position=pixel color=darkred\n"; close FILE; my $mercator_command = qq( xplanet -markerfile $coordfile -markerfile $avgfile -long $long_av -greatarcfile $arcfile -shade 100 -output $mercator_map -geometry 800x600 -grid -projection mercator -markerfile $capfile2 -grid1 6 -grid2 5 ); my $globe_command = qq( xplanet -markerfile $coordfile -markerfile $avgfile -long $long_av -lat $lat_av -greatarcfile $arcfile -output $globe_map -geometry 800x600 -starfreq 0 -grid -proj hemisphere -shade 100 -markerfile $capfile -grid1 6 -grid2 5 ); # Strip those returns... I like my code neat. $mercator_command =~ s/\n/ /g; $globe_command =~ s/\n/ /g; system $mercator_command; system $globe_command; 1;