CBS`de Programlama - Avesis - Yıldız Teknik Üniversitesi

advertisement
YILDIZ TEKNİK ÜNİVERSİTESİ İNŞAAT FAKÜLTESİ HARİTA MÜHENDİSLİĞİ BÖLÜMÜ
CBS’de Programlama
ArcGIS’de Python ile Programlama
Prof.Dr. Türkay GÖKGÖZ
http://avesis.yildiz.edu.tr/gokgoz
Ocak 2014, İstanbul
Python’a Giriş: ArcGIS’de Python Penceresinin Kullanımı
Python’ı tanıtmanın en iyi yolu kodlar üzerinden gitmek olabilir. Şimdi, Buffer tool’unu ArcGIS Python
penceresinde çalıştıralım.
1. Uygulama verisini (Python_Data.zip) indiriniz ve bilgisayarınızda oluşturacağınız bir klasörde
çıkartınız.
2. ArcMap’te yeni bir harita açınız.
3. Tüm ArcMap uzantılarını (extensions) aktif hale getiriniz. (Customize  Extensions…)
4. Geoprocessing  Geoprocessing Options…  Background Processing kısmında Enable seçili
ise değiştiriniz.
5. us_cities.shp veri setini ekleyiniz.
6. Standard toolbar’da yer alan Python window simgesine
tıklayınız. Açılan pencereyi
sürükleyebilir ve ekranın uygun bir yerine sabitleyebilirsiniz.
7. Python penceresine aşağıdakileri yazınız.
>>> import arcpy
>>> arcpy.Buffer_analysis("us_cities",
"us_cities_buffered", "15 miles", "", "", "ALL")
8. Oluşan tampona yakınlaşınız ve inceleyiniz.
Script’in ilk satırı import arcpy ArcGIS yorumlayıcısına (ArcGIS’i yüklediğinizde yüklenmiştir)
“sizin ArcGIS ile birlikte gelen bazı özel fonksiyon ve araçlar ile çalışacağınızı” söyler. Python -bu satır
olmadan- ArcGIS hakkında hiçbir şey bilmez. Bu nedenle bu derste yazılan ArcGIS ile ilgili tüm kodların
en üst satırına bu ifadeyi yazacaksınız. Aslında ArcMap’in Python penceresiyle çalıştığınız zaman arcpy zaten önceden import edilmiş olacağından- teknik olarak bu satırı yazmanıza gerek yoktur.
Fakat Python penceresi dışında yazacağınız bütün programlar bu satır ile başlamak zorundadır.
Tool’u aslında programın ikinci satırı çalıştırır. Python’da bir tool’u çalıştırmak için arcpy’den sonra
bir nokta ve tool’un ismi yazılmalıdır. Ayrıca buffer tool’unu içeren toolbox adını takiben bir alt çizgi
(_) yerleştirildiğine dikkat ediniz. Çünkü bir tool aynı isimle farklı araç kutularında yer alabilmektedir.
(Örneğin; Clip, hem Data Management hem de Analysis toolbox’ında yer almaktadır.)
Arcpy.Buffer_analysis’den sonra tool için gerekli tüm parametreleri yazdınız. Her bir
parametre bir virgül ile ayrıldı ve bütün parametre listesi parantez içine alındı.
Bu kodda ardışık çift tırnak ("") ile bazı isteğe bağlı parametrelere başlangıç (default) değerlerin
atanmasını da sağlamış olduk.
Parametrelerin söz dizimi (syntax) ya da yapısı (structure) hakkında nasıl fikir sahibi olabilirsiniz?
Örneğin, tampon (buffer) mesafesi nasıl belirtilmeli: 15MILES, ’15MILES’, 15 Miles ya da ’15 Miles’ ?
Bunun gibi soruları cevaplamanın en iyi yolu Geoprocessing tool reference help topic for the Buffer
tool’a bakmaktır. Bu referans bölümlerindeki bütün başlıklar parametreleri nasıl yapılandıracağınızı
daha iyi anlamanız için iki bölüm (komut satırı kullanımı ve örnek) içermektedir. Zorunlu parametreler
< > içinde gösterilirken, isteğe bağlı (optional) parametreler { } içinde gösterilir. Bu yardım
dokümanını açtığınızda tampon mesafesinin "15 miles" olarak girilmesi gerektiğini görebilirsiniz.
1
Python penceresinin her parametre için seçenekleri size liste olarak sunduğunu görmüş olmalısınız.
Bu otomatik tamamlama olarak adlandırılır ve eğer bir tool’u ilk kez çalıştırıyorsanız ve
parametrelerin nasıl yazıldığını tam olarak bilmiyorsanız çok yararlı olabilir. PythonWin’de kod
yazarken, otomatik tamamlayamazsınız ve bu nedenle ipuçlarını görmek için Python penceresine
dönmek isteyebilirsiniz. Python penceresinden alacağınız kod satırı muhtemelen PythonWin’de de
çalışacaktır.
Python penceresinde kod yazma ile Notepad ve PythonWin gibi bir programda kod yazma arasında
çeşitli farklılıklar vardır. Python penceresinde, harita dokümanındaki katmanları, dosya yolları (paths)
yerine yalnız isimleriyle belirtebilirsiniz. Bu nedenle, "C:\\data\\us_cities.shp" gibi bir şey
yerine "us_cities" yazabildik. Ayrıca yeni katmana "us_cities_buffered" ismini
verebildik ve kod çalıştırıldıktan sonra bu isimle haritaya eklendi. Eğer kodunuzu Python penceresi
dışında kullanacaksanız, yolu (path) tam olarak belirttiğinizden emin olmalısınız.
Daha karmaşık kodlar yazacağınız zaman, özellikle Python kodu yazmanız ve test etmeniz için
geliştirilmiş bir program anlamına gelen bir Integrated Development Environment (IDE) kullanmak
faydalı olacaktır.
Önceki bölümde ModelBuilder kullanarak bir problemi çözmek için çeşitli araçların bir zincirin
halkaları gibi nasıl bir araya getirildiğini gördünüz. Aynı şey Python’da da yapılabilir fakat bu noktaya
ulaşmak için biraz daha Python bilgisine ihtiyaç vardır.
Python Nedir?
Python, script adı verilen programlar ile bilgisayarla hesap işlerini otomatikleştirmek için kullanan bir
dildir. Bu derse girişte, otomasyon ile işlerin daha kolay, daha hızlı ve daha doğru yapıldığını
öğrendiniz. Bu, CBS ve bilgisayar biliminin diğer birçok alanı için uygulanır. Python öğrenmeniz sizi
daha etkili bir CBS uzmanı yapacaktır. Bununla birlikte, Python programlama -CBS alanı dışında bile
size yararlı olabilecek- teknik bir beceridir.
Python başlangıç için iyi bir programlama dildir. Python yüksek seviye bir dildir. Bunun anlamı,
Python’u kullanmak için bilgisayarların nasıl çalıştığına dair ayrıntıları bilmek zorunda değilsiniz.
Python söz dizimini (syntax) okumak ve anlamak kolaydır.
Python açık-kaynak bir dildir ve kullanmak için herhangi bir ücret gerekmez. Python, Windows, Linux
ve Unix işletim sistemlerinde çalışabilir.
ArcGIS’te buffer tool’u gibi coğrafi hesaplama (geoprocessing) tool’larını kolaylıkla koşturmak için
Python kullanılabilir. ArcObjects kullanarak buffer mantığını kendiniz de kodlayabilirsiniz, fakat bu
çoğu senaryolarda gereksiz ve zaman alıcı olacaktır; tek bir satır kod yazarak buffer tool’unu çağırmak
daha kolaydır.
Python ve PythonWin Kurulumu
Not defteri ya da başka editörlerde Python kodu yazabilir ve bir .py dosyası olarak kaydedebilirsiniz,
fakat programı anlamak ve çalıştırmak için bilgisayarınızda Python’ın yüklü olması gerekir.
Bu derste Python 2.6.x versiyonu (eğer bilgisayarınızda ArcGIS 10.0 varsa) ya da 2.7.x versiyonu (eğer
bilgisayarınızda ArcGIS 10.1 ya da daha üst versiyonu varsa) ile çalışacağız. Eğer Python’nın kendi
2
sayfası www.python.org‘un program indirme sayfasını kontrol ederseniz, aslında Python’ın daha yeni
sürümleri olduğunu göreceksin. Python 3 ve üstü sürümler bazı büyük değişiklikler içermektedir ve
Python kullanıcı topluluğunun benimsesi biraz zaman alacaktır.
Python, IDLE denilen basit bir editör ile birlikte gelir; ancak bu derste PythonWin IDE kullanacaksınız.
PythonWin ücretsizdir, temel hata ayıklama yetenekleri vardır ve ArcGIS’e dâhil edilmiştir. Bununla
birlikte, aşağıdaki adımları izleyerek kurmanız gerekmektedir. Eğer ArcGIS 10.1 (ya da üstü)
kullanıyorsanız, doğru sürüm 2.7 ya da 27’dir. PythonWin’i buradan indirebilir ve kurabilirsiniz.
“win32” versiyonunu kullandığınızdan enim olunuz (ArcGIS / Python sürümüne bağlı olarak 2.6 ya da
2.7). “amd64”, 64-bit Python sürümünü kurmak için kullanılır ki bu ArcGIS Desktop için değil, yalnız
ArcGIS Server için uygundur.
Windows Vista ya da Windows 7’de, eğer yükleme sırasında hata mesajları görürseniz, muhtemelen
kurulumu bir yönetici olarak çalıştırmadınız (Run as Administrator). Yüklemeyi başlattığınızda sağ-tık
ve Run as Administrator (yönetici olarak çalıştır) seçtiğinizden emin olunuz. Başarıyla kurulmuş
olmasına rağmen Start/Başlat’ta gözükmüyorsa, C:\Python27\ArcGIS10.2\Lib\sitepackages\pythonwin\Pythonwin.exe yolunu takip ederek bulabilir ve çalıştırabilirsiniz.
PythonWin Arayüzü
Bu bölümde PythonWin’in ana kısımlarının kısa bir açıklamasını bulacaksınız. Okumaya başlamadan
önce PythonWin’i açınız. Böylece birlikte takip edebilirsiniz.
PythonWin açıldığında, Interactive Window’u göreceksiniz. >>> işaretlerinin olduğu satıra bir
Python satırı yazabilir ve sonucu görebilirsiniz. Ders notlarında >>> işaretlerinden sonra yazılmış bir
kod görürseniz, bunun anlamı, bu kodu Interactive Window’a yazabilirsiniz. Interactive Window, bu
şekilde kullanımıyla, ArcGIS’deki Python penceresine çok benzerdir.
Yeni bir script yazmak için File > New tıklanır ve Python Script seçilir. Bu arayüzde hazır yazı fontu
Courier’dir (birçok programcı bu fontu tercih eder) ve kodlar renklendirilir.
Standard araç çubuğu
yükleme, çalıştırma ve kaydetme araçlarını içerir. Bu araç çubuğu hazır olarak gelir. Undo/Redo
fonksiyonları
bir şeyler kodlamaya başladığınızda yanlış yoldan gittiğinizin farkına vardığınızda
ya da bir kod satırını silerseniz ve geri dönmek isterseniz size yardımcı olabilir. Run fonksiyonunun
koşan adam simgesi ile gösterildiğine dikkat ediniz. Bu, Windows Explorer içindeki dosyaya çift
tıklamanıza gerek kalmadan programınızı test etmek için iyi bir yoldur.
Debugging (hata ayıklama) araç çubuğu
kodunuzu dikkatlice gözden geçirip hatalarınızı tespit etmenize yardımcı olur. Bu araç çubuğu View >
Toolbars > Debugging tıklanarak ortaya çıkarılır. Debugging araç çubuğu bir programcı için son
derece değerlidir. Notpad gibi basit bir editör yerine bir IDE’de kod yazmanın başlıca nedenlerinde
biri bu araç çubuğudur.
3
Değişkenler ile Çalışma
Python’da basit script’leri yazmanıza yardımcı olacak bazı başlangıç programlama kavramları ile biraz
pratik yapalım. Değişkenlere bakarak başlayacağız.
x+3 ifadesinde olduğu gibi bir harf x bir sayıyı temsil edebilir. İşte bu harf bir değişkendir. Bilgisayar
biliminde değişkenler, daha sonra programda kullanılmak üzere bilgisayarın kendi hafızasına
kaydetmesini istediğiniz değerleri ve nesneleri temsil eder.
Değişkenler sadece sayıları değil, yazı ve “Boolean” değerlerini (‘true’ ya da ‘false’) temsil etmek için
için kullanılır. Bir değişken, program kullanıcısından gelen girdileri depolamak, başka bir programdan
dönen değerleri depolamak, sabit değerleri temsil etmek ve benzeri şeyler için kullanılır.
Değişkenler sizin kodunuzu okunabilir ve esnek yapar. Eğer değişken kullanmak yerine değerleri
doğrudan programa yazarsanız, kodunuz yalnız belli bir senaryo için kullanışlı olur. Başka bir senaryo
için değerleri manuel değiştirebilirsiniz ancak bu yorucudur ve büyük bir hata yapma riskine sebep
olur (bir değeri değiştirmeyi unutabileceğiniz varsayımıyla). Diğer taraftan değişkenler, kodumuzun
birçok senaryo için kullanışlı olmasını sağlar ve ihtiyaç duyduklarında kullanıcıların değerleri
değiştirmesine imkân verir.
PythonWin’i açınız ve aşağıdaki satırı yazınız.
>>> x = 2
x değişkenini oluşturdunuz ve 2 değerini atadınız. Java gibi bir programlama dilinde bunun bir
nümerik değişken olduğunu belirtmeniz gerekir ancak Python, 2 değerini gördüğünde bunun bir
nümerik değişken olduğunu varsayar.
Enter’a bastığınızda hiçbir şey olmaz, fakat program bu değişkeni hafızasında tutar. Bunu ispat etmek
için aşağıdaki satırı yazınız.
>>> x + 3
5 değerinin döndüğünü göreceksiniz.
İşlemlerin sonuçlarını yazdırmak için print komutunu da kullanabilirsiniz.
>>>print x + 3
5
Değişkenler alfanümerik karakter dizisi ya da programcılar tarafından adlandırıldığı gibi string’leri de
temsil edebilir. Etkileşimli pencerede aşağıdaki satırları yazınız.
>>>myTeam = "Fenerbahçe"
>>>print myTeam
Fenerbahçe
4
Bu örnekte, çift tırnak işaretleri Python’a bunun bir string değişkeni olduğunu belirtir. Python
string’lerle çalışmak için güçlü bir dildir. String’lerle yapılabilecek işlemlere en basit örnek –aşağıda
olduğu gibi- iki string’i yan yana getirmektir.
>>> string1 = "Burası "
>>> string2 = "Yıldız Teknik Üniversitesi!"
>>> print string1 + string2
Burası Yıldız Teknik Üniversitesi!
Bir sayıyı çift tırnak içinde bir string değişkene değer olarak atayabilirsiniz ancak onu bir sayı olarak
değil, bir string olarak kullanabilirsiniz. Örneğin, aşağıdaki kod hata verecektir.
>>>myValue = "3"
>>>print myValue + 2
Bu örneklerde = işaretinin değişkene değer atamak için kullanıldığını gördünüz. Değişkene yeni
değerler atayabilirsiniz. Örneğin:
>>> x = 5
>>> x = x - 2
>>> print x
3
Değişkenlere isim verirken aşağıdaki ipuçlarına dikkat ediniz.





Değişken isimleri büyük-küçük harf duyarlıdır. myVariable, MyVariable’dan farklı bir
değişkendir.
Değişken isimleri boşluk içermez.
Değişken isimleri bir sayı ile başlamaz.
Python değişkenleri için ilk kelimenin ilk harfinin küçük ve takip eden her kelimenin ilk
harfinin büyük yazılması alışılagelmiş bir uygulamadır. Örneğin: myVariable,
mySecondVariable, roadsTable, bufferField1, vb.
import, print gibi özel Python deyimleri değişkenlere isim olarak verilemez.
Değişkenlere anlamlı isimler verilmelidir. Böylece başkaları da sizin kodunuzu okuduğunda anlayabilir.
Bu ayrıca kodunuzu okuyabilme ve hata yapmama bakımından size de yardımcı olacaktır.
Nesneler ve Nesne-Yönelimli Programlama
Python’da sayı ve karakter değişkenleri ile veri tiplerini ifade etmeye çalıştık. Değikenlerle ayrıca CBS
veri setleri, tablolar, satırlar ve coğrafi işlemci gibi şeyler de temsil edilebilir. Python’da ArcGIS ile
çalışırken kullandığınız bu şeylerin tümü nesnelerdir.
Python’da herşey nesnedir. Tüm nesnelerin;
5



Özel bir ID‘si veya bilgisayar hafızasında bir yeri,
Nesneyi tanımlayan bir dizi özellikleri ve
Nesnenin yapabileceği bir dizi metot ya da şey vardır.
Nesneleri anlamanın bir yolu, bir işlemi izlekli (procedural) bir dil ile (Fortran gibi) yapmak ve aynı
işlemi nesne yönelimli programlama ile yaparak karşılaştırmaktır. Fıstık ezmesi ve reçelli sandviçi
yapan bir program yazacağız.
Eğer programı izlekli bir dille yazarsak programın akışı:
1.
2.
3.
4.
5.
6.
7.
8.
Buzdolabına git, reçel ve ekmeği al.
Dolaba git ve fıstık ezmesini al.
İki dilim ekmek çıkar.
Kavanozu aç.
Bıçağı al.
Bıçağın üstüne bir miktar fıstık ezmesi koy.
vs.
vs.
Eğer programı nesne yönelimli bir dille yazarsak programın akışı:
1.
2.
3.
4.
mySandwich = Sandwich.Make
mySandwich.Bread = Wheat
mySandwich.Add(PeanutButter)
mySandwich.Add(Jelly)
Nesne yönelimli dil örneğinde birçok adım elimine edilmiş oldu. Sandviç nesnesi verilen birkaç parça
bilgi ile kendisini nasıl oluşturacağını bilir. Bu, nesne yönelimli dillerin kapsülleme olarak bilinen
önemli bir özelliğidir.
Sandviçin özelliklerini (ekmek çeşidi gibi) ve sandviçe uygulanan metotları (yerfıstığı ve reçel eklemek
gibi) tanımlayabileceğinize dikkat ediniz.
Sınıflar
Nesne yönelimli dilde “sandviç yapmanın” kolay olmasının nedeni, programcının zaten sandviçi ve
onunla ne yapabileceğini tanımlamak için bir çalışma yapmış olmasıdır. Programcı sınıfları kullanır. Bir
sınıf, nasıl nesne oluşturulacağını, özelliklerini ve nesneye uygun metotları, özelliklerin nasıl
ayarlanacağını (set) ve kullanılacağını ve her bir metodun ne yapacağını belirler.
Bir sınıf, nesneleri oluşturmak için bir plan olarak düşünülebilir. Plan, o sınıftaki bir nesnenin
özelliklerinin ve metotlarının ne olacağını belirler. Bu bir araba fabrikasına benzetilebilir. Bir araba
fabrikası aynı temel plan üzerinden binlerce aynı model araba üretir. Aynı şekilde bir sınıf, özellikleri
ve metotları önceden belirlenmiş nesneler üretir.
Python’da sınıflar modüllerin içinde bir araya toplanmıştır. Hangi nesneler ile çalışacağınızı
programınıza söylemek için modülleri kodunuza dâhil edersiniz. Modülleri kendiniz yazabilirsin, ama
büyük olasılıkla onları diğer yazılım paketlerinden getireceksiniz. Örneğin bu derste yazacağınız birçok
script’in ilk satırı aşağıdaki gibi olacaktır.
6
import arcpy
Burada, script’inize arcpy modülü ile çalışacağınızı söylemek için import anahtar kelimesini
kullanıyorsunuz. Bu modülü dâhil ettikten sonra, script’inizde ArcGIS’i amaç doğrultusunda kullanan
nesneler yaratabilirsiniz.
Bu derste dâhil edebileceğiniz diğer modüller şunlardır: os (işletim sistemi ile çalışmanıza izin verir),
random (rastgele sayılar üretimine olanak sağlar) ve math (ileri seviye matematik işlemleri yapmaya
olanak sağlar). Python’da bu modüller mevcuttur ancak hazır olarak gelmez. Script’inizi
yavaşlatmamanın en iyi yolu sadece gereken modülleri dâhil etmektir. Örneğin, herhangi bir ArcGIS
fonksiyonuna gereksinim duymayan bir script -herhangi bir hataya neden olmasa bile- import
arcpy içermez.
Devralma
Nesne yönelimli dillerin bir başka önemli özelliği devralmadır. Sınıflar hiyerarşik bir ilişki içinde
düzenlenir, öyle ki her sınıf özelliklerini ve yöntemlerini hiyerarşideki bir üst sınıftan (ebeveyn sınıfı
veya süper sınıf) devralır. Bir sınıf, özelliklerini ve yöntemlerini altındaki sınıfa (çocuk sınıfı veya alt
sınıf) da aktarır. Örneğin bizler insan türüne özgü birçok özelliğe sahibiz. Ayrıca, hiyerarşide daha
üstte yer alan sınıflardan birçok özellik devralırız: Omurgalılar olmanın bir sonucu olarak bazı
özelliklere sahibiz; memeliler olmanın bir sonucu olarak bazı özelliklere sahibiz. İnsanların koşma
yeteneğini düşünün. Yalnız insan sınıfına ait olduğumuz için değil, aynı zamanda hiyerarşideki bazı
daha üst sınıflardan devraldığımız için bedenlerimiz koşma komutuna cevap verir.
Programlama konusuna dönecek olursak, bir sınıfın hiyerarşide nerede yer aldığını bilmek önemlidir.
Bu bilgi olmadan, yapabileceğiniz hareketlerin (operations) tümünden haberdar olamazsınız.
Devralma hakkındaki bilgi genellikle nesne model diyagramları adlı bilgilendirme afişlerinde
bulunabilir.
İşte bir örnek: object model diagram for ArcGIS Python scripting at 9.3 (ne yazık ki ArcGIS 10’da afiş
mevcut değil, fakat 9.3 afişi hala bu gibi şeyler için işe yarıyor). Feature Class başlıklı yeşil kutuya göz
atınız ve alt kısmında Dataset Properties yazdığına dikkat ediniz. Bunun sebebi Dataset’in tüm
özelliklerini Feature Class’ın devralmasıdır. Bu nedenle bir Feature Class nesnesi oluşturduğunuzda
bir Dataset nesnesi üzerindeki tüm özellikler (Extent ya da SpatialReference gibi) de elde edilebilir.
Feature Class’ın Dataset’ten devraldığı özelliklerden başka FeatureType ve ShapeType gibi kendine
has özellikleri de vardır.
Python Sözdizimi Kuralları
Her programlama dilinde; büyük harfe çevirme, boşluk, kod ve işlem satırlarının nasıl birbirlerinden
ayrılacağı vb. hakkında kurallar vardır. Python için hatırlanması gereken bazı sözdizimi kuralları
şunlardır:

Python hem değişken isimleri hem de özel amaçlı sözcüklerde büyük-küçük harfe duyarlıdır.
Bu, “kullandığınız harfin büyük ya da küçük olup olmadığı önemlidir” anlamına gelir. Tümü
küçük harflerle yazılı print, Python’da bir değeri yazdıracak özel amaçlı bir sözcüktür. Oysa
“Print”, Python tarafından tanınmaz ve bir hata döndürecektir. Aynı şekilde arcpy büyük-
7




küçük harfe çok duyarlıdır ve eğer bir tool’u ismini büyük harflerle yazmaksızın çalıştırmayı
denerseniz bir hata döndürecektir.
Bir Python ifadesini Enter tuşuna basarak sonlandırırsınız. (Diğer bazı dillerde noktalı virgül
gibi özel bir karakter ifadenin bittiği anlamına gelir.) Kodunuzu mantıksal bölümlere ayırmak
için boş satır ekleyebilirsiniz.
Eğer uzun bir ifadeniz varsa ve okunabilirlik açısından birden fazla satırda yer almasını
isterseniz, bir satır devam karakteri kullanmanız gerekir. Python’da bu karakter ters bölü (\)
işaretidir. Böylece, aşağıdaki satıra yazmaya devam edebilirsiniz ve Python böylesi ardışık
satırları tek bir ifade olarak yorumlayacaktır. Özel bir durum olarak; eğer parantez () ya da
köşeli parantez [] ortasındaysa, Python satırınızın devam ettiğini anlar ve ters bölü (\)
işaretine gerek kalmaz.
Girinti (satırbaşı) Python’da kodun belli satırlarını ya da bloklarını mantıksal olarak gruplamak
için gereklidir. Döngüler (loops), if/then ifadeleri ve try/except ifadeleri içinde dört boşluklu
girinti (satırbaşı) yapmalısınız. Çoğu programlama dili geliştiricileri kod bloklarını mantıksal
olarak gruplamak için girinti kullanmayı teşvik etmektedir; ancak bu, Python’da zaten
zorunludur. Bu gereksinim külfetli görünse de çok iyi okunabilirlikle sonuçlanır.
Satıra bir diyez (#) işareti ile başlayarak kodunuza bir yorum ekleyebilirsiniz. Yorumlar,
kodun ne yaptığını açıkladığınız satırlardır. Yorumlar, komut çalıştırıldığında Python
tarafından görmezden gelinir, bu nedenle onların etkisinden endişelenmeden kodunuzun
herhangi bir yerine ekleyebilirsiniz. Yorumlar, gelecekte sizin kodunuz ile çalışmak zorunda
kalacak kişilere yardımcı olacaktır ve hatta size kodun ne yaptığını hatırlamanız bakımından
yardım edebilir.
Örnek: Bir Feature Class’ın Mekânsal Referans Bilgisini Yazdırma
Bu örnekte coğrafi veri tabanında saklanan bir feature class’ın mekânsal referans bilgilerinin nasıl
yazdırılacağını göreceğiz.
Dikkat edininiz:


Bir yorum satırı ile bu script’te ne olacağı açıklanıyor.
Büyük-küçük harf kuralına dikkat edilmiş. import ve print tamamı küçük harflerle
yazılmış. Modül ismi, ARCPY ya da Arcpy olarak değil, arcpy olarak belirtilmiş. Benzer
şekilde arcpy.Describe ifadesinde Describe’ın ilk harfi büyük yazılmış.
8


Programcının atadığı değişken isimleri (featureClass, desc ve spatialRef) kısa ve
fakat anlaşılır isimlerdir. Değişken isimine bakarak neyi temsil ettiğini hızlı bir şekilde tahmin
edebilirsiniz.
Script, nesneler oluşturuyor ve bu nesneler üzerinde özellikleri ve metotları kullanıyor.
Yeni bir programlama dili öğrenmenin en iyi yolu örnek kodlara bakmak ve pratik yapmaktır. Bu örnekte
feature class bir file geodatabase içindedir; eğer bir shapefile kullanıyorsanız, featureClass’ın
yolunu değiştirmeye ihtiyaç duyacaksınız. (Örneğin, dosya adının sonuna .shp koymak gerekir.)
Alıştırmayı denemek için aşağıdaki işlem adımlarını takip ediniz:
1. PythonWin’i açınız ve File > New‘e tıklayınız.
2. Python script’i seçiniz ve OK‘ye tıklayınız.
3. Yukarıdaki kodu kopyalayıp yapıştırınız ve verinize uygun olacak şekilde düzenleyiniz (uzantıyı
değiştiriniz).
4. Script’inizi bir .py dosyası olarak kaydediniz.
5. Run tuşuna basarak script’i çalıştırınız. Bunu yaparken etkileşimli pencerenin (Interactive
Window) görünür olduğundan emin olunuz, çünkü çıktıyı (mekânsal referans adını) orada
göreceksiniz.
Örnek: Bir Raster Üzerinde Map Algebra Gerçekleştirme
Bu script, raster yükseklik verisindeki kotu 3500 metreden büyük hücreleri bulur ve bu hücreleri 1
olarak kodlayarak yeni bir raster oluşturur. Arta kalan hücreler yeni bir raster’da 0 olarak kodlanır. Bu
tip bir Map Algebra işlemi yer seçimi ve diğer CBS uygulamalarında yaygın olarak kullanılır.
Raster(inRaster) fonksiyonu, raster verisi üzerinde Map Algebra işlemi gerçekleştirebilmeniz
için ArcGIS’in inRaster değişkenini bir raster dataset gibi ele alması gerektiğini söyler. Eğer bunu
yapmasaydınız, script, inRaster’ı bir raster dataset olarak değil, sadece karakterlerden oluşan bir
string gibi ele alacaktı.
Bu script ile ilgili önemli noktalar:
9





Herhangi bir map algebra işlemi yapmadan önce Spatial Analist extansion’ındaki işaretin
kaldırıldığı (Spatial Analist’in devre dışı bırakıldığı) ve işlem tamamladıktan sonra Spatial
Analist extansion’ının tekrar işaretlendiği (Spatial Analist’in devreye sokulduğu) satırlara
dikkat ediniz. Check-out ve Check-in satırları arasına gereksiz kodların yerleştirilmemesi
önerilir. Çünkü Spatial Analist tekrar devreye sokulana kadar –program lisansının ortak olması
durumunda- diğer kullanıcılar Spatial Analist tool’larını kullanamayacaktır.
inRaster, bir string içeren bir değişken olarak başlar, fakat Raster(inRaster)
koşturulduğunda, bir raster nesnesi olarak ele alınır. Bir raster nesnesi, ArcGIS’de raster veri
setleri (datasets) ile çalışmak için kullanılan özel bir nesnesidir. Fakat arcpy modülünü
script’inize dâhil etmediğiniz sürece onu kullanamazsınız.
cutoffElevation, script’inizde daha önceden oluşturduğunuz bir sayı değişkenidir. Bunu
daha sonra outRaster’ınız için oluşturduğunuz map algebra ifadesinde kullanıyorsunuz.
outRaster = Raster(inRaster) > cutoffElevation ifadesi, “inRaster
adresindeki raster hücrelerinin değerini cutoffElevation değişkenine atadığım değer ile
karşılaştır, daha büyük olanları alarak yeni bir raster oluştur ve bunu outRaster olarak
adlandır” anlamına gelmektedir.
outRaster da bir raster nesnesidir, fakat diskte kalıcı olması için outRaster.save()
metodunu çağırmak zorundasınız. save() metodunun tek bir argümanı (kaydetmek
istediğiniz yerin adresi/yolu) vardır.
Şimdi Foxlake sayısal yükseklik modelini (DEM) kullanarak script’inizi çalıştırmayı deneyiniz. Eğer
çalışmazsa aşağıdaki kontrolleri yapınız:





Girdi ve çıktı adresleri doğru.
Adres, single backslash (\) değil, forward slash (/) ya da double backslash (\\) içeriyor.
Spatial Analyst extension’ı kurulu ve kullanıma hazır. Kontrol için, ArcMap i açınız, Customize
> Extensions’a tıklayınız ve Spatial Analyst’in işaretli olup olmadığına bakınız.
ArcMap’te açık herhangi bir veri seti (dataset) yok.
Çıktı verisi henüz mevcut değil. Eğer çıktının üstüne yazdırılabilir olmasını istiyorsanız,
arcpy.env.overwriteOutput = True satırını eklemelisiniz. Bu satır import
arcpy satırından hemen sonra yer almalıdır.
Map algebra ifadesindeki değeri değiştirerek (örneğin, 3000) script’inizi tekrar deneyebilirsiniz.
Örnek: Buffer (Tampon Bölge) Oluşturma
Raster yükseklik verisi üzerinde bazı map algebra fonksiyonları koşturduğunuz bir önceki örneği
düşünün. Eğer cutoffElevation değerini 3500 yerine 2500 olmasını isteseydiniz, script’i açıp
cutoffElevation değişkeninin değerini değiştirmeniz gerekirdi.
Bu üçüncü örnek biraz farklı. Tool için gerekli değerleri doğrudan koda yazmak yerine, değeri kullanıcı
tarafından girilebilecek değişkenler ya da parametreler kullanacağız. Böylece, kodda değişiklik
yapılmaksızın farklı değerlerle script çalıştırılabilecek. Tıpkı ModelBuilder’daki gibi, parametreler
script’inizin daha geniş kitlelere hitap etmesini salar.
10
Buffer tool’unu çalıştıran aşağıdaki örnek, girdi ve çıktı veri setlerinin adreslerinin ve aynı zamanda
buffer mesafesinin kullanıcı tarafından belirlenmesine imkân verir. Bu durum
arcpy.GetParameterAsText() metoduyla sağlanır.
Aşağıdaki örneği dikkatlice inceleyiniz, fakat şimdilik çalıştırmayı denemeyiniz. Bunu ileride
yapacaksınız.
Önemli noktalar şunlardır:



GetParameterAsText(), arcpy modülündeki bir fonksiyondur. Bu fonksiyonun
argüman olarak tam sayı değerler (0, 1, 2, 3, vb.) aldığına dikkat ediniz. Bu script bir tool’a
dönüştürülürken, tool penceresinde gözükmesini istediğiniz parametrelerin sıralamasına göre
bu değerleri atamanız önemlidir.
Buffer aracının yalnız üç parametresine değer atandı. Değer atanmayan diğer parametreler
(SideType, EndType, vd.) ise default değerleri aldı.
Kodun try ve except blokları, bir hata durumunda script’inizin çökmemesini sağlar.
Script’iniz try bloğundaki kodları sırayla icra ederken herhangi bir sebeple devam edemezse,
except bloğuna geçer ve except blogundaki kodu icra eder.
Script’inizi yazarken ve hatalardan ayıklarken, kodunuzun çökmesine izin vermek bazen daha
kullanışlıdır. Çünkü Interactive Window’da göreceğiniz (kırmızı) hata mesajları size daha çok
ipucu verecektir. Except bloğuna "Bir hata ile karşılaşıldı. Lütfen
tekrar deneyiniz." gibi bir mesaj yerleştirdiğinizi varsayalım. Kullanıcı açısından böyle
bir mesaj ile karşılaşmak, (kırmızı) hata mesajı ile karşılaşmaktan iyidir. Fakat hataları
ayıklamak durumunda olan bir programcı için (kırmızı) hata mesajları daha yararlıdır.

arcpy.AddMessage() ve arcpy.AddError() metotları kullanıcıya ilave mesajlar
vermek için kullanılır. Bir tool’u çalıştırdığınızda coğrafi işlemci, “Executed (Buffer)
11
successfully. End time: Sat Oct 03 07:37:31 2009” gibi çeşitli mesajlar verir. İşte bu metotlar
size, kullanıcıya bunların haricinde mesajlar da verebilme imkânı verir.
arcpy.GetMessages() kullanırsanız, tool tarafından oluşturulan tüm mesajları alırsınız.
Bunlar size “parametreler içi yanlış değerler girdiniz” gibi şeyler söyler.
AddError ve AddMessage yöntemleri sadece script tool’ları yaparken kullanılır. Bir
script’i PythonWin’de koştururken örneğin print arcpy.GetMessages() şeklinde
GetMessages() ifadesini kullanarak mesajları alabilirsiniz.
Bir Script Tool Meydana Getirme
Değerlerini GetParameterAsText() ile alabileceğiniz kullanıcı girdi parametreleri script’inizi bir
tool’a dönüştürmenizi kolaylaştırır. Çok az kişi bir Python kodunu açmayı, kullanıcı girdi
değişkenlerine değer atamayı ve çalıştırmayı bilir, fakat hemen her ArcGIS kullanıcısı ArcToolbox’ı
açmayı ve bir tool’u çalıştırmayı bilir. Şimdi yukarıdaki script’i, ArcGIS’de kolayca koşturulabilecek bir
tool’a dönüştüreceğiz.
Bir script tool meydana getirmek için aşağıdaki adımları takip ediniz:
1. Buffer oluşturma örneğindeki kodu yeni bir PythonWin dosyasına kopyalayınız ve
buffer_user_input.py gibi bir isimle kaydediniz.
2. ArcMap’i açınız ve Catalog Window’u görüntüleyiniz.
3. Toolboxes > My Toolboxes üzerinde sağ-tık yapınız ve New > Toolbox’a tıklayınız.
4. Araç kutunuza “MyScriptTools” gibi bir isim veriniz.
5. Yeni araç kutunuz üzerinde sağ-tık yapınız ve Add > Script‘e tıklayınız.
6. Script tool’unuzun Name, Label ve Description özelliklerini aşağıda görüldüğü gibi
doldurunuz:
12
7. Next‘e tıklayınız ve Script File‘ı belirleyiniz. Bunu için klasör simgesine tıklayınız ve
buffer_user_input.py dosyanıza ulaşınız.
8. Next‘e tıklayınız ve açılan arayüzü inceleyiniz. Bu, script’inizin parametrelerini
belirtebileceğiniz yerdir. Parametreler, script’inizde arcpy.GetParameterAsText() ile
değerlerini aldığınız inPath, outPath ve bufferDistance parametreleridir. Bu
arayüzde parametrelerinize anlaşılması kolay isimler vererek script’teki gibi sıralayacaksınız.
9. Display Name sütununda ilk boş hücreye tıklayınız ve “Input Feature Class” yazınız.
10. Data Type sütununda ilk boş hücreye tıklayınız ve Feature Class’ı seçiniz. Bu, bir script tool
meydana getirmenin sayısız avantajlarından biridir. Bu durumda kullanıcı yalnız bir feature
class’ı girdi olarak sunabilecektir.
13
11. Önceki adımda yaptığınız gibi, “Outpot Feature Class” adlı ikinci parametreyi ekleyiniz. Veri
türü yine Feature Class olmalıdır.
12. Output Feature Class parametresi seçili iken Parameter Properties kısmında Direction
özelliğini Output olarak belirleyiniz.
13. “Buffer Distance” adlı üçüncü özelliği ekleyiniz. Veri tipi olarak Linear Unit‘i seçiniz. Böylece
kullanıcı mesafe değerini ve birimleri (örneğin, mil, kilometre, vd.) seçebilecektir.
14. Buffer Distance parametresi seçili iken Parameter Properties kısmında Default özelliğini ”5
Miles” olarak ayarlayınız (tırnak işaretlerini kullanmadan yazınız).
14
15. Finish‘e basınız ve Catalog Window‘da script aracınızı çift tıklayarak açınız.
16. Aracınızı bilgisayarınızdaki herhangi bir feature class ile deneyiniz. Girdi olarak bir feature
class’ı sunduğunuzda, sizin için bir çıktı feature class yolu (path) önerildiğine dikkat ediniz.
Bunun nedeni, Output Feature Class‘ı bir çıktı parametresi olarak ayarlamış olmanızdır.
Ayrıca, tool çalıştıktan ve işlevini yerine getirdikten sonra, kodunuza yazdığınız “All done!”
mesajının sonuç penceresinde yazılı olduğunu göreceksiniz.
15
Asıl Buffer tool’unun arayüzü ile karşılaştırarak bizim script tool’unun daha basit bir arayüze sahip
olduğunu görebilirsiniz.
16
Alıştırmalar
PythonWin’de yeni bir script oluşturmak için File > New‘e (ya da boş sayfa simgesine), script’i
çalıştırmak için de “koşan adam” simgesine tıkladığımızı hatırlayalım.
Alıştırma 1: x adlı bir string değişkeni oluşturunuz ve Merhaba değerini atayınız. x değişkeninin
içeriğini etkileşimli pencerede (Interactive Window) gösteriniz.
Çözüm 1:
x = "Merhaba"
print x
Açıklama 1: Script’in birinci satırı, Python kod yorumlayıcısına “bilgisayarın belleğinde bir değer
tutacak boş bir alan ayarlamasını, bellekteki o boş alanın x adıyla bilinmesini ve o boş alanda
Merhaba yazısının depolanmasını" söylemektedir. Bellek alanı genellikle bir değişken olarak anılır.
Bazı dillerde bir değişkene bir değer atamadan önce o değişkeni bildirmek ve onun alacağı değerin
(verinin) türünü belirtmek zorunludur. Oysa Python’da tanımlanacak değişkenlerin türlerini açıkça
belirtmeye gerek yoktur. Veri türü (string, sayı, vd.), değişkene atayacağınız değerin türüne dayalı
olarak Python kod yorumlayıcısı tarafından belirlenir.
Script’in ikinci satırı, yorumlayıcıya “x’in içeriğini PythonWin Interactive Window’da yazmasını”
söylemektedir.
Bu basit script, aşağıdaki gibi daha da basitleştirilebilir.
print "Merhaba"
Bu script’in import arcpy satırı içermediğine dikkat ediniz. Çünkü bu script herhangi bir ArcGIS
fonksiyonuna gereksinim duymamaktadır.
Alıştırma 2: first adlı bir string değişkeni oluşturunuz ve adınızı atayınız. Benzer biçimde, last
adlı başka bir string değişkeni oluşturunuz ve soyadınızı atayınız. Bu iki string’i aralarında bir boşluk
olacak şekilde yan yana getiriniz.
Çöüm 2:
first = "Türkay"
last = "Gökgöz"
full = first + " " + last
print full
Açıklama 2: Bu script’te ad ve soyadı tutacak iki string değişkeni kullanılıyor. Ad ve soyad, + karakteri
kullanılarak yan yana getiriliyor. Çift tırnak içinde boşluk kullanılarak (" ") ad ve soyad arasında
boşluk bırakılıyor.
Eğer soyadı ve adı birbirinden bir virgül ve boşluk ile ayrılmış biçimde yazdırmak isteseydiniz full
ifadesini aşağıdaki gibi değiştirebilirdiniz.
17
full = last + ", " + first
Alıştırma 3: GetParameterAsText metodunu kullanarak tek bir string değer kabul eden bir script
yazınız. Girilecek değer bir ad olmalı, o adın önüne "Selam, " string’i eklenmeli ve Interactive
Window’da gösterilmelidir. Run düğmesine bastıktan sonra Arguments yazı kutucuğuna tek tırnak (‘)
içinde bir ad girerek script’inizi PythonWin’de test ediniz.
Çözüm 3:
import arcpy
name = arcpy.GetParameterAsText(0)
print "Selam, " + name
Açıklama 3: Önceki iki alıştırmadan farklı olarak bu script, arcpy’ın dâhil edilmesine gereksinim
duymaktadır. arcpy.GetParameterAsText() metodunun tek bir parametresi vardır ve değeri
0 olarak belirlenmiştir.
name değişkenini kullanmadan aşağıdaki gibi yazılarak da sonuç alınabilir.
print "Selam, " + arcpy.GetParameterAsText(0)
Alıştırma 4: Bir Feature Class’ın Mekânsal Referans Bilgisini Yazdırma Örneği’nde Describe
metodunun bir kullanımını gördünüz. Describe metodu, bir dizi özellliğe sahip bir nesne döndürür.
Özellikler, nesnenin türüne bağlı olarak çeşitlilik gösterir. Bir feature class, bir dataset türü
olduğundan dolayı bir spatialReference özelliğine sahiptir.
Yardım dosyasındaki The Describe method sayfası, metodun kullanılabileceği nesne türlerini
göstermektedir. Bu sayfada Dataset’e tıklayarak bağlantılı sayfaya ulaşabilir ve özellikler listesini
görebilirsiniz. spatialReference, bunlardan biridir.
Bu alıştırmada yine Describe metodunu kullanınız ama bu kez bir feature class’ın geometri türünü
(point, polyline veya polygon) belirlemek için. Bu bilgiyi döndürecek özelliğe ilişkin bir ipucu: Feature
class’lar yalnız bir dataset türü değil, aynı zamanda FeatureClass türünde nesneler olduğu için bu
özelliğe sahiptirler.
Çözüm 4:
import arcpy
fc = "C:/Data/USA/USA.gdb/StateBoundaries"
desc = arcpy.Describe(fc)
shapeType = desc.shapeType
print "The geometry type of " + fc + " is " + shapeType
Açıklama 4: Yukarıdaki ipucudan hareketle Describe metodu yardım sayfasında
FeatureClass’a tıklayarak bağlantlı sayfaya gitmiş ve shapeType’ı görene kadar özellikler
18
listesini taramış olmalısınız. Yukarıdaki çözüm; shapeType özelliğini okur, dönen değeri bir
değişkene atar ve daha sonra feature class’ın adını da içeren print mesajına dâhil eder.
19
Download