Yine bir günlerden bir gün can sıkıntısından, bazen ilham nereden geleceği belli olmaz(videoyu izleyiniz 😃), sizler için basit ama bir o kadar faydalı bir orta seviyeli proje sunuyorum. Bunu daha sonra "mysql" veri tabanına bağlamayı planlıyorum. Cmd komutu olan "curl wttr.in" pythona uyarlattığım orta seviyeli bir python uygulamasıdır. Yapay zeka kullanarak tasarladım, pek fazla üzerinde durmadım. Şıanda tüm dikkatimi "Lingo Türkiye Oyunu"na verdim. Veri tabanına bağladım şuanda oyun ekran tasarımı yüzü kaldı onuda tamamlayıp paylaşacağım.
Kısa Tanıtım Videosu
Python ile Türkiye Haritası Üzerinde Şehirler ve Hava Durumu İşlemleri
Bu makalede, Türkiye'nin 81 ilini bir harita üzerinde gösterip, illerin üzerine tıklanıldığında hava durumu bilgisini görüntüleyen bir Python projesini anlatıyoruz. Projede kullanılan kütüphaneler, işlevleri ve kurulumu adım adım açıklanmıştır.
Giriş
Python, coğrafi verilerle çalışmak ve görselleştirmek için güçlü kütüphaneler sunar. Bu projede, matplotlib
, cartopy
, ve requests
gibi kütüphaneleri kullanarak interaktif bir Türkiye haritası oluşturuyoruz. Proje ayrıca, hava durumu verilerini almak için ücretsiz bir API olan wttr.in'i kullanıyor.
Kullanılan Kütüphaneler ve Kurulum
1. matplotlib
- İşlevi: Veri görselleştirme ve grafik oluşturma.
- Kurulum:
pip install matplotlib
2. cartopy
- İşlevi: Coğrafi verilerin görselleştirilmesi ve haritaların oluşturulması.
- Kurulum:
pip install cartopy
Not: Bu kütüphane, ilk kullanımda gerekli coğrafi verileri otomatik olarak indirir.
3. requests
- İşlevi: API'den veri almak için HTTP istekleri gönderme.
- Kurulum:
pip install requests
Kodun İşleyişi
1. Şehirler ve Koordinatlar
Proje, Türkiye'nin 81 ilini ve bu illere ait koordinatları (boylam
, enlem
) bir Python sözlüğü (dictionary
) içinde saklar. Örnek:
cities = {
"Istanbul": (28.9784, 41.0082),
"Ankara": (32.8597, 39.9334),
"Izmir": (27.1428, 38.4237),
# Diğer şehirler...
}
2. Haritanın Oluşturulması
- Harita,
cartopy
kütüphanesi kullanılarak çizilir.
- Türkiye'nin sınırları, gölleri ve nehirleri görselleştirilir.
- Şehirler, kırmızı noktalarla işaretlenir ve isimleri yanlarına yazılır.
3. Şehir Seçimi ve Hava Durumu
- Haritada bir şehre tıklanıldığında
on_click
fonksiyonu çalışır.
- Tıklanan koordinatlara yakın bir şehir bulunur.
- Şehrin hava durumu,
wttr.in
API'sinden alınır.
- Alınan veri, bir mesaj kutusunda görüntülenir ve terminale yazdırılır.
Proje Kodu
Aşağıda, projenin tam kodu verilmiştir:
import tkinter as tk
from tkinter import messagebox
import requests
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from matplotlib.backend_bases import MouseEvent
# Türkiye'nin 81 ilini ve koordinatlarını içeren veri
cities = {
"Adana": (35.3213, 37.0025),
"Ankara": (32.8597, 39.9334),
"Istanbul": (28.9784, 41.0082),
"Izmir": (27.1428, 38.4237),
# ... tüm 81 il burada
}
def get_weather(city):
"""Şehir için hava durumu bilgisini getirir."""
try:
url = f"https://wttr.in/{city}?format=%l:+%c+%t+%w+%h\n"
response = requests.get(url)
if response.status_code == 200:
return response.text.strip()
else:
return f"Hava durumu bilgisi alınamadı. Hata Kodu: {response.status_code}"
except Exception as e:
return f"Hata oluştu: {e}"
def on_click(event: MouseEvent):
"""Haritada tıklanan konumu kontrol eder ve şehir bilgisi gösterir."""
if event.xdata and event.ydata:
for city, coords in cities.items():
lon, lat = coords
if abs(event.xdata - lon) < 1 and abs(event.ydata - lat) < 1:
weather_info = get_weather(city)
messagebox.showinfo(f"{city} Hava Durumu", weather_info)
print(weather_info)
break
def draw_map():
"""Türkiye haritasını çizer ve şehirleri ekler."""
fig, ax = plt.subplots(figsize=(10, 8), subplot_kw={'projection': ccrs.PlateCarree()})
ax.set_extent([25, 45, 35, 43]) # Türkiye sınırları
# Harita detayları
ax.add_feature(cfeature.BORDERS, linestyle=':', edgecolor='black')
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.LAND, edgecolor='black')
ax.add_feature(cfeature.LAKES, edgecolor='blue')
ax.add_feature(cfeature.RIVERS, edgecolor='blue')
# Şehirleri ekle
for city, (lon, lat) in cities.items():
ax.plot(lon, lat, "ro", transform=ccrs.PlateCarree())
ax.text(lon, lat, city, fontsize=9, ha="center", transform=ccrs.PlateCarree())
# Tıklama olayını bağla
fig.canvas.mpl_connect("button_press_event", on_click)
plt.title("Türkiye Haritası ve Şehir Hava Durumu")
plt.show()
# Tkinter ile form arayüzü
root = tk.Tk()
root.title("Türkiye Haritası ve Hava Durumu")
root.geometry("400x200")
label = tk.Label(root, text="Türkiye Haritasını Açmak için Butona Tıklayın")
label.pack(pady=10)
btn = tk.Button(root, text="Haritayı Göster", command=draw_map)
btn.pack(pady=10)
root.mainloop()
Çıktı ve Özellikler
Form Arayüzü:
- Formda "Haritayı Göster" butonuna tıklanıldığında harita açılır.
Harita:
- Türkiye haritası üzerinde şehirler kırmızı noktalarla işaretlenmiştir.
- Şehirlere tıklandığında hava durumu bilgisi gösterilir.
Mesaj Kutusu:
- Tıklanan şehrin hava durumu mesaj kutusu içinde görüntülenir.
Sonuç
Bu proje, Python kullanarak coğrafi verilerle çalışmayı ve interaktif harita uygulamaları oluşturmayı öğrenmek için harika bir örnektir. cartopy
, matplotlib
, ve requests
gibi güçlü kütüphanelerin bir araya getirilmesiyle, gerçek zamanlı hava durumu verilerine erişen kullanıcı dostu bir uygulama geliştirebilirsiniz.
Tam Kod 81 il
import tkinter as tk
from tkinter import messagebox
import requests
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from matplotlib.backend_bases import MouseEvent
# Şehir ve koordinat bilgileri
cities = {
"Adana": (35.3213, 37.0025),
"Adıyaman": (38.2765, 37.7648),
"Afyonkarahisar": (30.5537, 38.7638),
"Ağrı": (43.0503, 39.7191),
"Aksaray": (34.0291, 38.3687),
"Amasya": (35.8353, 40.6524),
"Ankara": (32.8597, 39.9334),
"Antalya": (30.7133, 36.8969),
"Ardahan": (42.7022, 41.1105),
"Artvin": (41.8190, 41.1824),
"Aydın": (27.8458, 37.8450),
"Balıkesir": (27.8866, 39.6499),
"Bartın": (32.3372, 41.6350),
"Batman": (41.1149, 37.8812),
"Bayburt": (40.2272, 40.2563),
"Bilecik": (30.0640, 40.1426),
"Bingöl": (40.4952, 38.8854),
"Bitlis": (42.1078, 38.4010),
"Bolu": (31.6116, 40.7350),
"Burdur": (30.2889, 37.7178),
"Bursa": (29.0602, 40.1826),
"Çanakkale": (26.4064, 40.1467),
"Çankırı": (33.6167, 40.6013),
"Çorum": (34.9516, 40.5506),
"Denizli": (29.0873, 37.7833),
"Diyarbakır": (40.2110, 37.9136),
"Düzce": (31.1628, 40.8438),
"Edirne": (26.5560, 41.6771),
"Elazığ": (39.2280, 38.6751),
"Erzincan": (39.4923, 39.7500),
"Erzurum": (41.2769, 39.9041),
"Eskişehir": (30.5206, 39.7667),
"Gaziantep": (37.3833, 37.0662),
"Giresun": (38.3879, 40.9170),
"Gümüşhane": (39.4815, 40.4608),
"Hakkari": (43.7448, 37.5744),
"Hatay": (36.4018, 36.2028),
"Iğdır": (44.0438, 39.9215),
"Isparta": (30.5519, 37.7627),
"İstanbul": (28.9784, 41.0082),
"İzmir": (27.1428, 38.4237),
"Kahramanmaraş": (36.9371, 37.5760),
"Karabük": (32.6277, 41.2025),
"Karaman": (33.2232, 37.1810),
"Kars": (43.0975, 40.6025),
"Kastamonu": (33.7758, 41.3781),
"Kayseri": (35.4955, 38.7322),
"Kırıkkale": (33.5064, 39.8461),
"Kırklareli": (27.2245, 41.7350),
"Kırşehir": (34.1626, 39.1469),
"Kilis": (37.1154, 36.7165),
"Kocaeli": (29.9292, 40.8533),
"Konya": (32.4846, 37.8666),
"Kütahya": (29.6142, 39.4161),
"Malatya": (38.3131, 38.3552),
"Manisa": (27.4265, 38.6191),
"Mardin": (40.7397, 37.3212),
"Mersin": (34.6394, 36.8121),
"Muğla": (28.3660, 37.2154),
"Muş": (41.4919, 38.9462),
"Nevşehir": (34.7102, 38.6244),
"Niğde": (34.6771, 37.9666),
"Ordu": (37.8985, 40.9856),
"Osmaniye": (36.2475, 37.0745),
"Rize": (40.5219, 41.0201),
"Sakarya": (30.4070, 40.7569),
"Samsun": (36.3302, 41.2867),
"Siirt": (41.9349, 37.9274),
"Sinop": (35.1535, 42.0260),
"Sivas": (37.0164, 39.7484),
"Şanlıurfa": (38.7860, 37.1674),
"Şırnak": (42.4505, 37.5139),
"Tekirdağ": (27.5110, 40.9783),
"Tokat": (36.5544, 40.3167),
"Trabzon": (39.7169, 41.0015),
"Tunceli": (39.5484, 39.1061),
"Uşak": (29.4082, 38.6823),
"Van": (43.4098, 38.5012),
"Yalova": (29.2769, 40.6556),
"Yozgat": (34.8081, 39.8182),
"Zonguldak": (31.7917, 41.4564)
}
def get_weather(city):
"""Şehir için hava durumu bilgisini getirir."""
try:
url = f"https://wttr.in/{city}?format=%l:+%c+%t+%w+%h\n"
response = requests.get(url)
if response.status_code == 200:
return response.text.strip()
else:
return f"Hava durumu bilgisi alınamadı. Hata Kodu: {response.status_code}"
except Exception as e:
return f"Hata oluştu: {e}"
def on_click(event: MouseEvent):
"""Haritada tıklanan konumu kontrol eder ve şehir bilgisi gösterir."""
if event.xdata and event.ydata:
for city, coords in cities.items():
lon, lat = coords
# Tıklama toleransı
if abs(event.xdata - lon) < 1 and abs(event.ydata - lat) < 1:
weather_info = get_weather(city)
messagebox.showinfo(f"{city} Hava Durumu", weather_info)
print(weather_info)
break
def draw_map():
"""Türkiye haritasını çizer ve şehirleri ekler."""
fig, ax = plt.subplots(figsize=(10, 8), subplot_kw={'projection': ccrs.PlateCarree()})
ax.set_extent([25, 45, 35, 43]) # Türkiye koordinatları
# Harita detayları
ax.add_feature(cfeature.BORDERS, linestyle=':', edgecolor='black')
ax.add_feature(cfeature.COASTLINE)
ax.add_feature(cfeature.LAND, edgecolor='black')
ax.add_feature(cfeature.LAKES, edgecolor='blue')
ax.add_feature(cfeature.RIVERS, edgecolor='blue')
# Şehirleri ekle
for city, (lon, lat) in cities.items():
ax.plot(lon, lat, "ro", transform=ccrs.PlateCarree()) # Kırmızı nokta
ax.text(lon, lat, city, fontsize=9, ha="center", transform=ccrs.PlateCarree())
# Tıklama olayını bağlama
cid = fig.canvas.mpl_connect("button_press_event", on_click)
plt.title("Türkiye Haritası ve Şehir Hava Durumu")
plt.show()
# Tkinter arayüzü
root = tk.Tk()
root.title("Türkiye Haritası ve Hava Durumu")
root.geometry("400x200")
label = tk.Label(root, text="Türkiye Haritasını Açmak için Butona Tıklayın")
label.pack(pady=10)
btn = tk.Button(root, text="Haritayı Göster", command=draw_map)
btn.pack(pady=10)
root.mainloop()