Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re: Determining the distance from one zip code to another

by steveAZ98 (Monk)
on Sep 30, 2000 at 00:30 UTC ( #34684=note: print w/ replies, xml ) Need Help??


in reply to Determining the distance from one zip code to another

Here is a module that I wrote for that purpose. It will have to be modified for your needs, but should give you a good starting point for further development. Someday I will get around to making it an independent module. HTH

package Zips; use strict; use Time::HiRes qw(gettimeofday); sub get_coords { my ($s) = shift; my $dbh = $s->dbh; my ($zip) = @_; my $sth = $dbh->prepare(qq! SELECT lat,lng FROM zipcodes WHERE zip +='$zip' !); $sth->execute(); my ($lat,$lng) = $sth->fetchrow(); $sth->finish(); return ($lat,$lng); } sub radius_select { my ($s) = shift; my $dbh = $s->dbh; my ($zip,$m) = @_; my ($lat, $lng) = $s->get_coords($zip); if (($lat)&&($lng)) { print "<div align=center>Lat: $lat Long: $lng</div>\n"; my $d = $m / 3958.75; my $div = 57.2958; my $sth = $dbh->prepare(qq! SELECT zip,cname,state, ( 3958.75 * + ACOS( COS($lat/$div ) * COS(lat/$div) + SIN($lat/$div) * SIN(lat/$div) * COS($lng/$div - lng/$div) ) ) as +dist FROM zipcodes WHERE (ACOS( COS($lat/$div) * COS(l +at/$div) + SIN($lat/$div) * SIN(lat/$div) * COS($lng/$div - lng/$div) )) < $d ORDER BY dist !) || die "Can't select from zipcodes: + ", $dbh->errstr; #$s->write_log($sth->{Statement}); my $b = gettimeofday; $sth->execute() || die "Can't execute select on zipcodes: ", $ +sth->errstr; $s->e->{'qtime'} = gettimeofday-$b; my $r_all = $sth->fetchall_arrayref(); $sth->finish(); return $r_all; } else { print "Invalid Zip Code.\n"; } } sub get_limit_byzip { my ($s) = shift; my $dbh = $s->dbh; my ($zip,$m) = @_; my $d = 200 / 3958.75; my ($lat, $lng) = $s->get_coords($zip); if (($lat)&&($lng)) { print "<div align=center>Lat: $lat Long: $lng</div>\n"; my $d = $m / 3958.75; my $div = 57.2958; my $sth = $dbh->prepare(qq! SELECT zip,cname,state, ( 3958.75 * + ACOS( COS($lat/$div ) * COS(lat/$div) + SIN($lat/$div) * SIN(lat/$div) * COS($lng/$div - lng/$div) ) ) as +dist FROM zipcodes WHERE (ACOS( COS($lat/$div) * COS(l +at/$div) + SIN($lat/$div) * SIN(lat/$div) * COS($lng/$div - lng/$div) )) < $d Group by dist limit $m !) || die "Can't select from zipcodes: + ", $dbh->errstr; #$s->write_log($sth->{Statement}); my $b = gettimeofday; $sth->execute() || die "Can't execute select on zipcodes: ", $ +sth->errstr; $s->e->{'qtime'} = gettimeofday-$b; my $r_all = $sth->fetchall_arrayref(); $sth->finish(); return $r_all; } else { print "Invalid Zip Code.\n"; } } sub get_dist_byzip { my ($s) = shift; my ($zip, $zip2) = @_; my ($lat, $lng) = $s->get_coords($zip); my ($lat2,$lng2) = $s->get_coords($zip2); my $div = 57.2958; my $dist = (3958.75 * acos( cos($lat/$div) * cos($lat2/$div) + sin($lat/$div) * sin($lat2/$div) * cos($lng/$div - $lng2/$div) ) ); return $dist; } sub get_zips_bycity { my ($s) = shift; my ($city,$state,$dist) = @_; my $sth = $s->dbh->prepare(qq! SELECT zip FROM zipcodes WHERE cnam +e='$city' and state= '$state' !); $sth->execute(); my $zip = $sth->fetchrow(); $sth->finish(); return $s->radius_select($zip,$dist); } sub acos { atan2( sqrt(1 - $_[0] * $_[0]), $_[0] ); } 1; __END__ =pod =head1 NAME Zips.pm =head1 METHODS AVAILABLE $s->get_zips($zip, $dist) $s->get_coords($zip) => ($lat,$lng); $s->radius_select($zip,$m) => $r_all; $s->dist_select_byzip($zip, $zip2) => $dist; $s->acos() =head1 AUTHOR Stephen T. Walker <swalker@ssdw.com> August 2000 =cut


Comment on Re: Determining the distance from one zip code to another
Download Code

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://34684]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (15)
As of 2015-07-28 20:53 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (259 votes), past polls