PHP ile Hava Durumu Botu Yapımı

By

PHP ile Hava Durumu Botu Yapımı

Merhabalar, daha önce yazdığım PHP ile hava durumu botu hazırlama yazım çok fazla okunduğu için daha düzgün ve detaylı bir anlatım yapma gereği hissettim. Önceki yazıda MGM.gov.tr adresinden güncel hava durumu verilerini içeren XML dosyasını nasıl işleyebileceğinizi göstermiştim. Yine aynı veri kaynağı üzerinden birkaç örnek daha hazırladım.

PHP hava durumu botu yaparken öncelikle neden MGM verisini kullandığımı kısaca açıklayayım. Meteoroloji Genel Müdürlüğü tarafından sağlanan bu veriler ile birkaç yıldır farklı uygulamalar yapıyorum. Şimdiye kadar verinin sürekliliği ve doğruluğu ile ilgili herhangi bir sorun yaşamadım. Diğer hava durumu bilgisi sağlayan API’lerin çoğu ücretli olabiliyor veya ücretsiz olanlarda bu XML’deki kadar detay içermiyor.

Hazırsanız başlayalım, ilk olarak hangi kaynaklardan hava durumu verisi alacağımızı listelemeliyiz.

Meteoroloji Genel Müdürlüğü hava durumu API veri kaynakları

Başlamadan önce şunu da belirtelim; mgm.gov.tr’nin sunucularında pek çok XML çıktısı mevcut. Bu veri çıkışlarının genel kullanıma açık olup olmadığını tam olarak bilemiyorum, uzun zamandır herhangi bir sorun yaşamadım. Bunların hepsini listelemek için Google’da şöyle bir arama yapabilirsiniz: site:mgm.gov.tr filetype:xml Bu arama ile karşınıza mgm.gov.tr’nin bütün XML veri kaynakları çıkacaktır.

Bunları tek tek inceleyip güncel veri çıkışı yapılıp yapılmadığına bakabilirsiniz, pek çok detay içeren meteoroloji verileri mevcut. Şunu da ayrıyetten belirteyim eğer bu veri kaynaklarını kullanacaksanız sitenizde veya uygulamanızda; verilerin Meteoroloji Genel Müdürlüğü’nden sağlandığını belirtmelisiniz. Ben işimize yarayabilecek birkaç tanesini aşağıya yazıyorum, görmek için tıklayınız.

İlgili Yazı:  PHP Veri Türleri Nelerdir? Örneklerle Veri Tipleri

PHP hava durumu botu yapımına başlayalım. İlk aşamamız:

1.) Curl ile veri getirme fonksiyonu oluşturalım

function getir($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}

Bazı hostlarda CURL eklentisi aktif olmadığı için bir ihtimal aşağıdaki hatayı alabilirsiniz.
Fatal error: Call to undefined function curl_init()
Eğer bu hata ile karşılaşıyorsanız kullandığınız host veya yerel sunucunuzda CURL eklentisi aktif değildir.
Çözümünü en aşağıya ekledim, görmek için buraya tıklayınız.
Herhangi bir sorun yoksa devam ediyoruz.

2.) XML içeriğini PHP ile okuma

İlk örnekte İstanbul verisi kullanalım. Avcılar ilçesinin hava durumuna göz atmak istiyoruz.
İstanbul ve ilçelerinden hava durumu verisi almak için kullanacağımız URL:
https://www.mgm.gov.tr/FTPDATA/bolgesel/istanbul/sonSOA.xml
Öncelikle bu xml dosyasınının içeriğini tarayıcıda açarak inceleyip hangi veriye ulaşacağımıza bakalım.

 PHP ile hava durumu botu yapımı

XML yapısı bir ağaç gibidir. Bu örnekte SOA bu ağacın kökü diyebiliriz. Kemo dalında ise İstanbul ilinin hava durumu verileri bulunuyor. Avcılar verisi ise birçok ilceler dalı olan ağacımızın 4. sırasında bulunuyor.

$gelen_veri = getir("https://www.mgm.gov.tr/FTPDATA/bolgesel/istanbul/sonSOA.xml");
$veri = simplexml_load_string($gelen_veri);

