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

ALFRED450 22.12.2020 14:37

Цитата:

Сообщение от laimas (Сообщение 531983)
И в чем проблема заменить вывод на присвоение его переменной?

$fp = $fp ? 'On' : 'Off';

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

laimas 22.12.2020 14:51

Цитата:

Сообщение от ALFRED450
в отсутствии знаний в этой области

Ну так где их почерпнуть как не из руководства? Ведь странно, найти и использовать fsockopen, получать из json и присваивать $show_weather = $weather->main->temp;, писать другие присваивания переменным $today = date("j.m.Y, H:i");, и при этом не заменить echo на присваивание. Ну это же элементарно, если читать и изучать.

Что тут может быть нового, так это тернарный оператор:

$fp = $fp ? 'On' : 'Off';
а можно и так
$fp = fsockopen(...) ? 'On' : 'Off';

вместо if ..., что более лаконично. Но о нем также подробно написано в руководстве.

ALFRED450 22.12.2020 16:38

Цитата:

Сообщение от laimas (Сообщение 531987)
Ну так где их почерпнуть как не из руководства? Ведь странно, найти и использовать fsockopen, получать из json и присваивать $show_weather = $weather->main->temp;, писать другие присваивания переменным $today = date("j.m.Y, H:i");, и при этом не заменить echo на присваивание. Ну это же элементарно, если читать и изучать.

Что тут может быть нового, так это тернарный оператор:

$fp = $fp ? 'On' : 'Off';
а можно и так
$fp = fsockopen(...) ? 'On' : 'Off';

вместо if ..., что более лаконично. Но о нем также подробно написано в руководстве.

$fp = fsockopen("127.0.0.1", 1234) ? 'On=else [color=red] Онлайн[/color] ' : 'Off=if (!$fp) [color=red] Оффлайн[/color]';

Естественно он выдал как текст, убрав одинарные кавычки вылился в ошибку. Понимаю что бред состряпал.

ALFRED450 28.12.2020 20:13

Подскажите пожалуйста, в коде есть получение изображения и установка размеров в зависимости от настроек
if(file_exists($file_name_1) && $view_last_subscriber) {
        $last_subscriber_photo_1 = new Imagick($file_name_1);
        if($roundingOff==true) {
*!*
            RoundingOff($last_subscriber_photo_1, $last_subscriber_width,$last_subscriber_height);
*/!*
        }

        $draw->setFontSize($last_subscriber_font_size);
        $draw->setFillColor("rgb(".$last_subscriber_font_color.")");

        $bg->compositeImage($last_subscriber_photo_1, Imagick::COMPOSITE_DEFAULT, $last_subscriber_photo_1_x, $last_subscriber_photo_1_y);
        $bg->annotateImage($draw, $last_subscriber_1_text_x, $last_subscriber_1_text_y, 0, mb_strtoupper($last_subscriber_firstname_1));
    }

настройки такие:
// Ширина аватарки
$last_subscriber_width = 150;
// Высота аватарки
$last_subscriber_height = 150;
// Аватарки [true - круглые false - квадратные]
$roundingOff = true;

я получаю изображение так:
$copy_icon = file_get_contents('http://openweathermap.org/img/wn/' . $icon);
$show_icon = new Imagick();
$show_icon->readImageBlob($copy_icon);

roundingOff я так понимаю не совсем подходит, чтоб просто изменить размеры, так как цель не закруглять углы. Подскажите пожалуйста какую функцию применить, для изменения размеров полученного изображения $show_icon

ALFRED450 28.12.2020 21:56

if($view_icon){
if($roundingOff==true)
RoundingOff($show_icon, $weather_icon_width ,$weather_icon_height);
}
$bg->compositeImage($show_icon, Imagick::COMPOSITE_DEFAULT, $weather_icon_pixel_x, $weather_icon_pixel_y);

размер меняет, ошибки не сыпятся , но мне кажется что на чушь похоже

laimas 28.12.2020 22:41

Цитата:

Сообщение от ALFRED450
roundingOff я так понимаю не совсем подходит, чтоб просто изменить размеры

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

ALFRED450 28.12.2020 23:26

Цитата:

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

как изменить размеры полученного изображения, какой функцией
изображение получено

