Google Weather API - анализ и изменение данных - PullRequest
2 голосов
/ 27 февраля 2011

Этот вопрос больше не актуален - Google закрыл неофициальный погодный API в 2012 году


Я бы хотел добавить прогноз погоды на страницу друга. Когда я обращаюсь за

http://www.google.com/ig/api?weather=koprivnica,croatia&hl=hr

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

<?php
$xml = simplexml_load_file('http://www.google.com/ig/api?weather=koprivnica,croatia&hl=hr');
$information = $xml->xpath("/xml_api_reply/weather/forecast_information");
$current = $xml->xpath("/xml_api_reply/weather/current_conditions");
$forecast_list = $xml->xpath("/xml_api_reply/weather/forecast_conditions");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>VREMENSKA PROGNOZA</title>
</head>
    <body>
        <h1><?= print $information[0]->city['data']; ?></h1>
        <h2>Danas</h2>
        <div class="weather">
            <img src="<?= 'http://www.google.com' . $current[0]->icon['data']?>" alt="weather"?>
            <span class="condition">
            <?= $current[0]->temp_f['data'] ?>&deg; F,
            <?= $current[0]->condition['data'] ?>
            </span>
        </div>
        <h2>Prognoza</h2>
        <?php foreach ($forecast_list as $forecast) : ?>
        <div class="weather">
            <img src="<?= 'http://www.google.com' . $forecast->icon['data']?>" alt="weather"?>
            <div><?= $forecast->day_of_week['data']; ?></div>
            <span class="condition">
                <?= $forecast->low['data'] ?>&deg; F - <?= $forecast->high['data'] ?>&deg; F,
                <?= $forecast->condition['data'] ?>
            </span>
        </div>
        <?php endforeach ?>
    </body>
</html>

Но приведенный выше код не будет работать, потому что я использовал «hr» вместо «en» (hr = хорватский язык):

$xml = simplexml_load_file('http://www.google.com/ig/api?weather=koprivnica,croatia&hl=en')

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

Полагаю, дело в неправильном свойстве кодировки UTF-8.

Я не знаю, как получить точный хорватский текст и перевести градусы F в градусы Цельсия.


  1. Впоследствии я нашел ссылку на F-to-C решение и изменил строку 19:

    <?= $current[0]->temp_f['data'] ?>&deg; F,

    до

    <?= $current[0]->temp_c['data'] ?>&deg; C,

    (я не использую его в текущей версии, потому что кажется, что API обрабатывает Цельсий.)

  2. Чтобы сохранить градусы в Си, в то время как язык установлен на «en», вы можете использовать en-gb.

Ответы [ 2 ]

6 голосов
/ 28 февраля 2011

Проблема кодирования:

По какой-то причине Google возвращает содержимое XML без надлежащего объявления кодировки.Можно было бы ожидать что-то вроде:

<?xml version='1.0' encoding='ISO-8859-2'?>

Но они пропускают атрибут кодирования в заголовке.Это заставляет функцию simplexml_load_file принимать кодировку UTF-8 по умолчанию.Я бы посчитал это ошибкой в ​​их реализации API, поскольку спецификация XML определяет UTF-8 в качестве резервной кодировки по умолчанию .

Для этого попробуйте что-то вроде:

<?php
$URL = "http://www.google.com/ig/api?weather=koprivnica,croatia&hl=hr";
$dataInISO = file_get_contents($URL);
$dataInUTF = mb_convert_encoding($dataInISO, "UTF-8", "ISO-8859-2");
$xml = simplexml_load_string($dataInUTF);
...

Что, кажется, работает.Значение ISO-8859-2 было чистым предположением.

по Фаренгейту / Цельсию :

Я не вижу простого способа запросить данные о температуре, которые должны быть предоставленыв градусах Цельсия вместо Фаренгейта в этом API (я не смог найти официальный документ, я слепой?).Однако преобразование из F в C не должно быть сложным.

Попробуйте эту формулу:

(°F  -  32)  x  5/9 = °C

, которую вы можете найти в тысячах мест.Я взял это от http://www.manuelsweb.com/temp.htm

2 голосов
/ 28 апреля 2011

Google xml возвращает температуру в градусах Цельсия, а также ищет тег temp_c внутри current_conditons

...