Kaynak URL’den düz metin olarak gelen veriyi, simplexml_load_string fonksiyonu ile XML olarak açıyoruz. Bu sayede verimiz Array olarak erişilebilir duruma geliyor.

$gelen_veri = getir("https://www.mgm.gov.tr/FTPDATA/bolgesel/istanbul/sonSOA.xml");
$veri = simplexml_load_string($gelen_veri);
$sayi = count($veri);

Çıktı: 102
XML olarak açtığımız verinin sayısına count fonksiyonu ile bakıyoruz ve 102 çıktısını alıyoruz.
Bu da demek oluyor ki; soa kökünü hiç belirtmemize gerek kalmıyor, yani $veri içerisindeki verilere direkt $veri->kemo->tarih; şeklinde ulaşabileceğiz.

$gelen_veri = getir("https://www.mgm.gov.tr/FTPDATA/bolgesel/istanbul/sonSOA.xml");
$veri = simplexml_load_string($gelen_veri);
echo $veri->ilceler[4]->ilce." ilçesinin hava durumu: ".$veri->ilceler[4]->Durum;
https://hakans.science/wp-content/uploads/2018/10/cikti-1.png

Evet! Sonunda Avcılar’ın hava durumunu öğrenebildik.

Hadi bunu biraz daha geliştirelim, bu sefer Çatalca’ya pikniğe gideceğiz ve hava durumunu öğrenmek istiyoruz.

$gelen_veri = getir("https://www.mgm.gov.tr/FTPDATA/bolgesel/istanbul/sonSOA.xml");
	$veri = simplexml_load_string($gelen_veri);
	$nere = "Çatalca";
	foreach ($veri->ilceler as $data){
		if ($data->ilce == $nere){
			echo $data->Sehir." / ".$data->ilce."<br>";
			echo "<b>".$data->Mak." &deg; / ".$data->Min." &deg; </b>;";
			echo $data->Durum;
			echo "<br></b>İstanbul</b>; genel durumu: ".$veri->Kemo->GenelDurum;
		}
	}

Hava piknik için pek uygun değilmiş.
Bu döngü sayesinde artık sayı ile değil de, ilçe ismiyle bulabiliyoruz istediğimiz ilçeyi.

İlgili Yazı:  PHP Değişkenler ve Örneklerle Değişken İşlemleri

İstanbul’un hava durumuna biraz daha detaylı bakalım.

$gelen_veri = getir("https://www.mgm.gov.tr/FTPDATA/bolgesel/istanbul/sonSOA.xml");
	$veri = simplexml_load_string($gelen_veri);
	$d = $veri->Kemo;
	echo "<br><b>İstanbul’da hava durumu nasıl?</b>";
	echo "<br><b>Genel Durum: </b>".$d->GenelDurum;
	echo "<br><b>Hava sıcaklığı: </b>".$d->HavaSicakligi;
	echo "<br><b>Rüzgar durumu: </b>".$d->RuzgarDurum;
	echo "<br><b>Deniz durumu: </b>".$d->DenizDurum;
	echo "<br><br><b>Marmara genel durumu: </b>".$d->Marmara;
	$uyarilar = array();
	$i = 0;
	echo "<br><b>Herhangi bir meteorolojik uyarı yapıldı mı?</b><br>";
		for ($k = 1;$k <= 8;$k++){
			$uyari_sayisi = "Uyari".$k;
			if($d->$uyari_sayisi != ""){
			$uyarilar[$i] = $d->$uyari_sayisi;
			$i++;
		}
	}
	if (count($uyarilar) > 0){
		echo count($uyarilar)." adet meteorolojik uyarı yapıldı, aşağıda listelendi.";
		foreach($uyarilar as $uyari){
			echo $uyari."<br>";
		}
	}else{
		echo "Herhangi bir meteorolojik uyarı yapılmadı.";
	}
ist-havadurumu-detayli

Aynı şekilde Ege denizinin hava durumu detaylarına bakalım, İzmir gelsin.

