Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Прогноз погоды (https://javascript.ru/forum/project/81557-prognoz-pogody.html)

ALFRED450 14.12.2020 22:53

Прогноз погоды
 
$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 строка)
И если не затруднит месяц прописью как правильно реализовать

laimas 15.12.2020 00:12

Цитата:

Сообщение от ALFRED450
сделать вывод погоды в целых числах

Либо отбрасывать дробную часть, либо округлять в большую/меньшую сторону.

Цитата:

Сообщение от ALFRED450
иконка ->далее температура

Ну так выводите первой ее.

Цитата:

Сообщение от ALFRED450
месяц прописью

https://www.php.net/manual/ru/function.setlocale.php - пример 2. Либо берите его из $monthes по номеру месяца, для чего вы создавали этот массив?

ALFRED450 15.12.2020 00:52

Цитата:

Либо отбрасывать дробную часть, либо округлять в большую/меньшую сторону.
я понимаю, но реализовать не могу, смотрел доки по api на сайте, но так примера не нашел


Цитата:

Ну так выводите первой ее.
вывожу, но что то ломается и летят ошибки, где то я теряю какой то символ


Цитата:

https://www.php.net/manual/ru/function.setlocale.php - пример 2. Либо берите его из $monthes по номеру месяца, для чего вы создавали этот массив?
массив создан как раз для этих целей, но как и выше знаний не хватает

laimas 15.12.2020 00:59

Какое API, одну из функций PHP https://www.php.net/manual/ru/ref.math.php , какую, это не мне решать.

Цитата:

Сообщение от ALFRED450
массив создан как раз для этих целей, но как и выше знаний не хватает

Так если не читать о функциях, то откуда они появятся. Функция date('n') возвращает номер месяца без ведущего нуля. Как по его номеру из массива получить название месяца или вы и этого не знаете?

ALFRED450 15.12.2020 02:04

Первую задачу вроде выполнил до целого числа
$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, теперь просто показывает число

laimas 15.12.2020 02:33

Цитата:

Сообщение от ALFRED450
странно повел ceil округлив 8,9 до 8

А вы уверены, что $show_weather это число? Ну-ка внимательно на свой код ...

ALFRED450 15.12.2020 02:56

Цитата:

Сообщение от laimas (Сообщение 531744)
А вы уверены, что $show_weather это число? Ну-ка внимательно на свой код ...

уверен что да
вот что получаю по запросу
"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

laimas 15.12.2020 05:57

Цитата:

Сообщение от ALFRED450
уверен что да

А это что?

$show_weather=$weather->main->temp."°C";

ALFRED450 15.12.2020 08:41

Цитата:

Сообщение от laimas (Сообщение 531746)
А это что?

$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" просто указываешь что это, хоть кг, я так понимаю, примеры с интернета по крайней мере так показывают.

laimas 15.12.2020 08:46

А зачем столько лишнего писать, что используется только раз?

$show_weather=$weather->main->temp;
$sw_weather = $w_weather. "°C";
$w_weather = ceil($show_weather);


и может все-таки round? И сразу при выводе, без создания не понятно для чего промежуточных переменных.

round($weather->main->temp) . '°C'

ALFRED450 15.12.2020 09:15

Цитата:

Сообщение от laimas (Сообщение 531749)
А зачем столько лишнего писать, что используется только раз?

$show_weather=$weather->main->temp;
$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."' />";

ALFRED450 15.12.2020 09:21

подскажите как ссылку на на путь превратить в переменную правильно, чтоб использовать $sw_weather и $url_icon
чтоб в ряд их выстроить

ALFRED450 15.12.2020 09:24

понимаю, что пытаюсь хлебать щи не умея пользоваться ложкой)), но в полтиник трудно дается, то чему не учили, но интересно зараза ))

laimas 15.12.2020 09:33

Ну если создание переменной, это значение из объекта плюс добавление строки, и для использования не только при выводе, тогда да, это оправдано.

Цитата:

Сообщение от ALFRED450
убирал зачеркнутое и вставил ваше, не показало температуру

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

$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)

ALFRED450 15.12.2020 09:46

Цитата:

Сообщение от laimas (Сообщение 531753)
Ну если создание переменной, это значение из объекта плюс добавление строки, и для использования не только при выводе, тогда да, это оправдано.



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

$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 нужен для получения других данных и если использовать, другие данные ломаются

laimas 15.12.2020 10:06

Обращайтесь к документации своей CMS, а я же не запоминаю наизусть все, с чем когда либо сталкивался.

ALFRED450 15.12.2020 21:07

Прошу помочь еще в одной ситуации
имея переменую $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);
}
*/!*

laimas 15.12.2020 22:37

Цитата:

Сообщение от ALFRED450
<img src="http://openweathermap.org/img/wn/'.$icon.' "/>

Это не url, и прежде чем работать с изображениями, его нужно открыть как ресурс. Открывайте и работайте.

ALFRED450 15.12.2020 23:08

Цитата:

Сообщение от laimas (Сообщение 531771)
Это не url, и прежде чем работать с изображениями, его нужно открыть как ресурс. Открывайте и работайте.

подсказку в виде примера можно? в какую сторону двигаться

laimas 15.12.2020 23:26

Цитата:

Сообщение от ALFRED450
подсказку в виде примера можно?

Ну какая еще подсказка нужна? URL изображения известен? Загружайте его на сервер, затем открывайте его в ImageMagick, работайте с ним.

ALFRED450 16.12.2020 12:20

Цитата:

