dersblog

Yeni Haritalama Paketi

İnternet bağlantısı gerektirmeyen, gerekli verisini paket kurulum dosyalarında taşıyan haritalama paketi revaçta yoktu, yazalım dedik - simplegeomap. Açık yazılım olarak paylaşılıyor [1], ve PyPi üzerinde kurulmaya hazır whl dosyası var, pip install simplegeomap ile kurulabilir.

Simplegeomap temel ihtiyaçları basit, hızlı bir şekilde cevaplaması için yazılmıştır, bu ihtiyaçlar en azından bizim için istenen bir bölge içine düşen kıta, ülke sınırlarını çabuk bir şekilde çizebilmek, sınırlar dışında kalanları (mesela denizler) belli bir renkte vermek, yükseklik (dağlar) ve su alanları (nehir, göl gibi) haritalamanın, raporlamanın mümkün olması.

Smgm yuvarlak olan yerkürenin farklı şekildeki iki boyuta yansıtma tekniklerini kullanmıyor, en temel yaklaşım olan boylamı x, enlemi y kordinatı kabul edip veriyi direk kartezyen halde grafikleme tekniğini seçiyor. Bu yaklaşım yakın mesafeler ve objelerin genel yerlerini göstermesi açısından yeterlidir.

Kıtalar, Ülkeler

En temel çizimle başlayalım. Bir kordinatı merkez alıp belli bir odak (zoom) seviyesine göre o noktadaki kıta sınırlarını çizelim,

import simplegeomap as sm

sm.plot_continents(clat=0,clon=0,zoom=20)
plt.savefig('sm_01.jpg',quality=40)

Bu grafikleme için gereken veri smgm içinde mevcut continents.zip dosyasından geliyor, kıta sınırları bir JSON içinde, 300K büyüklüğünde. İnternet bağlantısına gerek yok.

Farklı yerlere odaklanabiliriz,

sm.plot_continents(clat=30,clon=30,zoom=5)
plt.savefig('sm_02.jpg',quality=40)

Smgm üstteki türden haritalama için iç renk ve dış renk (incolor, outcolor) kavramlarını kullanır. Sınırları olan alanlar, kıtalar, ya da ülkelerin içi incolor ile dışarıda kalan herşey outcolor ile renklenir. Mesela iç kahverengimsi, dış daha koyu mavi istersek bunu yapabiliriz,

sm.plot_continents(clat=30,clon=30,zoom=5,incolor='yellow',outcolor='blue')
plt.savefig('sm_03.jpg',quality=40)

Olağan (default) değerler iç lightyellow dış lightblue. Kullanıcı bu değerleri görüldüğü gibi değiştirebiliyor.

Ülkeler,

sm.plot_countries(clat=30,clon=30,zoom=2)
plt.savefig('sm_04.jpg',quality=40)

Üstte kodda tanımlanan bölgenin içine düşen tüm ülke sınırları çizildi. Tekrar belirtmek gerekirse, kıta sınırları, ülke sınırlarını içeren veri dosyaları paketin bir parçasıdır, bu dosyalar kurulum ile beraber gelirler ve her an erişime hazır olacaklardır. Üstteki grafikleme TM_WORLD_BORDERS-0.3.shp dosyasından geldi, ki bu veri açık olarak paylaşılan bir veridir.

Paket grafikleme yaparken temel matplotlib kavramlarını kullanır, zaten enlem/boylam bilgisini boylam/enlem olarak x,y noktaları olarak kullandığımızı söylemiştik, bu durumda, eğer ek bilgileri haritaya konuşlandırmak istersek bunu hala matplotlib yapılarıyla x,y vererek yapabiliriz. Mesela üstteki haritada Mısır'da enlem=28, boylam=30 noktasını göstermek istiyorum, oraya bir kırmızı 'elmas' şekli koyabilirim, altına yazı yazabilirim,

sm.plot_countries(clat=30,clon=30,zoom=2)
plt.plot(30,28,'rd')
plt.text(25,28.5,'Buraya dikkat')
plt.savefig('sm_05.jpg',quality=40)

Muhakkak matplotlib paketinin içinde pek çok diğer çağrı var, mesela oklarla bir vektör alanı quiver ile, her türlü plot şekli üstteki grafikte plt ya da ax objeleri üzerinden direk kullanılabilirdi.

Ülke Renklendirmek

Ülkelerin ayrı renklerle gösterilmesi için ülkenin ISO3 koduna eşlenen renk verisini bir sözlük içinde plot_countries çağrısına verebiliriz. Tüm ISO3 kodları sm.get_country_name_iso3() çağrısı ile alınabilir.

clat,clon = 40, 29; zoom = 2.0
colors = {"TUR": "red", "GRC": "yellow"}
sm.plot_countries(clat,clon,zoom,country_color=colors)
plt.savefig('sm_11.jpg')

Odak, Uzak Ülkeler

Paket, verilen merkez nokta ve odak (zoom) üzerinden haritalama yaparken verilen noktadan 'uzak' olan ülkeleri çizmemeye uğraşıyor. Bunu odak parametresini bir uzaklığa çevirerek ve merkezi uzaklığın dışına düşen ülkeleri atlayarak yapıyor. Fakat bazen bu algoritma işlemeyebilir, mesela Rusya büyüklüğü sebebiyle bir ülkenin sınırında olsa bile merkezi çok uzakta olduğu için 'dış bölge' olarak kabul edilebilir, bu durumda force_include=['RUS'] ile bu ülkeyi haritaya tekrar 'dahil' edebiliriz.