$gelen_veri = getir("https://www.mgm.gov.tr/FTPDATA/bolgesel/izmir/sonSOA.xml");
	$veri = simplexml_load_string($gelen_veri);
	$d = $veri->Kemo;
	echo "<b>İzmir’de hava durumu nasıl?</b><br>";
	echo "<br><b>Genel Durum: </b>".$d->GenelDurum;
	echo "<br><b>Hava sıcaklığı: </b>".$d->HavaSicakligi;
	echo "<br><b>Rüzgar durumu: </b>".$d->RuzgarDurum;
	echo "<br><b>Deniz durumu: </b>".$d->DenizDurum;
	echo "<br><b>Çanakkale – Çeşme: </b>".$d->CanakkaleCesme;
	echo "<br><b>Çeşme – Fethiye: </b>".$d->CesmeFethiye;
	echo "<br>";
	$uyarilar = array();
	$i = 0;
	echo "<br><b>Herhangi bir meteorolojik uyarı yapıldı mı?</b><br>";
	for ($k = 1;$k <= 8;$k++){
	$uyari_sayisi = "Uyari".$k;
		if($d->$uyari_sayisi != ""){
			$uyarilar[$i] = $d->$uyari_sayisi;
			$i++;
		}
	}
		if (count($uyarilar) > 0){
			echo count($uyarilar)." adet meteorolojik uyarı yapıldı, aşağıda listelendi.<br>";
		foreach($uyarilar as $uyari){
			echo $uyari."<br>";
		}
	}else{
		echo "Herhangi bir meteorolojik uyarı yapılmadı.";
	}
izmirgelsin

İzmir’in Çiğli ilçesinin hava durumu bilgilerine bakalım

$gelen_veri = getir("https://www.mgm.gov.tr/FTPDATA/bolgesel/izmir/sonSOA.xml");
	$veri = simplexml_load_string($gelen_veri);
	$nere = "Çiğli";
	foreach ($veri->ilceler as $data){
		if ($data->ilce == $nere){
			echo "<b>".$data->Sehir." – ".$data->ilce;
			echo "&nbsp;".$data->Mak."° / ".$data->Min."°</b><br>";
			echo $data->Durum;
			echo "<br><b>İzmir</b> genel durumu: ".$veri->Kemo->GenelDurum;
		}
	}

Sayısal hava durumu verileri

Sayısal veriler için bu URL’ı kullanıyoruz:
https://www.mgm.gov.tr/FTPDATA/analiz/SonDurumlarTumu.xml

sayisalverilerxml

Burada yapı diğer XML yapısından farklı. SD ağacın kökü, Merkezler ise dalları.
Yine aynı yöntemi kullanabiliriz. Örnek: Üstteki ekran görüntüsündeki Adana’nın Ceyhan’ın hava durumu değerlerini getirelim.

$gelen_veri = getir("https://www.mgm.gov.tr/FTPDATA/analiz/SonDurumlarTumu.xml");
	$veri = simplexml_load_string($gelen_veri);
	$nere = "CEYHAN";
	foreach ($veri->Merkezler as $data){
		if ($data->ilcesi == $nere and $data->ili == "ADANA"){
			echo "<br>ADANA CEYHAN – İstasyon adı:".$data->istadi;
			echo "<br>Hava sıcaklığı: ".$data->tmp;
			echo "<br>Havadaki nem: ".$data->nem;
			echo "<br>Hava basıncı: ".$data->press;
		}
	}
adanaceyhan

Ceyhan’da iki farklı istasyon varmış. Foreach döngüsü ile veriyi aldığımız için iki istasyonun verilerine de ulaşabiliyoruz.
Benim şimdilik verebileceğim örnekler bu kadar.
Umarım bu makale işinize yarayacaktır.
Saygılarımla.

İlgili Yazı:  PHP Fonksiyonlar ve Fonksiyon Kullanım Örnekleri

MGM URL Listesi

Bütün Türkiye’deki şehirler ve ilçeleri, köyleri hava durumunun sayısal verilerini(sıcaklık, basınç, nem vb.) almak için:
https://www.mgm.gov.tr/FTPDATA/analiz/SonDurumlarTumu.xml

