Погода от Гидрометцентра - 3. Прогноз подробный

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Погода от Гидрометцентра - 3. Прогноз подробный

Сообщение xor » Чт июн 30, 2016 12:25 am

Прогноз на странице http://meteoinfo.ru/forecasts5000/russi ... domodedowo, там где вкладка с графиком, показывает температуру, направление и скорость ветра, давление, влажность, количество и вероятность осадков и описание погоды по населенному пункту на протяжении 4 суток.
Интересно это утащить к себе.

При просмотре кода страницы наткнулся на данные для графика:

Код: Выделить всё

arr_temperature=[{x: Date.UTC(2016,5,29,21), y: 19.6, ind: 0}, {x: Date.UTC(2016,5,29,22), y: 18.7, ind: 1}, {x: Date.UTC(2016,5,29,23), y: 17.8, ind: 2}, {x: Date.UTC(2016,5,30,0), y: 16.9, ind: 3}, {x: Date.UTC(2016,5,30,1), y: 16.1, ind: 4}, {x: Date.UTC(2016,5,30,2), y: 15.2, ind: 5}, {x: Date.UTC(2016,5,30,3), y: 14.4, ind: 6}, {x: Date.UTC(2016,5,30,4), y: 13.7, ind: 7}, {x: Date.UTC(2016,5,30,5), y: 13.4, ind: 8}, {x: Date.UTC(2016,5,30,6), y: 14.5, ind: 9}, {x: Date.UTC(2016,5,30,7), y: 16.9, ind: 10}, {x: Date.UTC(2016,5,30,8), y: 19.7, ind: 11}, 
и т.д.

Был написан скрипт для чтения этих данных в новую таблицу meteoinfo со структурой id, added, date_forecast, type, value
КодПоказать

Код: Выделить всё

debmes('get_meteoinfo_forecast start');

$lines=file('http://meteoinfo.ru/forecasts5000/russia/moscow-area/domodedowo');
if(!lines){
 debmes('get_meteoinfo_forecast - Не могу прочесть файл с meteoinfo.ru');
 return;
}
// Осуществим проход массива и выведем номера строк и их содержимое в виде HTML-кода.

foreach ($lines as $line_num => $line) {
  //echo "Строка #<b>{$line_num}</b> : " . strip_tags($line) . "<br />\n";

  $mystr=strip_tags($line); //очистим строку

 $pos=strpos( $mystr,'arr_temperature=['); //температура
 if($pos===0){
  $repl=array('arr_temperature=[{', '}];', '}, {'); //заменим на |
  $mstr=str_replace($repl,"|",$mystr); 
  $arr_temp=explode('|',$mstr);

  $repl=array('x: Date.UTC(','), y:', ', ind:',','); //заменим на |
  foreach($arr_temp as $t1){
   $t1=str_replace($repl," ",$t1);

   list($year, $month, $day,$hour,$temp,$id) = sscanf($t1, "%d %d %d %d %s %d");
   if($year>2000){

     $temp=(float)$temp;
     $month=$month+1;//месяцы с 0!
     $date=$year.'-'.$month.'-'.$day.' '.$hour.':00';

       $Record=SQLSelectOne("SELECT * FROM meteoinfo  WHERE DATE_FORECAST='".$date."' and TYPE='temperature';");
       $Record['DATE_FORECAST']=$date;
       $Record['TYPE']='temperature';
       $Record['VALUE']=$temp;
       $Record['ADDED']=date('Y-m-d H:i:s');    
       SQLUpdateInsert('meteoinfo', $Record);
    
   }
  }
 }
//arr_wind_dir=
 $pos=strpos( $mystr,'arr_wind_dir=['); //ветер - направление
 if($pos===0){
  $repl=array('arr_wind_dir=[{', '}];', '}, {'); //заменим на |
  $mstr=str_replace($repl,"|",$mystr); 
  $arr_wd=explode('|',$mstr);

  $repl=array('x: Date.UTC(','), y:', ', ind:',','); //заменим на |
  foreach($arr_wd as $t1){
   $t1=str_replace($repl," ",$t1);

   list($year, $month, $day,$hour,$temp,$id) = sscanf($t1, "%d %d %d %d %s %d");
   if($year>2000){
     $temp=(float)$temp;
     $month=$month+1;
     $date=$year.'-'.$month.'-'.$day.' '.$hour.':00';

       $Record=SQLSelectOne("SELECT * FROM meteoinfo  WHERE DATE_FORECAST='".$date."' and TYPE='wind_dir';");
       $Record['DATE_FORECAST']=$date;
       $Record['TYPE']='wind_dir';
       $Record['VALUE']=$temp;
       $Record['ADDED']=date('Y-m-d H:i:s');     
       SQLUpdateInsert('meteoinfo', $Record);    
   }
  }
 }
  $pos=strpos( $mystr,'arr_wind_speed=['); //ветер - скорость
 if($pos===0){
  $repl=array('arr_wind_speed=[{', '}];', '}, {'); //заменим на |
  $mstr=str_replace($repl,"|",$mystr); 
  $arr_ws=explode('|',$mstr);

  $repl=array('x: Date.UTC(','), y:', ', ind:',','); //заменим на |
  foreach($arr_ws as $t1){
   $t1=str_replace($repl," ",$t1);

   list($year, $month, $day,$hour,$temp,$id) = sscanf($t1, "%d %d %d %d %s %d");
   if($year>2000){
     $temp=(float)$temp;
     $month=$month+1;
     $date=$year.'-'.$month.'-'.$day.' '.$hour.':00';

       $Record=SQLSelectOne("SELECT * FROM meteoinfo  WHERE DATE_FORECAST='".$date."' and TYPE='wind_speed';");
       $Record['DATE_FORECAST']=$date;
       $Record['TYPE']='wind_speed';
       $Record['VALUE']=$temp;
       $Record['ADDED']=date('Y-m-d H:i:s');     
       SQLUpdateInsert('meteoinfo', $Record);  
   }
  }
 }

  $pos=strpos( $mystr,'arr_pressure=['); //давление
 if($pos===0){
  $repl=array('arr_pressure=[{', '}];', '}, {'); //заменим на |
  $mstr=str_replace($repl,"|",$mystr); 
  $arr_pr=explode('|',$mstr);

  $repl=array('x: Date.UTC(','), y:', ', ind:',','); //заменим на |
  foreach($arr_pr as $t1){
   $t1=str_replace($repl," ",$t1);

   list($year, $month, $day,$hour,$temp,$id) = sscanf($t1, "%d %d %d %d %s %d");
   if($year>2000){
     $temp=(float)$temp;
     $month=$month+1;
     $date=$year.'-'.$month.'-'.$day.' '.$hour.':00';

       $Record=SQLSelectOne("SELECT * FROM meteoinfo  WHERE DATE_FORECAST='".$date."' and TYPE='pressure';");
       $Record['DATE_FORECAST']=$date;
       $Record['TYPE']='pressure';
       $Record['VALUE']=$temp;
       $Record['ADDED']=date('Y-m-d H:i:s');     
       SQLUpdateInsert('meteoinfo', $Record);  
   }
  }
 } 

  $pos=strpos( $mystr,'arr_precip_val=['); //
 if($pos===0){
  $repl=array('arr_precip_val=[{', '}];', '}, {'); //заменим на |
  $mstr=str_replace($repl,"|",$mystr); 
  $arr_pv=explode('|',$mstr);

  $repl=array('x: Date.UTC(','), y:', ', ind:',','); //заменим на |
  foreach($arr_pv as $t1){
   $t1=str_replace($repl," ",$t1);

   list($year, $month, $day,$hour,$temp,$id) = sscanf($t1, "%d %d %d %d %s %d");
   if($year>2000){
     $temp=(float)$temp;
     $month=$month+1;
     $date=$year.'-'.$month.'-'.$day.' '.$hour.':00';

       $Record=SQLSelectOne("SELECT * FROM meteoinfo  WHERE DATE_FORECAST='".$date."' and TYPE='precip_val';");
       $Record['DATE_FORECAST']=$date;
       $Record['TYPE']='precip_val';
       $Record['VALUE']=$temp;
       $Record['ADDED']=date('Y-m-d H:i:s');     
       SQLUpdateInsert('meteoinfo', $Record);    
   }
  }
 } 
  $pos=strpos( $mystr,'arr_precip_ver=['); //
 if($pos===0){
  $repl=array('arr_precip_ver=[{', '}];', '}, {'); //заменим на |
  $mstr=str_replace($repl,"|",$mystr); 
  $arr_pver=explode('|',$mstr);

  $repl=array('x: Date.UTC(','), y:', ', ind:',','); //заменим на |
  foreach($arr_pver as $t1){
   $t1=str_replace($repl," ",$t1);

   list($year, $month, $day,$hour,$temp,$id) = sscanf($t1, "%d %d %d %d %s %d");
   if($year>2000){
     $temp=(float)$temp;
     $month=$month+1;
     $date=$year.'-'.$month.'-'.$day.' '.$hour.':00';

       $Record=SQLSelectOne("SELECT * FROM meteoinfo  WHERE DATE_FORECAST='".$date."' and TYPE='precip_ver';");
       $Record['DATE_FORECAST']=$date;
       $Record['TYPE']='precip_ver';
       $Record['VALUE']=$temp;
       $Record['ADDED']=date('Y-m-d H:i:s');     
       SQLUpdateInsert('meteoinfo', $Record);     
   }
  }
 } 

  $pos=strpos( $mystr,'arr_humidity=['); //
 if($pos===0){
  $repl=array('arr_humidity=[{', '}];', '}, {'); //заменим на |
  $mstr=str_replace($repl,"|",$mystr); 
  $arr_h=explode('|',$mstr);

  $repl=array('x: Date.UTC(','), y:', ', ind:',','); //заменим на |
  foreach($arr_h as $t1){
   $t1=str_replace($repl," ",$t1);

   list($year, $month, $day,$hour,$temp,$id) = sscanf($t1, "%d %d %d %d %s %d");
   if($year>2000){
     $temp=(float)$temp;
     $month=$month+1;
     $date=$year.'-'.$month.'-'.$day.' '.$hour.':00';

       $Record=SQLSelectOne("SELECT * FROM meteoinfo  WHERE DATE_FORECAST='".$date."' and TYPE='humidity';");
       $Record['DATE_FORECAST']=$date;
       $Record['TYPE']='humidity';
       $Record['VALUE']=$temp;
       $Record['ADDED']=date('Y-m-d H:i:s');     
       SQLUpdateInsert('meteoinfo', $Record);     
   }
  }
 } 

  $pos=strpos( $mystr,'arr_phenomenon=['); //описание погоды
 if($pos===0){
  $repl=array('arr_phenomenon=[{', '}];', '}, {'); //заменим на |
  $mstr=str_replace($repl,"|",$mystr); 
  $arr_phi=explode('|',$mstr);

  $repl=array('x: Date.UTC(','), y:', ', ind:'); //заменим на ' '
  foreach($arr_phi as $t1){
   $t1=str_replace($repl," ",$t1);
   list($year, $month, $day,$hour) = sscanf($t1, "%d,%d,%d,%d");
   if($year>2000){
    $ps=strpos($t1,'"');
    if(!$ps===false){
    $ps1=strpos($t1,'"',$ps+1);
    $temp=substr($t1,$ps+1,$ps1-$ps-1);
    }
    
     $month=$month+1;
     $date=$year.'-'.$month.'-'.$day.' '.$hour.':00';

       $Record=SQLSelectOne("SELECT * FROM meteoinfo  WHERE DATE_FORECAST='".$date."' and TYPE='phenomenon_img';");
       $Record['DATE_FORECAST']=$date;
       $Record['TYPE']='phenomenon_img';
       $Record['VALUE']=$temp;
       $Record['ADDED']=date('Y-m-d H:i:s');     
       SQLUpdateInsert('meteoinfo', $Record);     
   }
  }
 }
//arr_phenomenon_name=
  $pos=strpos( $mystr,'arr_phenomenon_name=['); //описание погоды
 if($pos===0){
  $repl=array('arr_phenomenon_name=[{', '}];', '}, {'); //заменим на |
  $mstr=str_replace($repl,"|",$mystr); 
  $arr_ph=explode('|',$mstr);

  $repl=array('x: Date.UTC(','), y:', ', ind:'); //заменим на ' '
  foreach($arr_ph as $t1){
   $t1=str_replace($repl," ",$t1);
   list($year, $month, $day,$hour) = sscanf($t1, "%d,%d,%d,%d");
   if($year>2000){
    $ps=strpos($t1,'"');
    if(!$ps===false){
    $ps1=strpos($t1,'"',$ps+1);
    $temp=substr($t1,$ps+1,$ps1-$ps-1);
    }
    
     $month=$month+1;
     $date=$year.'-'.$month.'-'.$day.' '.$hour.':00';

       $Record=SQLSelectOne("SELECT * FROM meteoinfo  WHERE DATE_FORECAST='".$date."' and TYPE='phenomenon_name';");
       $Record['DATE_FORECAST']=$date;
       $Record['TYPE']='phenomenon_name';
       $Record['VALUE']=$temp;
       $Record['ADDED']=date('Y-m-d H:i:s');     
       SQLUpdateInsert('meteoinfo', $Record);     
   }
  }
 }  
}

//удалим старьё 
//$dt= mktime(0, 0, 0, gg('ThisComputer.MonthNum'), gg('ThisComputer.DayOfMonthNum'), gg('ThisComputer.YearNow'));//<--edited 2016-10-13 Убрал ссылки на нестандартные свойства
SQLExec("delete from `meteoinfo` WHERE `DATE_FORECAST` <'".date('Y-m-d 00:00:00')."'"); //<--edited 2016-10-13
debmes('get_meteoinfo_forecast-OK');
Имея эти данные в таблице можно их обрабатывать как угодно,
например, вычислим аналог Яндекс-погоды - температуру ночью.
Я беру минимум на дату с 0 ч. до 6 утра:

Код: Выделить всё

$sql="SELECT round(min(`VALUE`)) t_n FROM `meteoinfo` where `TYPE`='temperature'";
  $sql=$sql." and date_format(`DATE_FORECAST`,'%d.%m.%Y')='".gg('ThisComputer.DateNow')."' and  date_format(`DATE_FORECAST`,'%H') between '00' and '06'";
  $rec= SQLSelectOne($sql);
  if($rec) sg('weather_my.t_night',$rec['t_n']); 


Можно создать объект прогноза погоды как в openweather на неск. дней.
Последний раз редактировалось xor Чт окт 13, 2016 2:13 am, всего редактировалось 1 раз.
За это сообщение автора xor поблагодарил:
lanket (Ср окт 12, 2016 7:23 am)
Рейтинг: 1.16%
Alexiy2
Сообщения: 104
Зарегистрирован: Вт май 12, 2015 9:59 pm
Благодарил (а): 16 раз
Поблагодарили: 13 раз

Re: Погода от Гидрометцентра - 3. Прогноз подробный

Сообщение Alexiy2 » Вт окт 11, 2016 5:04 am

Уважаемый XOR, а можно немного поподробнее!!! Так сказать, для особо "одаренных"... Желательно все пошагово расписать, если Вас не затруднит!
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Погода от Гидрометцентра - 3. Прогноз подробный

Сообщение nick7zmail » Вт окт 11, 2016 7:06 am

Вы уже в таблицу базы записываете данные?)) пора бы модуль уже писать =D.
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Погода от Гидрометцентра - 3. Прогноз подробный

