Пишем свой информер погоды для сайта



Данный тикет не относится к разработке под MODX, но так как информер я разместил на MODX-сайте, то делюсь наработками здесь.
Вкратце: скрипт парсит XML с погодой и по нескольким условиям выводит результат на сайте.
Итак, XML для своего города берем тут и вставляем ссылку с дописанным /data/ в $rss = simplexml_load_file(...).
Значки «погоды» прилагаются.
Пример работы посмотреть можно тут.

$rss =  simplexml_load_file('http://www.eurometeo.ru/russia/amurskaya-oblast/zato-uglegorsk/export/xml/data/');  //Путь к XML с погодой нужного города
$city =  $rss->city->cityname;              //Город

//echo "Город: ".$city. "<br />";
$i = 0;
foreach ($rss->city->step as $step){
    $datetime = $step->datetime;            //Дата и время прогноза: гггг-мм-дд чч:мм:сс (2017-04-29 04:00:00)
    $davlenie = $step->pressure;            //Давление в мм.рт.мт
    $temper = $step->temperature;           //Температура воздуха в градусах Цельсия
    $vlazh = $step->humidity;               //Относительная влажность в % 
    $oblach = $step->cloudcover;            //Облачность в %
    $windspeed = $step->windspeed;          //Скорость ветра в м/с
    $windgust = $step->windgust;            //Порывы ветра в м/с
    $winddir = $step->winddir;              //Направление ветра в градусах от 0 до 359. 0 - южный ветер, ветер дует по направлению с юга, 90 - ветер с запада, 180 - ветер с севера, 270 - ветер с востока
    $osadki = $step->precipitation;         //Осадки за 3 часа в мм
    
    //Определяем время сутокю Тут время московское, поэтому для нас прибавляем 6 часов
    $timesofday = explode(" ", $datetime);  //Делим строку и выводим только время $timesofday[1] ($timesofday[0] - дата)
    if ($timesofday[1] == '04:00:00') {
        $timeday = 'Утро';
    }
    if ($timesofday[1] == '10:00:00') {
        $timeday = 'День';
    }
    if ($timesofday[1] == '16:00:00') {
        $timeday = 'Вечер';
    }
    if ($timesofday[1] == '22:00:00') {
        $timeday = 'Ночь';
    }
    
    //Облачность и осадки
    //1. ясно день
    if ($oblach < 33 and $osadki < 1) {
        $pogoda = 'yasno';
    }
    //1.1. ясно ночь
    if ($oblach < 33 and $osadki < 1 and $timeday == 'Ночь') {
        $pogoda = 'yasno_n';
    }
    //2. переменная облачность без осадков день
    if ($oblach >= 33 and $oblach < 66 and $osadki < 1) {
        $pogoda = 'perbezos';
    }
    //2.1. переменная облачность без осадков ночь
    if ($oblach >= 33 and $oblach < 66 and $osadki < 1 and $timeday == 'Ночь') {
        $pogoda = 'perbezos_n';
    }
    //3. переменная облачность с осадками - дождь день
    if ($oblach >= 33 and $oblach < 66 and $osadki > 1 and $temper >= 0) {
        $pogoda = 'persos_d';
    }
    //3.1. переменная облачность с осадками - дождь ночь
    if ($oblach >= 33 and $oblach < 66 and $osadki > 1 and $temper >= 0 and $timeday == 'Ночь') {
        $pogoda = 'persos_d_n';
    }
    //4. переменная облачность с осадками - снег день
    if ($oblach >= 33 and $oblach < 66 and $osadki > 1 and $temper < 0) {
        $pogoda = 'persos_s';
    }
    //4.4. переменная облачность с осадками - снег ночь
    if ($oblach >= 33 and $oblach < 66 and $osadki > 1 and $temper < 0 and $timeday == 'Ночь') {
        $pogoda = 'persos_s_n';
    }
    //5. облачно без осадков
    if ($oblach >= 66 and $osadki < 1) {
        $pogoda = 'oblbezos';
    }
    //6. облачно с осадками - дождь
    if ($oblach >= 66 and $osadki > 1 and $temper >= 0) {
        $pogoda = 'oblsos_d';
    }
    //7. облачно с осадками - снег
    if ($oblach >= 66 and $osadki > 1 and $temper < 0) {
        $pogoda = 'oblsos_s';
    }
    
    //Диапазон температур
    $temper_min = round($temper) - 1;
    $temper_max = round($temper) + 1;
    if ($temper_min > 0) {
        $temper_min = "+".$temper_min;
    }
    if ($temper_max > 0) {
        $temper_max = "+".$temper_max;
    }
    $dtemper = $temper_min."..".$temper_max;
    
    //Направление ветра
    //1. Южный ветер
    if ($winddir >= 0 and $winddir < 22.5) {
        $vectorwind = "южный";
    }
    if ($winddir >= 337.5 and $winddir <= 359) {
        $vectorwind = "южный";
    }
    //2. Юго-западный ветер
    if ($winddir >= 22.5 and $winddir < 67.5) {
        $vectorwind = "юго-зап.";
    }
    //3. Западный ветер
    if ($winddir >= 67.5 and $winddir < 112.5) {
        $vectorwind = "западный";
    }
    //4. Северо-западный ветер
    if ($winddir >= 112.5 and $winddir < 157.5) {
        $vectorwind = "сев.-зап.";
    }
    //5. Северный ветер
    if ($winddir >= 157.5 and $winddir < 202.5) {
        $vectorwind = "северный";
    }
    //6. Северо-восточный ветер
    if ($winddir >= 202.5 and $winddir < 247.5) {
        $vectorwind = "сев.-вост.";
    }
    //7. Восточный ветер
    if ($winddir >= 247.5 and $winddir < 292.5) {
        $vectorwind = "восточный";
    }
    //7. Юго-восточный ветер
    if ($winddir >= 292.5 and $winddir < 337.5) {
        $vectorwind = "юго-вост.";
    }
    
    echo "<div class='col-md-6 col-xs-6 tofday'>";
    echo "<b>".$timeday."</b><br />";
    //echo $datetime."<br />";
    echo "<img title='Облачность: ".$oblach." %. Осадки: ".round($osadki)." мм за 3 часа' class='pogoda_img' src='/assets/temp/img/pogoda/".$pogoda.".png'><br />";
    echo $dtemper."  °C<br />";
    echo $windspeed." м/с<br />".$vectorwind."<br />";
    echo "</div>";
    
    $i++;
    if ($i == 4) break;
};
Всем спасибо!)
P.S.: Не хватает рейтинга писать в другой раздел. Уважаемый админ, если возможно, перенесите, пожалуйста, по назначению, вдруг кому-то такое решение пригодится.
Василий Stepanov
29 апреля 2017, 15:02
modx.pro
4
1 746
+1
Поблагодарить автора Отправить деньги

Комментарии: 4

Roman Karimov
26 марта 2019, 09:24
0
Где взять значки?
Ivan
23 июля 2024, 14:58
0
готовое решения https://forecastnow.info/ru/widgets-gallery/
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    4