За последние 24 часа нас посетили 22333 программиста и 1032 робота. Сейчас ищут 620 программистов ...

Направление ветра из полученных данных

Тема в разделе "Сделайте за меня", создана пользователем ALFRED, 6 янв 2021.

  1. ALFRED

    ALFRED Новичок

    С нами с:
    28 дек 2020
    Сообщения:
    34
    Симпатии:
    0
    Получаю погоду с сервиса openweathermap и направление ветра в градусах
    PHP:
    1. $url = "http://api.openweathermap.org/data/2.5/weather?id=".$cityId."&lang=".$lang."&units=".$units."&APPID=" . $apiKey;
    2. // делаем запрос к апи
    3. $contents = file_get_contents($url);
    4. $weather=json_decode($contents);
    5.  
    6. $deg=$weather->wind->deg; //получаем направление ветра в градусах
    есть вот такая функция:
    PHP:
    1. function getCardinalDirection($deg) {
    2.     const directions = ['↑ N', '↗ NE', '→ E', '↘ SE', '↓ S', '↙ SW', '← W', '↖ NW'];
    3.     return directions[Math.round($deg / 45) % 8];
    4. }
    и дали еще такой совет:
    PHP:
    1. list(...) = exp(...) ? array(...) : array(...);
    как из переменной $deg получить переменную $deg2 с новыми значениями
    когда $deg=200, а $deg2=↑ N как то так
    мне в дальнейшем надо будет переменная для:
    PHP:
    1. if($view_deg2){
    2.     $draw->setFont(BASEPATH."/font/".$font_deg);
    3.     $draw->setTextAlignment(Imagick::ALIGN_CENTER);
    4.     $draw->setFontSize($deg_font_size);
    5.     $draw->setFillColor("rgb(".$deg_font_color.")");
    6.     $bg->annotateImage($draw, $deg_text_pixel_x, $wind_text_pixel_y, 0, $deg2);
    7. }
    $bg->annotateImage($draw, $deg_text_pixel_x, $deg_text_pixel_y, 0, $deg2);
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    В смысле?
    Код (Text):
    1.  
    2. $deg2 = $deg + 180;
    3. if($deg >= 180) $deg2 = $deg - 180;
    4.  
    5. echo getCardinalDirection($deg2);
    Так?
     
    #2 Drunkenmunky, 6 янв 2021
    Последнее редактирование: 6 янв 2021
  3. ALFRED

    ALFRED Новичок

    С нами с:
    28 дек 2020
    Сообщения:
    34
    Симпатии:
    0
    выше написанная функция мной приведена для примера, я ее не смог использовать, поэтому вряд ли смогу ваш пример реализовать верно для себя, переменная $deg может иметь любое число от 0 до 360 я так понимаю, направление ветра, поэтому было бы неплохо, полностью написать как было бы правильно, не силен в php
    --- Добавлено ---
    всю погоду осилил, а в направлениях застопорился
     
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    А так?
    PHP:
    1. <?php
    2. function getCardinalDirection($deg) {
    3.     $array = array('↑ N', '? NE', '→ E', '? SE', '↓ S', '? SW', '← W', '? NW');
    4.     return $array[round(($deg / 45) % 8)];
    5. }
    6.  
    7. $deg = 250;
    8.  
    9. echo getCardinalDirection($deg);
    10.  
    11. echo '<br>';
    12. $deg2 = $deg + 180;
    13. if($deg >= 180) $deg2 = $deg - 180;
    14.  
    15. echo getCardinalDirection($deg2);
    16. ?>
     
    #4 Drunkenmunky, 6 янв 2021
    Последнее редактирование: 6 янв 2021
  5. ALFRED

    ALFRED Новичок

    С нами с:
    28 дек 2020
    Сообщения:
    34
    Симпатии:
    0
    получил цифру 70 никакого направления
     
  6. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Скопируйте приведенный выше скрипт ничего в нем не меняя.
    Кроме значения $deg.
     
  7. ALFRED

    ALFRED Новичок

    С нами с:
    28 дек 2020
    Сообщения:
    34
    Симпатии:
    0
    забыл уточнить, на картинке прорисовалось значение 70, а на странице вывелось
    ? SW
    ? NE
    надо как то избавится от echo
    --- Добавлено ---
     
    #7 ALFRED, 6 янв 2021
    Последнее редактирование: 6 янв 2021
  8. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    А что там должно быть?
    В смысле?
     
  9. ALFRED

    ALFRED Новичок

    С нами с:
    28 дек 2020
    Сообщения:
    34
    Симпатии:
    0
    там должно вместо 70 градусов показать , ← W например, ветер 6м/с ← W то есть направление, а не цифровое значение 70
     
  10. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Понятно.
    Это бесполезная трата ресурсов
    Нарисуйте восемь иконок с нужными направлениями стрелок.
    Затем строку
    $array = array('↑ N', '? NE', '→ E', '? SE', '↓ S', '? SW', '← W', '? NW');
    в вашей функции замените на
    $array = array('picN.png', 'picNE.png', 'picE.png', 'picSE.png', 'picS.png', 'picSW.png', 'picW.png', 'picNW.png');

    Далее в нужном месте
    Код (Text):
    1.  
    2. echo'<img src="'.getCardinalDirection($deg).'">';
     
  11. ALFRED

    ALFRED Новичок

    С нами с:
    28 дек 2020
    Сообщения:
    34
    Симпатии:
    0
    переменная $deg имеет переменное число, откуда он поймет что при числе 270 нужно вывести допустим picSE.png
    и просто <img src="' не прокатит, чтоб получить рисунок надо подключить Imagick, может и нет, напишите полностью, чтоб не намудрить мне пожалуйста
    я так понимаю 'picN.png' тут путь до файла?
     
    #11 ALFRED, 6 янв 2021
    Последнее редактирование: 6 янв 2021
  12. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Он?
     
  13. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Кстати. Можно обойтись всего одной иконкой.
    И без самописных функций.
    Вот почитайте
    https://webref.ru/recipe/2323
     
  14. ALFRED

    ALFRED Новичок

    С нами с:
    28 дек 2020
    Сообщения:
    34
    Симпатии:
    0
    как $array узнает что надо вывести picN.png при значении $deg равным 231 градус
    еще мне кажется не информативным иметь 6м/с и какая то стрелка, вместо 6м/с ←сз
    --- Добавлено ---
    я все php делаю и в этом большая загвоздка, в html было бы наверно проще , но деваться мне некуда , все в php
     
  15. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Не готов ответить на этот вопрос.
    Почитайте что такое массивы. Что в них является ключом, а что значением.
    Что такое функции, в частности round().
    Пользовательские функции
    Что такое return
     
  16. ALFRED

    ALFRED Новичок

    С нами с:
    28 дек 2020
    Сообщения:
    34
    Симпатии:
    0
    если бы были соответствующие знания я хоть как то трепыхался, читать мануал мало, его еще надо уметь применить, а что вы скажите про такой вариант, как все это в одну строку сделать?
    PHP:
    1. list(...) = exp(...) ? array(...) : array(...);
     
  17. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Вероятно, имелось в виду указание диапазона значений для $deg/
    Тоже рабочий способ. Ничем не лучше.
     
  18. ALFRED

    ALFRED Новичок

    С нами с:
    28 дек 2020
    Сообщения:
    34
    Симпатии:
    0
    а не могли бы написать как верно будет?
     
  19. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Что именно?
    Скрипт выше выдает значение массива .$array в зависимости от значения $deg.
    Что в этом массиве содержится, зависит от вас. Можете туда поместить текст, можете картинку.
     
  20. ALFRED

    ALFRED Новичок

    С нами с:
    28 дек 2020
    Сообщения:
    34
    Симпатии:
    0
    $a=$deg (...) как все это написать чтобы указав переменную $a содержалось направление ветра, когда как переменная $deg содержит лишь число в градусах
    как пример:
    echo $a выводило NW
    Переменная $deg получила другие значения, соответственно $a показывает другой результат
    Знал бы как сделать, разве бы просил написать решение. Нулевой почти опыт.

    посоветовали, но как написать если знаний не хватает, что куда писать:
    $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
     
  21. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Код (Text):
    1.  
    2. <?php
    3. function getCardinalDirection($deg) {
    4.     $array = array('↑ N', '? NE', '→ E', '? SE', '↓ S', '? SW', '← W', '? NW');
    5.     return $array[round(($deg / 45) % 8)];
    6. }
    7.  
    8. $deg = 250;
    9.  
    10. $a = getCardinalDirection($deg);
    11.  
    12. $deg2 = $deg + 180;
    13. if($deg >= 180) $deg2 = $deg - 180;
    14.  
    15. $b = getCardinalDirection($deg2);
    16.  
    17. echo $a.'<br>'.$b;
    18. ?>
    Всё остальное можно отбросить. Предполагаю, что это вам советовали варианты решения.
     
    #21 Drunkenmunky, 7 янв 2021
    Последнее редактирование: 7 янв 2021
  22. ALFRED

    ALFRED Новичок

    С нами с:
    28 дек 2020
    Сообщения:
    34
    Симпатии:
    0
    спасибо помогло
    но немного скорректировал, потому как показывало на прямо противоположное значение вместо южного показывал северный ветер
    поэтому предположил что стоит убрать все с 180 градусами и оставил до $a, а нижнее убрал и стало показывать все как надо, еще такой вопрос, вы предлагали заменить текст на png, а можно все это совместить, чисто технический вопрос, уже рад этому результату

    $array = array('↑ N'+ 'picN.png', '? NE', '→ E', '? SE', '↓ S', '? SW', '← W', '? NW');
     
  23. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Можно.
    Но смыcл?
    Максимум, чего вы добьетесь, это прорисовка надписи на изображении с помощью GD.
    Тоже самое можно сделать куда эффективней с помощью CSS.
     
  24. ALFRED

    ALFRED Новичок

    С нами с:
    28 дек 2020
    Сообщения:
    34
    Симпатии:
    0
    просто обнаружил, что косые стрелки в шрифте отсутствуют, теперь думаю как "судьбу обмануть")
     
  25. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    То же самое будет и в GD.
    Остается вариант с 8 иконками, или CSS