Сообщение xor » Чт окт 13, 2016 1:55 am

Alexiy2 писал(а):Желательно все пошагово расписать, если Вас не затруднит!
А ви с какой целью интересуетесь?))

Что вы хотите получить в итоге?

В результате этих моих манипуляций я имею таблицу с прогнозом, откуда запросами можно получать погодную информацию по региону. Какого-то готового интерфейса я не делал, руки не доходят.
Если хотите попробовать для себя, извольте:

Создадим таблицу в нашей базе - пишем сценарий:

Код: Выделить всё

$sql='DROP TABLE IF EXISTS `meteoinfo`';
 SQLExec($sql);

$sql='CREATE TABLE IF NOT EXISTS `meteoinfo` ('
  .'`ID` int(10) unsigned NOT NULL AUTO_INCREMENT,'
  .'`ADDED` datetime NOT NULL,'
  .'`DATE_FORECAST` datetime NOT NULL,'
  .'`TYPE` varchar(20) NOT NULL,'
  .'`VALUE` varchar(32) DEFAULT NULL,'
  .'UNIQUE KEY `ID` (`ID`))';
 SQLExec($sql);


После запуска в нашей базе появится табличка meteoinfo

Затем модифицируем скрипт из первого сообщения, поменяв там адрес с моего Домодедова на нужный (http://meteoinfo.ru/forecasts5000/russi ... domodedowo)

+
замените там в конце

Код: Выделить всё

//удалим старьё 
$dt= mktime(0, 0, 0, gg('ThisComputer.MonthNum'), gg('ThisComputer.DayOfMonthNum'), gg('ThisComputer.YearNow'));//start date
SQLExec("delete from `meteoinfo` WHERE `DATE_FORECAST` <'".date('Y-m-d',$dt)."'");
на

Код: Выделить всё

//удалим старьё 
//$dt= mktime(0, 0, 0, gg('ThisComputer.MonthNum'), gg('ThisComputer.DayOfMonthNum'), gg('ThisComputer.YearNow'));//start date
SQLExec("delete from `meteoinfo` WHERE `DATE_FORECAST` <'".date('Y-m-d 00:00:00')."'");

Запускаем его, если все было сделано правильно, в таблице meteoinfo появятся записи с прогнозом.
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Погода от Гидрометцентра - 3. Прогноз подробный

Сообщение xor » Чт окт 13, 2016 2:27 am

nick7zmail писал(а):Вы уже в таблицу базы записываете данные?)) пора бы модуль уже писать =D.
"Нет, Петька, в мировом масштабе не смогу - языков не знаю" (c) В.И. Чапаев :oops:
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Погода от Гидрометцентра - 3. Прогноз подробный

Сообщение nick7zmail » Чт окт 13, 2016 11:38 am

xor писал(а):"Нет, Петька, в мировом масштабе не смогу - языков не знаю" (c) В.И. Чапаев :oops:
На самом деле вы написали всё и даже больше...обычно в таких простеньких скриптах до создания табицы sql и занесения в неё данных не доходит...ограничиваются свойствами объектов))) осталось интерфейс придумать - как город забивать, и как это выводиться всё будет...
Если таки лень - я на досуге попробую модуль накатать, воспользовавшись вашим скриптом, если не возражаете)) Но, наверное, досуг ой как не скоро наступит)) пока дел по горло)
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Погода от Гидрометцентра - 3. Прогноз подробный

Сообщение xor » Чт окт 13, 2016 11:49 am

К вопросу о sql
Хе, если делать модуль "для всех", уже выбор населенного пункта из 5000 требует, наверное, таблицы. Да и прогноз на 4 дня с почасовой температурой...

Да, у них на сайте иконки погоды уродские, кмк.
Вечером выложу архив с другими, если кому интересно.



Отправлено с моего Nexus 5 через Tapatalk
Ответить