$copy_icon = file_get_contents('http://openweathermap.org/img/wn/' . $icon);
$show_icon = new Imagick();
$show_icon->readImageBlob($copy_icon);

laimas 29.12.2020 03:02

https://www.php.net/manual/ru/imagick.scaleimage.php

Давно пора скачать документацию и искать в ней, я что швейцаром должен быть? И вообще, для такого простого Imagick, у которого много функций недокументированных, да еще не понимания ничего, это круто. Есть GD, для таких плевых дел его будет более чем достаточно, и разобраться в нем намного проще чем в Imagick.

ALFRED450 05.01.2021 20:59

Здравствуйте, снова вопрос про погоду
получаю направление ветра в градусах и пробую перевести в направление, подскажите пожалуйста, как правильно написать и где перемудрил
$url = "http://api.openweathermap.org/data/2.5/weather?id=".$cityId."&lang=".$lang."&units=".$units."&APPID=" . $apiKey;
// делаем запрос к апи
$contents = file_get_contents($url);
$weather=json_decode($contents);

$deg=$weather->wind->deg; //получаем направление ветра в градусах


function getCardinalDirection($deg) {
    const directions = ['↑ N', '↗ NE', '→ E', '↘ SE', '↓ S', '↙ SW', '← W', '↖ NW'];
    return directions[Math.round($deg / 45) % 8];
}


//направление ветра
if($view_deg){
    $draw->setFont(BASEPATH."/font/".$font_deg);
    $draw->setTextAlignment(Imagick::ALIGN_CENTER);
    $draw->setFontSize($deg_font_size);
    $draw->setFillColor("rgb(".$deg_font_color.")");
*!*
    $bg->annotateImage($draw, $deg_text_pixel_x, $deg_text_pixel_y, 0, $deg);
*/!*
}


получаю ошибку константы

laimas 05.01.2021 23:37

Вы когда в конце концов начнете читать справочник языка? Разве сложно заглянуть сюда, чтобы понять где у вас ошибки или отсебятины?

Это как в этой теме, типов то много, а значит вполне можно и в одну строку:

list(...) = exp(...) ? array(...) : array(...);

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

ALFRED450 07.01.2021 14:44

Цитата:

Сообщение от laimas (Сообщение 532359)
Вы когда в конце концов начнете читать справочник языка? Разве сложно заглянуть сюда, чтобы понять где у вас ошибки или отсебятины?

Это как в этой теме, типов то много, а значит вполне можно и в одну строку:

list(...) = exp(...) ? array(...) : array(...);

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

обращался за помощью на php.ru по своему вопросу, какие только варианты не предлагали в разных ветках форума, но никто предложенное вами list(...) = .... даже не решился рассмотреть, полагаю уровень программирования у всех разный, мне с 0 такое не осилить. Мало того чтобы читать мануал, его надо еще уметь применить. Читал и про list, exp, array так и не понял как это воедино применить. уж если запутался с онлайн и офлайн в примерах ранее, то с вычеслением углов для каждого направления вообще мрак. Напишите плз как правильно.

к слову, так и не вышло с направлением по предложенным вариантам на другом форуме, если у читающих мануал и умеющих не выходит ...

laimas 07.01.2021 19:51

С константой нет проблем, надеюсь не сложно было разобраться?

Вот только вопрос - а зачем она там вообще нужна, константа? Такой же вопрос и по поводу:

