Прогноз погоды
$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, время: 16:16. |