#!/usr/bin/perl use DBI; use Math::Trig; use strict; use CGI qw/:standard/; print header(-type => 'text/xml'); my $dbh = DBI->connect( 'dbi:mysql:database=mapsbookex;host=db.maps.mcslp.com', 'mapsbookex', 'examples', ); if (!defined($dbh)) { die "Couldn't open connection to database\n"; } if (param('m') eq 'saveroute') { saveroute(); } if (param('m') eq 'delroute') { delroute(param('routeid')); } elsif(param('m') eq 'listroutes') { listroutes(); } elsif(param('m') eq 'getroute') { getroute(param('routeid')); } sub delroute { my ($routeid) = @_; $dbh->do(sprintf('delete from ch12_routesimple where routeid=%s', $routeid)); $dbh->do(sprintf('delete from ch12_routepoints where routeid=%s', $routeid)); xmlmessage('Route deleted'); } sub listroutes { my $sth = $dbh->prepare('select ch12_routesimple.routeid,title,lat,lng from ch12_routesimple,ch12_routepoints where ch12_routesimple.routeid = ch12_routepoints.routeid and seqid = 1 order by title'); $sth->execute(); print ""; while (my $row = $sth->fetchrow_hashref()) { printf('', $row->{routeid}, $row->{title}, $row->{lat}, $row->{lng} ); } print ""; } sub latlngdistance { my ($xdeg1,$ydeg1,$xdeg2,$ydeg2) = @_; my ($x1,$y1,$x2,$y2) = (deg2rad($xdeg1), deg2rad($ydeg1), deg2rad($xdeg2), deg2rad($ydeg2)); my $radius = 6371; my $latdistance = $x2 - $x1; my $lngdistance = $y2 - $y1; my $a = sin($latdistance/2) * sin($latdistance/2) + cos($x1) * cos($x2) * sin($lngdistance/2) * sin($lngdistance/2); my $c = 2 * atan2(sqrt($a), sqrt(1-$a)); my $d = $radius * $c; return $d; } sub saveroute { my $title = param('title'); my $description = param('desc'); my $points = param('points'); my @pointlist = split(/,/,$points); my $routeid; if (defined(param('routeid')) && param('routeid') != 0) { $routeid = param('routeid'); $dbh->do(sprintf('update ch12_routesimple set title=%s,description=%s where routeid=%s', $dbh->quote($title), $dbh->quote($description), $routeid)); $dbh->do(sprintf('delete from ch12_routepoints where routeid=%s', $routeid)); } else { $dbh->do(sprintf('insert into ch12_routesimple values(0,%s,%s)', $dbh->quote($title), $dbh->quote($description))); $routeid = $dbh->{mysql_insertid}; } foreach my $point (@pointlist) { my ($seqid,$x,$y) = split(/:/,$point); $dbh->do(sprintf('insert into ch12_routepoints values(%s,%s,%s,%s)', $dbh->quote($routeid), $dbh->quote($x), $dbh->quote($y), $dbh->quote($seqid))); } xmlmessage('Route added',{routeid => $routeid}); } sub getroute { my ($reqrouteid) = @_; my $routedata = $dbh->selectrow_hashref('select routeid,title,description from ch12_routesimple where routeid = ' . $dbh->quote($reqrouteid)); if ($routedata->{routeid} != $reqrouteid) { xmlmessage('Error: route not found'); return(); } printf('', $routedata->{routeid}, $routedata->{title}, $routedata->{description}); my $sth = $dbh->prepare(sprintf('select lat,lng from ch12_routepoints where routeid = %s order by seqid', $dbh->quote($routedata->{routeid}))); $sth->execute(); my $distance = 0; my $seq = 0; my ($lastx,$lasty) = (undef,undef); while (my $row = $sth->fetchrow_hashref()) { $seq++; printf('', $row->{lat}, $row->{lng}, ); if ($seq >= 2) { $distance += latlngdistance($lastx,$lasty,$row->{lat},$row->{lng}); } ($lastx,$lasty) = ($row->{lat},$row->{lng}); } $sth->finish(); printf('',$distance,($distance/1.609344)); print("\n"); } sub xmlmessage { my ($message,$attrib) = @_; printf('', $message, join(' ',map {sprintf('%s="%s"',$_,$attrib->{$_}) } keys %{$attrib})); }