if(...) {
    $a = ...
    $b = ...
} else {
    $a = ...
....


зачем простое условие, выполняющее с легкостью задачу, при этом читабельность кода 100%, усложнять конструкцией, от которой в данном случае нет ни какой пользы, просто будут выполнятся еще, лишние, операции? Ради "красивости кода в одну строку"? Если по такому принципу писать код, тогда все пропало.

Ну а ради понимания, то ничего сложного. Записать "как есть" это условие тернарным оператором не позволяет синтаксис. Но оператор может возвращать и массив, а значит можно определить в нем значения для переменных $a, $b, ... массивом. Проверить это ведь не сложно, выполнив простое:

$a = true ? ['a', 'b'] : ['c', 'd'];
var_dump($a);
// array(2) { [0]=> string(1) "a" [1]=> string(1) "b" }


А к возвращаемому массиву применить list(), тогда:

list($a, $b) = false ? ['a', 'b'] : ['c', 'd'];
echo $a . ' / ' . $b;
// c / d


Есть в этом что-то очень сложное для понимания? Читайте, выполняйте примеры, вникайте, и понимание будет обязательно.

ALFRED450 07.01.2021 23:16

Цитата:

Сообщение от laimas (Сообщение 532411)
С константой нет проблем, надеюсь не сложно было разобраться?

Сделал так, стало выводить, но сравнил погоду другими сервисами направления у меня и там не совпадают, скажите где напутал или более правильный код

function getCardinalDirection($deg) {
    $array = array('↑ С', '? СЗ', '→ В', '? ЮВ', '↓ Ю', '? ЮЗ', '← З', '↖СЗ');
    return $array[round(($deg / 45) % 8)];
}
 
$a = getCardinalDirection($deg);
 
$deg2 = $deg + 180;
if($deg >= 180) $deg2 = $deg - 180;
 
$b = getCardinalDirection($deg2);

у меня северный, на погодном сервисе южный

ALFRED450 07.01.2021 23:25

все разобрался, после
$a = getCardinalDirection($deg);

лишнее, тогда работает верно

ALFRED450 08.01.2021 20:11

Подскажите еще один момент, как и ранее писал получаю направление
в коде все верно и работает
function getCardinalDirection($deg) {
    $array = array('С', 'СВ', 'В', 'ЮВ', 'Ю', 'ЮЗ', 'З', 'СЗ');
    return $array[round(($deg / 45) % 8)];
}
 
$a = getCardinalDirection($deg);
 
echo '<head>
  <style>
   .img-arrow {
    transform: rotate('.$deg.'deg);
   }
  </style>
</head>';
// прочее
echo '<img src="icons/arrow.png" alt="" class="img-arrow">';

полученное изображение тоже крутится. Но как вы говорили такой способ для получения изображения не совсем верный для php, я как и ранее использовал вашу подсказку , но как ее вращать из полученных данных не понятно
$img = file_get_contents('icons/arrow.png');
$img2 = new Imagick();
$img2->readImageBlob($img);

laimas 09.01.2021 03:30

Цитата:

Сообщение от ALFRED450
вы говорили такой способ для получения изображения не совсем верный для php

Поднять тему где это было сказано и по какому поводу. Разве об этом шла речь?

ALFRED450 10.01.2021 19:56

Подскажите как использовать одну функцию для двух показаний. Ругается на повтор.
function getCardinalDirection($deg) {
    $array = array('С', 'СВ', 'В', 'ЮВ', 'Ю', 'ЮЗ', 'З', 'СЗ');
    return $array[round(($deg / 45) % 8)];
}
 
$a = getCardinalDirection($deg);

function getCardinalDirection($deg) {
    
    $array = array('strelka/N.png', 'strelka/NE.png', 'strelka/E.png', 'strelka/SE.png', 'strelka/S.png', 'strelka/SW.png', 'strelka/W.png', 'strelka/NW.png');
    return $array[round(($deg / 45) % 8)];
}
 
$ab = getCardinalDirection($deg);

$img = file_get_contents($ab);
$icon_deg = new Imagick();
$icon_deg->readImageBlob($img);

laimas 11.01.2021 08:14

Цитата:

Сообщение от ALFRED450
как использовать одну функцию для двух показаний

Имя каждой функции должно быть уникально, а вы что порете? По большому счету эти функции как сбоку припеку.

Это $img = file_get_contents($ab) было необходимо, когда изображение было удаленным. Зачем же заниматься этим с локальными файлами?

ALFRED450 11.01.2021 09:53

Цитата:

Имя каждой функции должно быть уникально, а вы что порете? По большому счету эти функции как сбоку припеку.
другого способа просто не знаю и признаться не умею, покажите как правильно будет. Так мне тоже подсказали и брал примеры деления градусов с интернета.


Цитата:

Это $img = file_get_contents($ab) было необходимо, когда изображение было удаленным. Зачем же заниматься этим с локальными файлами?
ну ранее как вы показали так и делаю, а как иначе?


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