Last active
September 26, 2022 18:02
-
-
Save stsibel/41c3f52b931d948c1548 to your computer and use it in GitHub Desktop.
MySQL query to find zip-codes within given radius from any point (or zip-code)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Given table 'zipcodes' with columns: | |
zipcode, latitude, longitude. | |
Find zipcodes within radius from given zipcode. | |
EXAMPLE: | |
Coordinates for zip 91326 and radius 25 mi: | |
*/ | |
SET @location_lat = 34.2766, | |
@location_lon = -118.544; | |
SELECT zipcode, ( 3959 * acos( cos( radians(@location_lat) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(@location_lon) ) + sin( radians(@location_lat) ) * sin( radians( latitude ) ) ) ) AS distance | |
FROM zipcodes | |
HAVING distance < 25; | |
/* | |
Result: | |
+-------------+-------------------+ | |
| zipcode | distance | | |
+-------------+-------------------+ | |
| 90004 | 19.32764527143567 | | |
| 90005 | 20.34491933480445 | | |
| 90006 | 21.56930375425860 | | |
| ... | ... | | |
+-------------+-------------------+ | |
*/ |
<?php
$host_name = 'localhost';
$database = 'db1';
$user_name = 'root';
$password = 'pswd';
$zipcode = $_POST['zipcode'];
$distance = $_POST['distance'];
// Create connection
$conn = new mysqli($host_name, $user_name, $password, $database);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT * FROM zipcodeus WHERE zipcode = '$zipcode'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
$lat1 = $row["latitude"];
$lon1 = $row["longitude"];
// echo
// "zipcode: " . $row["zipcode"].
// "latitude: " . $row["latitude"].
// "longitude: " . $row["longitude"].
// " - city: " . $row["city"].
// " - state: " . $row["name_state"]. "<br>";
}
} else {
echo "0 results";
}
$query = "SELECT *, ( 3959 * acos( cos( radians($lat1) )
* cos( radians( latitude ) )
* cos( radians( longitude )
- radians($lon1) )
+ sin( radians($lat1) )
* sin( radians( latitude ) ) ) )
AS distance
FROM zipcodeus
HAVING distance < $distance;";
$print = $conn->query($query);
if ($print->num_rows > 0) {
// output data of each row
while($row = $print->fetch_assoc()) {
echo "zipcode: "
. $row["zipcode"]. "latitude: "
. $row["latitude"]. "longitude: "
. $row["longitude"]. " - city: "
. $row["city"]. " - state: "
. $row["name_state"]. "<br>";
}
} else {
echo "0 results";
}
$conn->close();
?>
what is 3959
@sujit-thoughti very good question. 3959 is the radius of our planet (Earth) in miles according to IUGG standard. You can read more about it here: https://en.wikipedia.org/wiki/Earth_radius.
P.S. If you will even have to get list of zip codes within a specific distance on the Mars, you can replace 3959 with 2106.1
@stsibel SELECT zipcode, ( 3959 * acos( cos( radians(@location_lat) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(@location_lon) ) + sin( radians(@location_lat) ) * sin( radians( latitude ) ) ) ) AS distance FROM zipcodes HAVING distance < 25;
could you please tell me what value do i need to place in latitude? do we need to pass the same value which we are assigning in set operation.
thanks
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Theory part: http://www.movable-type.co.uk/scripts/latlong.html
and the formula itself http://en.wikipedia.org/wiki/Haversine_formula