Türkiye’nin şehirleri ve diğer Dünya ülkelerinin il, ilçeleri için verilen önümüzdeki 3 günlük hava durumu tahmin verileri (min, maks ve yağış durum kodu) için:
https://www.mgm.gov.tr/FTPDATA/analiz/GunlukTahmin.xml

Türkiye’nin bütün şehirleri için verilen saatlik tahmini değerleri ve hava durumu kodu (SY: sağanak yağış vb.):
https://www.mgm.gov.tr/FTPDATA/analiz/SaatlikTahmin.xml

Bazı iller ile çevresindeki iller için genel hava durumu ve URL’de belirtilen ilin bütün ilçelerinin genel durum verileri için:
İstanbul:
https://www.mgm.gov.tr/FTPDATA/bolgesel/istanbul/sonSOA.xml
İzmir:
https://www.mgm.gov.tr/FTPDATA/bolgesel/izmir/sonSOA.xml
Ankara:
https://www.mgm.gov.tr/FTPDATA/bolgesel/ankara/sonSOA.xml
Antalya:
https://www.mgm.gov.tr/FTPDATA/bolgesel/antalya/sonSOA.xml
Adana:
https://www.mgm.gov.tr/FTPDATA/bolgesel/adana/sonSOA.xml
Eskişehir:
https://www.mgm.gov.tr/FTPDATA/bolgesel/eskisehir/sonSOA.xml
Van:
https://www.mgm.gov.tr/FTPDATA/bolgesel/van/sonSOA.xml
Erzurum:
https://www.mgm.gov.tr/FTPDATA/bolgesel/erzurum/sonSOA.xml
Diyarbakır:
https://www.mgm.gov.tr/FTPDATA/bolgesel/diyarbakir/sonSOA.xml

“Fatal error” hatasının çözümü

“Fatal error: Call to undefined function curl_init()”
Eğer bu hata ile karşılaşıyorsanız kullandığınız host veya yerel sunucunuzda CURL eklentisi aktif değildir. Aşağıda bu sorunu nasıl çözebileceğinizi gösterdim.
Sorunu çözebilmek için PHP.ini’ye erişebiliyor olmamız gerekir, erişebildiğinizi ve Windows kullandığınızı varsayıyorum. Linux kullanıyorsanız burada detaylı bir makale mevcut: Enabling CURL in PHP (PHP.ini, WAMP, XAMPP, Ubuntu)

1. Adım: PHP.ini dosyasını bul

XAMPP’ta PHP.ini dosyasını bulmak için; Xammp’ın kurduğunuz dizine girip, php klasöründeki php.ini dosyasını açın.
Appserv’da php.ini dosyasını bulmak için; Appserv’ın kurulu olduğu dizine (genelde C:/appserv dizini olur bu) girip php5 ya da php7 klasörüne giriyorsunuz ve bu klasördeki php.ini dosyasını açın.

2. Adım: php_curl.dll’i aktif edin

CTRL + F yaparak arama penceresine curl veya extension yazıp arayarak dosyadaki eklentilerin aktif edildiği kısmına geliyoruz.
Burada görebileceğiniz gibi php’nin eklentilerinin aktif edilebildiği bir bölüm var. Aktif olmayan eklentilerin başında ; işareti var.
;extension=php_curl.dll ‘i buradan bulup bunun başındaki ; karakterini silip dosyayı kaydediyoruz.

PHP.ini CURL aktif etme
PHP Curl Aktif Etme

Benim aldığım ekran görüntüsündeki gibi diğer eklentileri aktif veya deaktif etmenize gerek yok. Sadece CURL eklentisini aktif ettik ve bizim için yeterli şimdilik.

3. Adım: Apache’yi yeniden başlat.

Dosyayı kaydettiyseniz apache’yi restartlamanız gerekir. XAMPP’da bunu kontrol ekranından yapıyorsunuz. Appserv’da ise; Appserv’in kurulu olduğu dizinin içerisinde Apache24 klasörü bulunuyor, içerisinde apache_stop.bat ve apache_start.bat dosyaları var. Önce stop olanı sonra da start olanı çalıştırıp restartlamış oluyoruz. Şimdi tekrar kodun çalışıp çalışmadığını deneyebilirsiniz.

Leave a Comment

Your email address will not be published.

You may also like