Прогноз погоды
$monthes = array(
1 => 'Января', 2 => 'Февраля', 3 => 'Марта', 4 => 'Апреля',
5 => 'Мая', 6 => 'Июня', 7 => 'Июля', 8 => 'Августа',
9 => 'Сентября', 10 => 'Октября', 11 => 'Ноября', 12 => 'Декабря'
);
$url = "https://api.openweathermap.org/data/2.5/weather?id=498817&units=metric&appid=42633145136a94711f8d879deade6bf1&lang=ru";
$contents = file_get_contents($url);
$weather=json_decode($contents);
*!*
$show_weather=$weather->main->temp."°C";
*/!*
$icon=$weather->weather[0]->icon.".png";
$today = date("j.m.Y");
$cityname = $weather->name;
$wind=$weather->wind->speed."м/с";
$humidity=$weather->main->humidity."%";
echo $today."<br />".
$cityname."<br />".
"Влажность: ".$humidity."<br />".
"Ветер: ".$wind."<br />".
*!*
$show_weather."<br />
<img src='http://openweathermap.org/img/wn/".$icon."' />";
*/!*
Прошу помочь сделать вывод погоды в целых числах. И сломал голову как правильно выстроить: иконка ->далее температура (22 и 23 строка) И если не затруднит месяц прописью как правильно реализовать |
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
|
Какое API, одну из функций PHP https://www.php.net/manual/ru/ref.math.php , какую, это не мне решать.
Цитата:
|
Первую задачу вроде выполнил до целого числа
$show_weather=$weather->main->temp."°C";
$icon=$weather->weather[0]->icon.".png";
$today = date("j.m.Y");
$cityname = $weather->name;
$url = 'http://openweathermap.org/img/wn/';
$wind=$weather->wind->speed."м/с";
$humidity=$weather->main->humidity."%";
*!*
$w_weather = ceil($show_weather);
*/!*
но как то странно повел ceil округлив 8,9 до 8 echo $today."<br />". $cityname."<br />". "Влажность: ".$humidity."<br />". "Ветер: ".$wind."<br />". *!* $w_weather."<br /> */!* <img src='http://openweathermap.org/img/wn/".$icon."' />"; и как то странно потерял °C, теперь просто показывает число |
Цитата:
|
Цитата:
вот что получаю по запросу "weather":[{"id":804,"main":"Clouds","description":"пасм рно","icon":"04n"}] {"temp":-9.04,"feels_like":-14.09,"temp_min":-9.04,"temp_max":-9.04,....} а $show_weather я же могу назвать как угодно $moya_pogoda но значек впереди погоды не могу поставить, ломается все спасибо за https://www.php.net/manual/ru/ref.math.php |
Цитата:
$show_weather=$weather->main->temp."°C"; |
Цитата:
$show_weather=$weather->main->temp;
$icon=$weather->weather[0]->icon.".png";
$today = date("j.m.Y, H:i");
$cityname = $weather->name;
$wind=$weather->wind->speed." м/с";
$humidity=$weather->main->humidity."%";
$w_weather = ceil($show_weather);
*!*
$sw_weather = $w_weather. "°C";
*/!*
по temp он получает число, а "°C" просто указываешь что это, хоть кг, я так понимаю, примеры с интернета по крайней мере так показывают. |
А зачем столько лишнего писать, что используется только раз?
$sw_weather = $w_weather. "°C"; $w_weather = ceil($show_weather); и может все-таки round? И сразу при выводе, без создания не понятно для чего промежуточных переменных. round($weather->main->temp) . '°C' |
Цитата:
а переменные мне нужны будут в дальнейшей прорисовке результата в графический формат как ваш пример реализовать покажите целиком:
$show_weather=$weather->main->temp;
$icon=$weather->weather[0]->icon.".png";
$today = date("j.m.Y, H:i");
$cityname = $weather->name;
$wind=$weather->wind->speed." м/с";
$humidity=$weather->main->humidity."%";
$w_weather = round($show_weather);
$sw_weather = $w_weather. "°C";
echo $today."<br />".
$cityname."<br />".
"Влажность: ".$humidity."<br />".
"Ветер: ".$wind."<br />".
$sw_weather."<br />
<img src='http://openweathermap.org/img/wn/".$icon."' />";
|
подскажите как ссылку на на путь превратить в переменную правильно, чтоб использовать $sw_weather и $url_icon
чтоб в ряд их выстроить |
понимаю, что пытаюсь хлебать щи не умея пользоваться ложкой)), но в полтиник трудно дается, то чему не учили, но интересно зараза ))
|
Ну если создание переменной, это значение из объекта плюс добавление строки, и для использования не только при выводе, тогда да, это оправдано.
Цитата:
$show_weather = $weather->main->temp; затем $w_weather = ceil($show_weather); затем $sw_weather = $w_weather. "°C"; чтобы вывести $sw_weather."<br /> это что за баталии такие? Если нужна температура для вывода в строку и для графики, то почему не $weather = round($weather->main->temp) . '°C'; и вывод с строке . $weather . "<br /> и где-то для графики $weather. Прочтите еще раз и внимательно о ceil(), это ли нужно использовать? Если вывод, это конкатенация строк и переменных, то строки нужно заключать в одинарные кавычки, а не в двойные, потому как в РНР вывод в одинарных и двойных, это различие, и вы просто заставляете парсер производить дополнительный бессмысленный разбор строк. Читайте документацию. PS. Кстати, температура отдается за определенную дату, которая указана в объекте, то есть текущая дата не обязательно может совпадать с датой за которую получены данные. А значит не dete(format) а date(format, $weather->dt) |
Цитата:
$show_weather = round($weather->main->temp) . '°C';
*!*
$icon=$weather->weather[0]->icon.".png";
$today = date("j.m.Y, H:i");
$cityname = $weather->name;
$wind=$weather->wind->speed." м/с";
$humidity=$weather->main->humidity."%";
*/!*
echo $today."<br />".
$cityname."<br />".
"Влажность: ".$humidity."<br />".
"Ветер: ".$wind."<br />".
$show_weather."<br />
<img src='http://openweathermap.org/img/wn/".$icon."' />";
оставил переменную $show_weather т.к. $weather нужен для получения других данных и если использовать, другие данные ломаются |
Обращайтесь к документации своей CMS, а я же не запоминаю наизусть все, с чем когда либо сталкивался.
|
Прошу помочь еще в одной ситуации
имея переменую $show_weather получаем погоду и функцией ниже объединяем текст с изображением
if($show_weather){
$draw->setFont(BASEPATH."/font/".$font_weather);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setFontSize($weather_font_size);
$draw->setFillColor("rgb(".$weather_font_color.")");
$bg->annotateImage($draw, $weather_text_pixel_x, $weather_text_pixel_y, 0, mb_strtoupper($show_weather.' ', 'UTF-8'));
}
вариант работает Не разобрался тут: $url_icon = '<img src="http://openweathermap.org/img/wn/'.$icon.' "/>'; как с переменной $url_icon которая = http://openweathermap.org/img/wn/13n.png сделать подобную функцию, для объединения одного изображения с другим
*!*
if($url_icon){
$bg->compositeImage($url_icon, Imagick::COMPOSITE_DEFAULT, $weather_icon_pixel_x, $weather_icon_pixel_y);
}
*/!*
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
$url = "https://api.openweathermap.org/data/2.5/weather?id=501730&units=metric&appid=42633145136a94711f8d879deade6bf1&lang=ru";
$contents = file_get_contents($url);
$weather=json_decode($contents);
$show_weather = round($weather->main->temp) . '°C';
$icon=$weather->weather[0]->icon.".png";
$today = date("j.m.Y, H:i");
$cityname = $weather->name;
$wind = round($weather->wind->speed) . 'м/с';
$humidity=$weather->main->humidity."%";
$url_icon = '<img src="http://openweathermap.org/img/wn/'.$icon.' "/>';
echo
$url_icon
$icon=$weather->weather[0]->icon.".png"; получает лишь код "icon":"03d" он рандомный и добавляется лишь расширение в $url_icon = взял путь до папки сайта с граф. файлами добавил переменную кода icon.".png" в итоге прямая ссылка и при: echo $url_icon на странице отображается изображение Выходит все загружается. Даже если я скачаю все png изображения на сервер мне все равно нужно получить нужный файл по коду с переменной $icon и это возвращение к началу, изменится лишь путь к файлам. Если изображение видно значит оно же загружается, не понятно |
Откуда взято это?
$bg->compositeImage($url_icon, Imagick::COMPOSITE_DEFAULT, $weather_icon_pixel_x, $weather_icon_pixel_y); Что здесь $bg и чем должно быть $url_icon? Вы понимаете, что '<img src="http://openweathermap.org/img/wn/'.$icon.' "/>', это html код, который будет выполнятся только в браузере, а для ImageMagick, это пустой звук и породит ошибку? Если свой код/примеры вы выдираете из какого-то класса, то изучайте методы этого класса, тут я вам ничем помочь не могу. Если это из руководства РНР, то к этой же функции (compositeImage) на странице ее описания даны и примеры, более чем полные, изучайте. Но не пытайтесь подсовывать ImageMagick фикцию вместо объекта и даже корректный URL, ImageMagick работает только с локальными файлами. То есть, например, получили (загрузили на сервер) картинку:
$img = file_get_contents('http://openweathermap.org/img/wn/' . $icon);
//далее создаем Imagick объект, как там у вас разбирайтесь с этим, пусть для примера его имя $img2
//получаем ресурс загруженного изображения
$img2->readImageBlob($img);
//вот теперь на ранее открытый ресурс, например, $img1, можно накладывать загруженное
$img1->compositeImage($img2, .....
|
не пинайте вы так уж сильно:( делаю не для себя, для группы чтоб не было так серо все. Нуб в этом деле, что ж поделать. На пенсии не все же время в танки играть) Кучу вариантов с этого примера пробывал, подставлял, менял, блин не в какую, не там запятая и ....
|
Я не пинаю, но вы оперируете с одной стороны кодом нешуточным, с другой стороны пытаетесь воткнуть в него непотребное.
Исследуйте ошибки, исправляйте их, что я еще могу сказать. Ну я же не стану вдаваться во все, что тут написано, так как непосредственно к проблеме оно отношения не имеет. Если $bg и $last_subscriber_photo_1, это объекты Imagick, координаты наложения в пределах изображения приемника, то проблем наложения быть не должно. PS. Или все "складывается как надо", а результат не виден в браузере? |
Цитата:
$img = file_get_contents('http://openweathermap.org/img/wn/' . $icon);
$img2->readImageBlob($img);
далее
if($img){
$bg->compositeImage($img2, Imagick::COMPOSITE_DEFAULT, $weather_icon_pixel_x, $weather_icon_pixel_x);
}
Fatal error: Uncaught Error: Call to a member function readImageBlob() on null in смотря на весь код не вижу использования readImageBlob, а ведь то же используется получение изображения и "склеивание" |
Сначала
$img2 = new Imagick(); и только затем $img2->readImageBlob($img); |
Цитата:
Вот такой вопрос: mb_strtoupper выводит все в верхний регистр почитал про текст в PHP и ничего не нашел для обычного вывода как использовать rtrim (Удаляет пробелы (или другие символы) из конца строки), для того чтоб текст оставался без изменений. |
Не понял, в чем проблема?
|
Цитата:
$bg->annotateImage($draw, $clock_text_pixel_x, $clock_text_pixel_y, 0, mb_strtoupper(date('H:i'), 'UTF-8'));
текст выводит в ВЕРХНИЙ регистр |
И что?
|
Цитата:
|
Ну так уберите функцию mb_strtoupper(), в чем проблема?
|
Цитата:
$bg->annotateImage($draw, $city_text_pixel_x, $city_text_pixel_y, $cityname); |
Ну так вы удаляйте функцию, а не параметр:
PS. Вот только откуда в date('H:i') может быть Тула? |
Цитата:
$bg->annotateImage($draw, $city_text_pixel_x, $city_text_pixel_y, ('$cityname');
|
date('H:i'), это цифры, зачем тут верхний регистр, да еще UTF? Нет у цифр регистра.
|
Parse error: syntax error, unexpected ';', expecting ',' or ')' in
|
да с датой я случайно кинул, ну сама переменная $cityname показывает город и пишет в верхнем регистре ТУЛА, а убираешь функцию летит ошибка
$bg->annotateImage($draw, $city_text_pixel_x, $city_text_pixel_y, ('$cityname');
вот так не отображается текст |
Еще один вопрос:
Есть ранее созданные функции:
// ВЫВОДИМ ДЕНЬ НЕДЕЛИ
if($view_today){
$draw->setFont(BASEPATH."/font/".$font_date);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setFontSize($today_font_size);
$draw->setFillColor("rgb(".$today_font_color.")");
$bg->annotateImage($draw, $today_text_pixel_x, $today_text_pixel_y, 0, mb_strtoupper($days[(date('w'))], 'UTF-8'));
}
// ВЫВОДИМ ДАТУ
if($view_date){
$draw->setFont(BASEPATH."/font/".$font_date);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setFontSize($date_font_size);
$draw->setFillColor("rgb(".$date_font_color.")");
$bg->annotateImage($draw, $date_text_pixel_x, $date_text_pixel_y, 0, mb_strtoupper(date('d ') . $monthes[(date('n'))] . date(' Y'), 'UTF-8'));
}
// ВЫВОДИМ ВРЕМЯ
if($view_clock){
$draw->setFont(BASEPATH."/font/".$font_clock);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setFontSize($clock_font_size);
$draw->setFillColor("rgb(".$clock_font_color.")");
$bg->annotateImage($draw, $clock_text_pixel_x, $clock_text_pixel_y, 0, mb_strtoupper(date('H:i'), 'UTF-8'));
}
и имееют они "выключатель" и исправно работают по true false //[true - разрешить false - запретить] $view_today = false; // День недели $view_date = true; // Число $view_clock = true; // Часы созданные с вашей помощью функции
// ВЫВОДИМ ПОГОДУ
if($show_weather){ //температура
$draw->setFont(BASEPATH."/font/".$font_weather);
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
$draw->setFontSize($weather_font_size);
$draw->setFillColor("rgb(".$weather_font_color.")");
$bg->annotateImage($draw, $weather_text_pixel_x, $weather_text_pixel_y, 0, rtrim($show_weather.' ', 'UTF-8'));
}
в случае если добавить $show_weather =false; // погода Не выключается. Я так понимаю это топорный метод, делая так просто. |
Не вижу тут функций, вижу условия.
if(false) { выполнятся не будет, где-то вы косячите, ищите. rtrim($show_weather.' ', 'UTF-8') - это полнейшая чушь, как и mb_strtoupper(date('H:i'), 'UTF-8'), ну и остальное подобное. Ну это просто какая-то дичь. |
| Часовой пояс GMT +3, время: 11:12. |