Version: 1.0
Type: Sample Code (HOWTO)
Category: Databases
License: GNU General Public License
Description: This code provides the mysql formula to locate and/or compute the distance between two zip codes given that you have a database of zipcodes and latitude/longitude.
I couldn’t find a good version of this anywhere else and getting the () right in mysql was a bit of a bear. Hopefully someone else will have a shorter project starting with this.
<?php /* this program finds zip codes by distance from a particular zip code using the Haversine Formula - considered to be the most accurate computation, if you can deal with the earth as a sphere (don't laugh it actually is an ellipsoid) */ /* the zip code database is in the form of zipcode, latitude, longitude */ /* you can get a parseable copy of this data from the us census bureau www.census.gov */ /* http://mathforum.org/library/drmath/view/51879.html for the math part */ /* replace 3957 with the radius of the earth in kilometers for metric */ /* as is, does miles */ $ddb="yourdatabasename" ; $ddbh=mysql_connect("yourdatabasehost","yourdatabaseuser","yourdatabasepassword") ; ?> <html> <body> <form action=findzips.php method=post> <input type=text name=dealerzip value="<?php echo $dealerzip; ?>"> <input type=submit name=submit value="get zips"> </form> <?php $thisdealerquery = "select * from ziplatlong where zipcode='$dealerzip'" ; $thisdealerresult = mysql_db_query($ddb,$thisdealerquery,$ddbh) ; if ($thisdealerresult && mysql_numrows($thisdealerresult)) { $dealerlat = mysql_result($thisdealerresult,0,latitude); $dealerlong = mysql_result($thisdealerresult,0,longitude); $findzips = "SELECT * , 3957 * 2 * atan2( sqrt( pow( (sin(0.0174*(latitude-$dealerlat)/2)),2 ) + cos(0.0174*$dealerlat) * cos(0.0174*latitude) * pow( (sin(0.0174*(longitude-$dealerlong)/2)),2 ) ) , sqrt(1- ( pow( (sin(0.0174*(latitude-$dealerlat)/2)),2 ) + cos(0.0174*$dealerlat) * cos(0.0174*latitude) * pow( (sin(0.0174*(longitude-$dealerlong)/2)),2 ) ) ) ) as distance FROM ziplatlong ORDER BY distance LIMIT 100 " ; $dealersresult = mysql_db_query($ddb,$findzips,$ddbh) ; while ( $drow=mysql_fetch_array($dealersresult) ) { echo "$drow[zipcode] - $drow[distance]<br>n" ; } } ?> </body> </html>