Сообщение от laimas (Сообщение 531776)
Ну какая еще подсказка нужна? URL изображения известен? Загружайте его на сервер, затем открывайте его в ImageMagick, работайте с ним.

$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 и это возвращение к началу, изменится лишь путь к файлам.
Если изображение видно значит оно же загружается, не понятно

laimas 16.12.2020 14:41

Откуда взято это?

$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, .....

ALFRED450 16.12.2020 15:49

не пинайте вы так уж сильно:( делаю не для себя, для группы чтоб не было так серо все. Нуб в этом деле, что ж поделать. На пенсии не все же время в танки играть) Кучу вариантов с этого примера пробывал, подставлял, менял, блин не в какую, не там запятая и ....

laimas 16.12.2020 16:58

Я не пинаю, но вы оперируете с одной стороны кодом нешуточным, с другой стороны пытаетесь воткнуть в него непотребное.

Исследуйте ошибки, исправляйте их, что я еще могу сказать. Ну я же не стану вдаваться во все, что тут написано, так как непосредственно к проблеме оно отношения не имеет.

Если $bg и $last_subscriber_photo_1, это объекты Imagick, координаты наложения в пределах изображения приемника, то проблем наложения быть не должно.

PS. Или все "складывается как надо", а результат не виден в браузере?

ALFRED450 16.12.2020 18:58

Цитата:

Сообщение от laimas (Сообщение 531795)
Я не пинаю, но вы оперируете с одной стороны кодом нешуточным, с другой стороны пытаетесь воткнуть в него непотребное.

Исследуйте ошибки, исправляйте их, что я еще могу сказать. Ну я же не стану вдаваться во все, что тут написано, так как непосредственно к проблеме оно отношения не имеет.

Если $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, а ведь то же используется получение изображения и "склеивание"

laimas 16.12.2020 19:40

Сначала

$img2 = new Imagick();

и только затем

$img2->readImageBlob($img);

ALFRED450 16.12.2020 20:18

Цитата:

Сообщение от laimas (Сообщение 531803)
Сначала

$img2 = new Imagick();

и только затем

$img2->readImageBlob($img);

Аллилуйя, большая благодарность . Получилось все.
Вот такой вопрос:
mb_strtoupper выводит все в верхний регистр
почитал про текст в PHP и ничего не нашел для обычного вывода как использовать rtrim (Удаляет пробелы (или другие символы) из конца строки), для того чтоб текст оставался без изменений.

laimas 16.12.2020 20:38

Не понял, в чем проблема?

ALFRED450 16.12.2020 20:41

Цитата:

Сообщение от laimas (Сообщение 531805)
Не понял, в чем проблема?

$bg->annotateImage($draw, $clock_text_pixel_x, $clock_text_pixel_y, 0, mb_strtoupper(date('H:i'), 'UTF-8'));

текст выводит в ВЕРХНИЙ регистр

laimas 16.12.2020 20:49

И что?

ALFRED450 16.12.2020 20:56

Цитата:

Сообщение от laimas (Сообщение 531807)
И что?

чтоб не изменяло, если написано Тула , так и отображало Тула

laimas 16.12.2020 21:03

Ну так уберите функцию mb_strtoupper(), в чем проблема?

ALFRED450 16.12.2020 21:16

Цитата:

Сообщение от laimas (Сообщение 531809)
Ну так уберите функцию mb_strtoupper(), в чем проблема?

Warning: Imagick::annotateimage() expects exactly 5 parameters, 4 given in

$bg->annotateImage($draw, $city_text_pixel_x, $city_text_pixel_y, $cityname);

laimas 16.12.2020 21:30

Ну так вы удаляйте функцию, а не параметр:

mb_strtoupper(date('H:i'), 'UTF-8')

PS. Вот только откуда в date('H:i') может быть Тула?

ALFRED450 16.12.2020 21:59

Цитата:

Сообщение от laimas (Сообщение 531811)
Ну так вы удаляйте функцию, а не параметр:

mb_strtoupper(date('H:i'), 'UTF-8')

PS. Вот только откуда в date('H:i') может быть Тула?

нет не получилось, поторопился
$bg->annotateImage($draw, $city_text_pixel_x, $city_text_pixel_y, ('$cityname');

laimas 16.12.2020 22:01

date('H:i'), это цифры, зачем тут верхний регистр, да еще UTF? Нет у цифр регистра.

ALFRED450 16.12.2020 22:09

Parse error: syntax error, unexpected ';', expecting ',' or ')' in

ALFRED450 16.12.2020 22:13

да с датой я случайно кинул, ну сама переменная $cityname показывает город и пишет в верхнем регистре ТУЛА, а убираешь функцию летит ошибка
$bg->annotateImage($draw, $city_text_pixel_x, $city_text_pixel_y, ('$cityname');

вот так не отображается текст

ALFRED450 16.12.2020 23:08

Еще один вопрос:
Есть ранее созданные функции:
// ВЫВОДИМ ДЕНЬ НЕДЕЛИ
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; // погода

Не выключается. Я так понимаю это топорный метод, делая так просто.

laimas 17.12.2020 02:16

Не вижу тут функций, вижу условия.
if(false) { выполнятся не будет, где-то вы косячите, ищите.
rtrim($show_weather.' ', 'UTF-8') - это полнейшая чушь, как и mb_strtoupper(date('H:i'), 'UTF-8'), ну и остальное подобное. Ну это просто какая-то дичь.


Часовой пояс GMT +3, время: 16:16.