Friday, November 7, 2014

Power Of Phyton Scripting In ArcGIS (Example 2, Phyton As Batch Geoprocessor)

Pekerjaan GIS sebagian besar adalah pekerjaan berulang. Dalam artian, prosesnya selalu berkisar di dalam kerangka sistem (input - proses - output). Pekerjaan perulangan ini sering memakan waktu yang tidak sedikit, terlebih jika melibatkan data dalam jumlah banyak. Oleh karena itu cara - cara untuk mempersingkat pemrosesan selalu dicari oleh banyak pengguna GIS. Alhasil di dalam sebuah software GIS fungsi "batch processing" atau pemrosesan banyak data dalam sekali eksekusi merupakan hal yang esensial. Di dalam ArcGIS, fungsi batch dapat dilakukan setidaknya melalui empat cara. Pertama, batch grid geoprocessor yang dieksekusi dari ArcToolbox, kedua, Model Builder, ketiga, ArcObject Scripting, dan keempat Phyton Scripting.

Dari aspek efisiensi kerja, scripting (ArcObject maupun Phyton) jelas lebih efisien daripada Batching toolbox dan pembuatan model. Alasannya, yang pertama reusable (batch geoprocessor nature-nya tidak reusable, kecuali anda menyimpan log geoprocessing untuk digunakan di session berikutnya). Yang kedua, pembuatannya relatif cepat (model builder, biarpun hanya menggambar model, terkadang memakan waktu dan proses looping/iterasi-nya tidak praktis, untuk melakukan fungsi tertentu perlu dua atau lebih model terpisah,  batch grid geoprocessor pun demikian, harus menyusun tabel, memasukkan input satu demi satu, menentukan output satu demi satu, dll).

Scripting jelas lebih baik karena ada fungsi pemanggilan data di level workspace (folder atau feature dataset) dan tahapan proses bisa dirangkai dalam satu kode (bahkan tanpa harus mengatur scratch workspace seperti di model builder). Saya akan contohkan penggunaan phyton sebagai batch geoprocessor yang simple tapi powerful.

Contoh 1.  Clipping Raster In A Workspace 

Baris kodenya sebagai berikut:


 import arcpy  
 arcpy.env.workspace = "C:/Tutorial/Phyton"  
 desc = arcpy.Describe ("C:/Tutorial/Phyton/Elevasi.tif")  
 rasExtent = desc.extent  
 rasList = arcpy.listRasters()  
 for name in rasList: arcpy.Clip_management(name, str(rasExtent), name + '_potong')  


- baris pertama merupakan kode awal yang berfungsi memanggil module geoprocessing arcgis di phyon
- baris kedua merupakan kode pengaturan direktori kerja dimana data yang akan diproses disimpan
- baris ketiga adalah perintah mendeskripsikan karakteristik dari data tertentu (seperti kita melihat tab source di layer properties)
- baris keempat adalah sebuah variable dengan nama rasExtent yang berisi perintah mengambil informasi extent dari data di path baris ketiga
- baris kelima adalah sebuah variable dengan nama rasList yang berisi perintah untuk memanggil semua data raster di workspace (melalui perintah listrasters)
- baris keenam adalah perintah iterasi/looping/batch processing melalui tag "for" dan "in" untuk memotong data raster di workspace (perintah Clip.management) sesuai dengan variable rasExtent. Syntax"name" merupakan wildcard untuk nama seluruh file di dalam workspace. Syntax"name+'_potong' " merupakan syntax penamaan hasil output proses yang mana nama output ditambahi "_potong" di belakangnya.

Contoh 2. Batch Conversion from JSON to Features (shapefile/geodatabase feature class)


 import arcpy  
 import os  
 arcpy.env.workspace = 'C:/Users/Lenovo/Downloads/Programs'  
 list_json = arcpy.ListFiles()  
 for name in list_json:arcpy.JSONToFeatures_conversion(name, (name+'_convert'))  

- baris pertama dan kedua adalah kode pemanggil module arcgis phyton
- baris ketiga adalah pengaturan direktori data
- baris keempat adalah perintah pemanggila file JSON melalui parameter ListFiles
- baris kelima adalah perintah iterasi/loop untuk mengkonversi seluruh data di workspace ke features, dengan syntax"name" sebagai wildcard.


Dari dua contoh diatas, apa yang bisa kita simpulkan?

Ya, Batch geoprocessing umumnya hanya ada tiga proses, pertama dimana lokasi kumpulan data yang akan diproses, kedua, perintah pemanggilan/listing, dan ketiga perintah iterasi proses/loop melalui parameter "for" dan "in". Parameter "name" merupakan wildcard yang dipakai di dua contoh diatas untuk mewakili nama file.

Jadi simpel bukan? anda bisa coba dan kembangkan kodenya untuk tasks batch geoprocessing yang lain, :D


Useful Links

1. Phyton for ArcGIS (http://resources.arcgis.com/en/help/main/10.2/index.html#/What_is_Python/002z00000001000000/)
2. Tentang listing dataset (http://resources.arcgis.com/en/help/main/10.2/index.html#/ListDatasets/03q30000001z000000/
3)
3. Tentang Phyton geoprocessing syntax (http://resources.arcgis.com/en/help/main/10.2/index.html#/What_is_ArcPy/000v000000v7000000/)