Google Weather API - анализ и изменение данных
Этот вопрос больше не актуален - 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'] ?>° 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'] ?>° F - <?= $forecast->high['data'] ?>° 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 в градусы Цельсия.
Затем я нашел ссылку на решение F-to-C и изменил строку 19:
<?= $current[0]->temp_f['data'] ?>° F,
в
<?= $current[0]->temp_c['data'] ?>° C,
(Я не использую его в текущей версии, потому что кажется, что API обрабатывает Цельсий.)
Чтобы сохранить градусы в Си, в то время как язык установлен на "en", вы можете использовать
en-gb
,
2 ответа
Проблема кодирования:
По какой-то причине 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
Google xml возвращает температуру в градусах Цельсия, а также ищет тег temp_c внутри current_conditons