Bölgeler, Çizgiler

Bir kordinat listesi ile bir eğri, çizgi göstermek mümkündür. Çizgiyi temsil eden noktaları liste olarak smgm'e verince çizgi parçaları basılır. Eğer kapalı bölge istersem verilen listenin son kordinatı ilk kordinatına bağlı kabul edilecektir, ve alan kapatılacaktır.

pts = np.array([[40,10],[43,10], [43,15]])
fig, ax = plt.subplots()
sm.plot_countries(clat=40,clon=10,ax=ax,zoom=1.0)
sm.plot_line(pts,ax,color='red')
plt.savefig('sm_06.jpg',quality=40)

fig, ax = plt.subplots()
sm.plot_countries(clat=40,clon=10,ax=ax,zoom=1.0)
sm.plot_region(pts,ax,color='lightpink')
plt.savefig('sm_07.jpg',quality=40)

Aynı Harita İçin Birden Fazla smgm Çağrısı

Üstteki çağrıda birden fazla çağrı yaptık ama çıktı sadece bir haritaydı. Bu durumda grafiği temsil eden Axis, Figure objelerini matplotlib'den alıp onları simplegeomap çağrılarına ek parametreler olarak geçtik. Bu şekilde paket hangi grafik üzerine gösterim yapacağını anlamış oldu.

Her seferinde bunu yapmak gerekli değil, bazı temel çağrılar, mesela plot_continents, ya da plot_countries gibi, eğer ax, fig objeleri geçilmemişse bir tane olağan obje yaratabilir, ve ardından gelecek plt çağrıları bu objeleri nasıl olsa kullanacaktır. Fakat daha çetrefil kullanımlarda ax, fig bizim tarafımızdan yaratılmalı, ve her arayüze geçilmeli. Mesela aynı grafik içinde birden fazla alt grafik kullanımı bir çetrefil kullanım örneği, bu durumda gerekli alt grafiğin ax, fig objeleri farklı çağrılara geçilebilir,

fig, ax = plt.subplots(2,figsize=(4,4))
sm.plot_countries(40,20,zoom=1,ax=ax[0])
sm.plot_countries(40,30,zoom=1,ax=ax[1])
plt.savefig('sm_08.jpg',quality=40)

Nehirler, Göller

Odaklanan bölge içine düşen su öbekleri için plot_water var,

clat,clon = 48, 35
zoom = 1.0
fig, ax = plt.subplots() 
sm.plot_countries(clat,clon,zoom=zoom,ax=ax,force_include=['RUS'])
sm.plot_water(clat,clon,zoom=zoom,ax=ax)
plt.savefig('sm_09.jpg',quality=40)

Kullanılan veri kaynağı hakkında daha detaylı bilgi şurada [3].

Dağlar, Yükseklik Verisi

clat,clon=39, 35; zoom = 1.0
fig, ax = plt.subplots() 
sm.plot_countries(clat,clon,zoom=zoom,ax=ax)
sm.plot_elevation(clat,clon,zoom=zoom,ax=ax)
plt.savefig('sm_10.jpg',quality=40)

Eğer kontur seviyelerini biz tanımlamak istersek bunu levels=[100,200,..] şeklinde bir parametre geçerek smgm kodlarına bildirebiliriz, bu durumda 100 metre, 200 metre, vs kontur çizgileri basılacaktır.

Yükseklik verisi [4] bağlantısından geliyor. Bu veri kaynağında 1 x 1 derece çözünürlüğündeki dikdörtgen köşelerinin yükseklik verisi var. Veri ana a-p harfleriyle belirlenen bölgelere ayrılmıştır, mesela Akdeniz bölgesinin çoğunluğu g bölgesi içine düşüyor. Her bölgenin yükseklik verisi ayrı bir matris içinde, bu matrisleri bir önişlem içinde alıp Numpy uyumlu bir npz matris dosyası içinde biz kaydediyoruz. Bu önişlem kodu util.preprocess_GLOBE çağrısı içinde bulunabilir. Yer tasarrufu amacıyla paket içinde sadece g10g.npz verisini paylaştık, diğer bölgelerin verisi için all10g.zip dosyası NOAA sitesinden indirilebilir, ve üstteki önişlem kodu çağrılınca gerekli yükseklik matrisleri yaratılacaktır.

Yükseklik grafiklemesi odaklanan yere göre önce üstte bahsedilen ana bölgeyi ve onun matrisini bulur, bu g10a.npz olabilir, g10b.npz olabilir. Fakat veri ana a-p bölgelerine ayrılmış olsa bile hala ham verinin tamamını hafızada işlemek külfetli olacağı için odak parametresine göre gerekli yerlerini çekip çıkartıyoruz. Yükseklik verisi aslında gri imaj verisi gibi görülebilir, grilik seviyesi yükseklik seviyesi gibidir, değerler eşit aralıklı ızgara bazlıdır, bu sebeple zaten hızlı işleyen görüntü işlem tekniklerini yükseklik için kullanmak mümkündür. Herhangi bir bölgenin yükseklik verisini almak mesela imaj bölgesini kesip çıkartmak (crop) ve o bölgeyi büyütmek (resize) işlemi olarak yapılıyor.

Kaynaklar

(1) https://github.com/burakbayramli/simplegeomap

(2) https://pypi.org/project/simplegeomap/

(3) Haritalama, Nehirler, Göller

(4) GL Tiles


Yukarı