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