Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Comment on

( #3333=superdoc: print w/ replies, xml ) Need Help??
Hi, Monks!
I would like to ask a question if anyone would know a formula to get all locations, ina a radius, if a starting Zip Code and Distance in Miles or Kilometers was given?
The code I have here give the distance between, but what I am looking for is to get all the location near a Zip Code and distance given.
Here is the code

This is the HTML form:
<FORM METHOD="post" ACTION="../cgi-bin/findzip.cgi"> Enter zips:<br> <table> <tr><td>First Zip Code</td><td><input name="zip1"></td></tr> <tr><td>Second Zip Code</td><td><input name="zip2"></td></tr> </table> <INPUT TYPE=submit VALUE="Look up Zips and distances"> </FORM>

Here is actually the HTML form that I want to use:
<FORM METHOD="post" ACTION="../cgi-bin/findzip.cgi"> <input type="hidden" name="zip1" value="02110"> <table width="300" border="0" align="center" cellpadding="4" cel +lspacing="0" bgcolor="#FBFBFB"> <tr align="center"> <td colspan="2"><b>Zip Radius Search</b></td> </tr> <tr> <td align="right">Zip code:</td> <td><input type="text" name="zip2" size="5" maxlength="5"></ +td> </tr> <tr> <td align="right">Distance:</td> <td> <select name="distance"> <option>2</option> <option>5</option> <option>8</option> <option>10</option> </select> &nbsp; &nbsp; <select name="unit"> <option value='0'>Miles</option> <option value='1'>KM</option> </select> </td> </tr> <tr> <td></td> <td><input type="submit" name="Submit" value="Show all citie +s"></td> </tr> </table> </form>


The perl code:
#!/perl/bin/perl #use strict; print "Content-type: text/html\n\n"; print "<h1>Zip Code Lookup Results</h1>\n"; $debug=0; if ($ENV{'CONTENT_LENGTH'} == 0) { $ENV{'CONTENT_LENGTH'} = 62; $debug = 1; } print "L15 - $ENV{'CONTENT_LENGTH'}<br>\n"; $argcnt=0; read(STDIN, $input, $ENV{'CONTENT_LENGTH'}); if ($debug) { print "Input string:$input <br>"; print "L23 - $ENV{'CONTENT_LENGTH'}<br>\n"; } @input = split(/&/,$input); PARSE: for ($i=0;$i<=$#input;$i++){ ($g, $z) = split(/=/, $input[$i],2); # $z =~ s/ //g; last PARSE if ($z==""); $ARGV[$i] = $z; $argcnt++; } $argcnt--; #print "LINE 35 - argcnt=$argcnt<br>"; # $zlist = split(/=/,@input); $stime=time(); @ziplist = ($z1, $z2); print "L44 - $ziplist[0] $ziplist[1] <br><hr>"; $stime=time(); #$ARGV[0]=$z1; #$ARGV[1]=$z2; for ($i=0; $i<= $argcnt;$i++){ #print "In find loop: $i\n"; ($zip[$i], $state[$i], $city[$i], $lat[$i], $long[$i]) = findzip($ +ARGV[$i]); $city[$i] =~ s/^ +//g; #match one or more spaces at the start of + a line. # print "$zip[$i], $city[$i], $state[$i], $lat[$i], $long[$i]\n<br>" +; if ($lat[$i] == 0 || $long[$i] == 0){ print "Zip $zip[$i] is missing location information<br>\n"; } } for ($i=0; $i <= $argcnt; $i++){ $dest=$i+1; if ($i == $argcnt) {$dest=0;} $dst[$i] = dist($lat[$i], $long[$i], $lat[$dest], $long[$dest] +); if ($lat[$i] == 0 || $long[$i] == 0 || $lat[$dest] == 0 || $long[$dest] == 0) { $dst[$i] = "Unknown distance"; } else { #print "$dst[$i]\n"; $dst[$i] =~ s/\..+/ miles/; #print "$dst[$i]\n"; } # print "$city[$i], $state[$i] $zip[$i] $lat[$i] $long[$i] to #$city[$dest], $state[$dest] $zip[$dest] $lat[$dest] $long[$dest] :"; print "L 85 - $city[$i], $state[$i] $zip[$i] to $city[$dest], $state[$dest] $zip[$dest] : "; print "<b>$dst[$i] (lat $lat[$i] long $long[$i])</b>****$dst[$i +]****<br>"; } print "L90 - <HR>\n"; $etime=time(); elapsed() ; print "<a href=\"../../zip/zipmain.html\">Return to Zip Code Lookup</a +><br>\n"; #print "<a href=\"/index.htm\">Go to ZIP!</a><br>\n"; exit; $linecnt=1; #loop counter, how many have we looked at? $fnd=-1; #how many have we found? SEARCH: while ($line = <ZIP>) { $thiszip = substr($line, 0, 5); $i=0; while ($ARGV[$i]){ if ($thiszip == $ARGV[$i]){ $short = substr($line, 0, 50); print "line #: $linecnt Found Zip: $short"; chomp $line; ($zip[$i], $state[$i], $name[$i], $lat[$i], $long[$i]) = split /,/,$line,5; @fullline[$i] = $line; $fnd++; last SEARCH if($fnd==$#ARGV) ; } $i++; } $linecnt++; } print "\n\n"; $i=0; for ($i=0; $i <= $#ARGV; $i++){ $dest=$i+1; if ($i == $#ARGV) {$dest=0;} $dst[$i] = dist($lat[$i], $long[$i], $lat[$dest], $long[$dest] +); print "$name[$i], $state[$i] to $name[$dest], $state[$dest]: $ +dst[$i] miles \n"; } exit; sub elapsed { # etime set after search. $etime=time(); #print "-------------------------------------------------------------- +-\n"; #print "start = $stime end = $etime<br> \n"; print "Elapsed time = "; print $etime - $stime; print "<br><br><br>\n"; } sub acos { atan2( sqrt(1-$_[0] * $_[0]), $_[0]) } sub dist { $pi = atan2(1,1) * 4; my @parms = @_; my $lat1 = $parms[0]/180 * $pi ; my $long1 = $parms[1]/180 * $pi; my $lat2 = $parms[2]/180 * $pi; my $long2 = $parms[3]/180 * $pi; # print "$lat1, $long1, $lat2, $long2 \n"; $a = $long1 - $long2; if ($a < 0) {$a = -$a;} if ($a > $pi) {$a = 2 * $pi;} $d = acos(sin($lat2) * sin($lat1) + cos($lat2)*cos($lat1)*cos($a)) + * 3958; return $d ; } ###################################################################### +### #This findzip is awesome...uses an index, and works okay. It is fast +and #cool. Next issue: Can we do without the index? sub findzipX { my @parms = @_; my $z = $parms[0]; open(ZIP, "zip2.txt") ; open(NDX, "zip.ndx") ; $keysize=11; #how long is the key $zipsize=52; #how long is a zip code record $zipcnt=42730; #how many zip codes are in file $max = $zipcnt; $min = 0; $cand=""; $itcnt=0; while ($cand != $z and itcnt < 100){ #set a search value #read it #key is either greater, lesser, or equal $search=int($min + (($max-$min)/2)); seek NDX, $search*$keysize, 0; read NDX, $line,$keysize; ($cand, $key) = split /:/,$line ; if ($cand > $z) { $max= $search; #$min= $min; } elsif ($cand < $z){ #$max= $max; $min= $search; } print "Cnt=$itcnt zip=$cand key=$key search=$search max=$max m +in=$min\n"; $itcnt++; } # print "Cnt=$itcnt zip=$cand key=$key search=$search max=$max min= +$min\n"; # print "\n"; # print "key=$key\n"; seek ZIP, ($key*$zipsize), 0; read ZIP, $line, $zipsize; # print "In findzip $z=$line\n"; return split /,/,$line; } ###################################################################### +#### sub test { return "Test1","test2"; } ###################################################################### +### #this is a copy of the original findzip (now findzipx)...I am trying t +o do #without the index file. sub findzip { my @parms = @_; my $z = $parms[0]; #print "Looking for $z\n"; # open(ZIP, "zip2.txt") ; # open(NDX, "zip.ndx") ; #now try the 'normal' zip.txt file, no indexing, no optimization. open(ZIP, "zip.txt"); $keysize=11; #how long is the key $zipsize=52; #how long is a zip code record $zipcnt=42730; #how many zip codes are in file #the technique is similar... $zipsize = 1698323; # of bytes in zip.txt #everything now refers to bytes, rather than records $max = $zipsize; $min = 0; $cand=""; $itcnt=0; $search=int($min + (($max-$min)/2)); # print "Cnt=$itcnt zip=$cand key=$key search=$search max=$maxmin=$ +min\n"; while ($cand != $z){ #set a search value #read it #key is either greater, lesser, or equal $search=int($min + (($max-$min)/2)); if ($itcnt > 100) { @alist = ($z,"Not Found","Not Found","",""); @alist; return; } #print "In loop search $search max $max min $min itcnt $itcnt\n"; seek ZIP, $search, 0; # read NDX, $line,$keysize; #get rid of a partial line because we probably seek'ed into th +e middle of a record $line = <ZIP> ; #partial line $line = <ZIP> ; #read a full line ($cand, $key) = split /:/,$line,2 ; #just first two fields if ($cand > $z) { $max= $search + 100; #plus 100, just to make sure we don't l +ose a line # $min= $min; } elsif ($cand<$z){ # $max= $max; $min= $search - 100; } # print "Cnt=$itcnt zip=$cand key=$key search=$search max=$max #min=$min\n"; $itcnt++; } # print "Cnt=$itcnt zip=$cand key=$key search=$search max=$max min= +$min\n"; # print "\n"; # print "key=$key\n"; #--- seek ZIP, ($key*$zipsize), 0; #--- read ZIP, $line, $zipsize; # print "In findzip $z=$line\n"; return split /,/,$line; }

Data Sample (It will be to big to have all the data for the zip locations, but here is some:
00401,NY,Pleasantville,41.075800,-73.47300 00501,NY,Holtsville,40.485500,-73.02400 00544,NY,Holtsville,40.485500,-73.02400 00601,PR,Adjuntas,18.095300,-66.43200 00602,PR,Aguada,18.225300,-67.11100 00603,PR,Aguadilla,18.254600,-67.09100 00604,PR,Aguadilla,18.254600,-67.09100 00605,PR,Aguadilla,18.254600,-67.09100 00607,PR,Aguas Buenas,18.153200,-66.06100 00608,PR,Aguirre,0.000000,0.00000 00609,PR,Aibonito,18.083100,-66.15500 00610,PR,Anasco,18.170500,-67.08200 00611,PR,Angeles,18.171300,-66.47500 00612,PR,Arecibo,18.282800,-66.42500 00613,PR,Arecibo,18.282800,-66.42500 00615,PR,Arroyo,17.580400,-66.03400 00616,PR,Bajadero,18.254300,-66.41000 00617,PR,Barceloneta,18.270900,-66.32200 00618,PR,Barranquitas,18.111900,-66.18200 00619,PR,Bayamon,18.240200,-66.09200 00620,PR,San Juan,18.280600,-66.06200 00621,PR,Bayamon,18.240200,-66.09200 00622,PR,Boqueron,18.035700,-66.30100 00623,PR,Cabo Rojo,18.051900,-67.08400 00625,PR,Caguas,18.141000,-66.02500 00626,PR,Caguas,18.141000,-66.02500 00627,PR,Camuy,18.290900,-66.50400 00628,PR,Carolina,18.225800,-65.57200


Thanks for the Help!!!

In reply to Getting Locations using Distance by Anonymous Monk

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?
    Username:
    Password:

    What's my password?
    Create A New User
    Chatterbox?
    and the web crawler heard nothing...

    How do I use this? | Other CB clients
    Other Users?
    Others taking refuge in the Monastery: (14)
    As of 2015-07-02 22:03 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 (45 votes), past polls