Show weather based on users location

12,689

Solution 1

This will get a user's zip code from their IP address using the open-source IP2Coordinates service from the Data Science Toolkit.

There are more accurate Geo-location APIs out there, but this one is absolutely free and dead simple to use. If I were developing this on a production site, I'd use HTML5 Geolocation as my primary method with a fallback to a better IP geolocator, like Max Mind.

Note that this will only work for US users of your site. You should probably pass more detailed data to one of the other Yahoo place APIs to get one of their WOEIDs to use (or pick a different weather API).

Here is the code for you. Put this right after the <?php tag in your sample code. Once you're sure it's working, comment out all the lines that begin with print.

//Get the user's IP address
$user_ip = $_SERVER['REMOTE_ADDR'];
//The Data Science Toolkit URL
$url = 'http://www.datasciencetoolkit.org/ip2coordinates/';
//Find the user's location from their IP. 
//*** You need the get_data function from the sample code
$raw_geocode = json_decode( get_data( $url . $user_ip) );
//Check if the user is in the US
if ('US' === $raw_geocode->$user_ip->country_code) {
  //If yes, store their zip code in a variable, and print it
  $zip_code = $raw_geocode->$user_ip->postal_code;
  printf('<p>Your zip code is: %s</p>', $raw_geocode->$user_ip->postal_code);
} else {
  //If the user isn't in the US, set a sip code that will work.
  $zip_code = '97211';
  //and print an error
  printf('<p>Sorry, this app does not work in %s.</p>', $raw_geocode->$user_ip->country_name);
}

//Print the raw data for debugging.
printf('<pre>%s</pre>', print_r($raw_geocode, true));

Now change the line in the sample code that begins with $data = to this:

$data = get_data("http://weather.yahooapis.com/forecastrss?p={$zip_code}&u=f");

Solution 2

You'll need an API for mapping visitors IP address to location ( ipapi.co ) and another one to get weather forecast for the location ( openweathermap.org ). The code below is for php (server side) :

# Part 1 (get latitude & longitude)
$ip = '1.2.3.4';
$api_1 = 'https://ipapi.co/' . $ip . '/latlong/';
$location = file_get_contents($api_1);
$point = explode(",", $location);

# Part 2 (get weather forecast)
$api_2 = 'http://api.openweathermap.org/data/2.5/weather?lat=' . $point[0] . '&lon=' . $point[1] . '&appid=API_KEY';
$weather = file_get_contents($api_2);

Solution 3

Using ipinfo.io and OpenWeatherMap

Javascript:

<script type="text/javascript" src="jquery.simpleopenweather.js"></script>
<script type="text/javascript">
    $(document).ready(function() {
        $.get("http://ipinfo.io", function (response) {
            $("#weather").attr('data-simpleopenweather-city', response.city).simpleopenweather({template: '<h2>'+'{{temperature}} '+'&deg;'+'C'+'<h2>', units: 'metric'});
        }, "jsonp");
    });
</script>

HTML:

<div id="weather" class="simpleopenweather" data-simpleopenweather-city=""></div>

It will show something like 6.3 ºC

Share:
12,689
user1373771
Author by

user1373771

Updated on June 04, 2022

Comments

  • user1373771
    user1373771 almost 2 years

    I am using a code that changes my wordpress website's background according to the Yahoo API URL I inserted. Is there anyway to make it automatically show the Visitors weather without any databases? I have though of using Google's API but I am a novice in programming and dont know how to implement it into my website. Please help! The code can be viewed here: http://css-tricks.com/using-weather-data-to-change-your-websites-apperance-through-php-and-css/

    Please be thorough because I am new to PHP Thanks!