Buat Tools Sendiri Di ArcGIS, Kenapa Tidak !? – Bagian 1

Kegiatan ber “proyek” telah memundurkan postingan-postingan saya di Lintas Bumi beberapa bulan. Anyway dalam perjalanan proyek terkadang saya harus memutar otak untuk mengolah data-data spasial menjadi suatu data baru yang tools nya tidak ada di menu bawaan, di Toolbox ArcGIS misalnya. Saya yakin ada di antara anda yang pernah mengalaminya. Anda yang penggemar ArcGIS tentunya sudah tahu suatu bagian yang namanya ArcToolbox, isinya ratusan tools canggih untuk menganalisis peta dengan berbagai metode, namun walaupun sudah sebegitu bejibunnya tools yang ada di situ, tetap saja ada suatu kondisi di mana tidak ada tools (bawaannya) yang sesuai dengan kasus anda. Yap itu memang manusiawi sih, tidak ada software yang sempurna selalu saja ada kekurangannya.

Saya sendiri sebetulnya tidaklah terlalu faham tentang pemrograman, malah bisa dikatakan blank, tapi itu bukanlah halangan untuk bisa menggunakan script-script seperti python untuk bisa digunakan di ArcGIS. Bermodalkan coba-coba dan trial and error, akhirnya kalau untuk yang sifatnya simpel ternyata bisa, dan memang tidaklah telalu sulit kalau hanya sekedar menggunakan script-script yang sudah ada (thanks kepada siapapun yang rela berbagi script python untuk ArcGIS). So jangan telalu berharap tulisan ini sistematis ya, postingan inipun seperti biasanya adalah berbagi pengalaman, namun mudah-mudahan juga bisa memotivasi siapa saja yang mempunyai kondisi dan permasalahan seputar ArcGIS seperti yang saya alami.

ArcToolbox menurut pengertian dari ESRI adalah tempat utama pada ArcMap di mana anda menemukan, mengelola, dan menjalankan alat geoprocessing. Alat tersebut juga dapat dikelola dan dieksekusi dari ArcCatalog. Jendela ArcToolbox berisi toolbox, yang pada gilirannya berisi tools dan toolset (toolset adalah seperangkat organisasi tools, seperti sistem folder). Tools harus terkandung di dalam toolbox, dan tidak bisa berada di luar toolbox. Dari sisi scripting atau bahasa pemrograman yang dipakai, si ArcToolbox ini pada dasarnya menggunakan bahasa Python, JScript dan VBScript. Jika pengguna ArcMap faham akan pemrograman dengan bahasa itu, maka ArcToolbox mungkin untuk ditambahkan tools lain ke dalamnya hasil modifikasi atau pemrograman sendiri. Inilah yang akan saya bahas kali ini dalam konteks yang sangat-sangat sederhana.

Tampilan ArcToolbox

Kembali ke permasalahan saya di awal bahwa ada kondisi tertentu di mana saya harus menemukan tools di luar bawaan ArcGIS dan menambahkannya ke dalam ArcToolbox. Untuk melakukannya, saya sedikit berkreatifitas, memutar otak untuk menemukannya yaitu lewat mesin pencari di internet. Lalu apa kata kuncinya? Yang jelas harus bahasa inggris. Anda bisa menggunakan kombinasi kata python, arctoolbox, script, dan lainnya serta tentunya kata kunci dari masalah tools atau data spasial yang anda akan cari.

Dalam kasus saya, saya harus mencari tools untuk membuat kotak dari dari titik, atau jelasnya adalah harus membuat buffer berbentuk persegi di mana titik tersebut sebagai titik tengah, kotak yang diinginkan harus bisa ditentukan panjang dan lebarnya. Akhirnya kata kunci yang saya coba-coba masukan di mesin pencari adalah “point to square python arcgis“, dan dari sekian situs yang keluar di hasil pencarian saya merefers ke sini, karena saya anggap scriptnya paling simpel dan sesuai kebutuhan. Berikut ini script nya.

import arcpy
w = 100
h = 50
polygons = []
sr = arcpy.Describe("points").spatialReference
with arcpy.da.SearchCursor("points","SHAPE@",spatial_reference=sr) as cursor:
     for row in cursor:
         polygon = arcpy.Polygon(arcpy.Array([arcpy.Point(row[0].centroid.X - w/2,row[0].centroid.Y + h/2),arcpy.Point(row[0].centroid.X - w/2, row[0].centroid.Y - h/2),arcpy.Point(row[0].centroid.X + w/2,row[0].centroid.Y - h/2),arcpy.Point(row[0].centroid.X + w/2,row[0].centroid.Y + h/2)]),sr)
         polygons.append(polygon)

arcpy.CopyFeatures_management(polygons,r'in_memory\rectangles')

Untuk menjalankan atau memasukan sebuah script python ke dalam ArcToolbox, sebaiknya anda terlebih dahulu harus menjadikan script tersebut sebagai sebuah file python (.py) agar lebih mudah, caranya mudah tinggal copy kan script dimaksud ke notepad atau sejenisnya (dalam kasus ini saya menggunakan Notepad++), lalu simpan sebagai file berekstensi .py, misalnya point_to_square.py. Di sini saya akan membahas cara eksekusinya yaitu pertama langsung di jendela Python dan kedua dijadikan sebagai tools.

Memang untuk membuat tools python dan menjalankannya di ArcGIS, terlebih dulu kita harus memahami beberapa hal mengenai aturan-aturan penggunaan script python (ArcPy) pada tools di ArcToolbox. Hal itu sebetulnya bisa dibaca di menu help ArcGIS atau bisa juga di sini (jangan alergi dengan bahasa inggris dan menu help). Berikut ini beberapa di antaranya yang kontekstual dengan kasus saya dan penggunaan yang umum.

#1. Menentukan parameter, jika anda adalah pengguna setia ArcGIS ketika anda mengaktifkan sebuah tools misalnya Clip, akan muncul menu di mana anda harus menentukan input, clip feature, output dan seterusnya. Kotak-kotak itulah yang disebut dengan parameter. Jika anda berencana membuat sebuah tools dari script yang sudah ada, maka harus menentukan atau membuat parameternya. Untuk penentuan parameter tersebut, anda harus memahami dan jeli mengenai jenis dan tipe data yang biasa digunakan dalam ArcGIS dan tools, anda bisa membacanya di help ArcGIS atau di sini.

Parameter sebuah tools

#2. Perhatikan komponen parameter, perhatikan betul-betul baris per baris script yang anda akan gunakan, cek apa-apa saja parameternya, perhatikan pada script tersebut pada baris-baris mana (nomor berapa) saja hal-hal yang harus ditentukan, misalnya input file, output file, besaran angka yang akan ditentukan, dan seterusnya. Dalam script python yang saya share di atas, setidaknya ada 4 (empat) komponen yang harus dijadikan parameter, antara lain;

Baris  2 dan 3, pada baris tersebut nantinya di tools akan ditentukan berapa w (width / lebar) dan h (height / tinggi).

w = 100
h = 50

Baris ke 5 dan 6, kata “points” merujuk pada file atau feature class (atau shp) berbentuk point yang akan dijadikan sebagai input. Ini pun akan kita tentukan pada tools.

sr = arcpy.Describe("points").spatialReference
with arcpy.da.SearchCursor("points","SHAPE@",spatial_reference=sr) as cursor:

Terakhir adalah baris 10, di mana di bagian akhir yaitu r’in_memory\rectangles’, ‘r’ dalam python dikenal sebagai raw string. Raw string digunakan untuk mencetak string di mana tanda backslash (\) tidak ingin dianggap sebagai karakter khusus (escape), tapi tetap dijadikan sebagai sebuah string (bagian dari penulisan), misal merujuk pada output pada script itu akan di simpan di in_memory\rectangles (akan menjadi memory\rectangle.shp). Semua itu akan diganti atau ditentukan dari tools.

arcpy.CopyFeatures_management(polygons,r'in_memory\rectangles')

Sebetulnya sebuah file .py bisa langsung dijalankan di ArcMap, pastikan semua komponen parameternya telah dimodifikasi sesuai dengan keinginan anda, misalnya seperti script di bawah. Perhatikan bahwa baris ke 2,3,5,6, dan 10 ada beberapa komponen yang disesuaikan dengan kebutuhan saya. Saya simpan file tersebut di c:\Temp dengan nama Pt2Sq.py. Jika anda ingin mencobanya silahkan siapkan sebuah shp atau feature class tipe point dengan proyeksi UTM dan modifikasi baris ke 2,3,5,6, dan 10. Untuk mengeksekusinya langsung, silahkan buka windows (jendela) Python di ArcMap, lalu pada layar yang muncul jalankan perintah execfile().

>>>execfile(‘C:\Temp\Pt2Sq.py’)

import arcpy
w = 100
h = 50
polygons = []
sr = arcpy.Describe("c:\Temp\Petak_Ukur_Tegallega5.shp").spatialReference
with arcpy.da.SearchCursor("c:\Temp\Petak_Ukur_Tegallega5.shp","SHAPE@",spatial_reference=sr) as cursor:
     for row in cursor:
         polygon = arcpy.Polygon(arcpy.Array([arcpy.Point(row[0].centroid.X - w/2,row[0].centroid.Y + h/2),arcpy.Point(row[0].centroid.X - w/2, row[0].centroid.Y - h/2),arcpy.Point(row[0].centroid.X + w/2,row[0].centroid.Y - h/2),arcpy.Point(row[0].centroid.X + w/2,row[0].centroid.Y + h/2)]),sr)
         polygons.append(polygon)
arcpy.CopyFeatures_management(polygons,r'c:\Temp\My_Square')

#3. Memodifikasi script agar siap dijadikan tools beserta dengan parameternya, script di atas harus dimodifikasi lagi. Sebagai parameter adalah keempat hal di atas, maka pada script keempat hal tersebut dijadikan sebagai sebuah variabel terlebih dulu memakai fungsi GetParameterAsText, untuk jelasnya mengenai fungsi GetParameterAsText klik di sini. Lakukan ini (edit) pada notepad. Adapun saya juga merubah urutan parameter agar lebih terstruktur, urutan ditentukan dari nomor di belakang fungsi dimulai dari 0; yaitu di mana input (0), output (1), w / width (2) dan h / height (3). Nama variabel yang saya gunakan sebagai sampel adalah;

infc = arcpy.GetParameterAsText(0).     Parameter input feature class (shp) -> jenis data layer atau feature class — (pengganti “points”)

outfc = arcpy.GetParameterAsText(1).     Parameter output feature class (shp) -> jenis data feature class — (pengganti r’in_memory\rectangles’)

w = int(arcpy.GetParameterAsText(2)).     Parameter ukuran lebar -> jenis data long integer — (pengganti angka 100)

h = int(arcpy.GetParameterAsText(3)).     Parameter ukuran tinggi -> jenis data long integer — (pengganti angka 50)

Untuk w dan h, di depan fungsi didahului oleh int(), yang menandakan bahwa nantinya data string yang dikirim dari tools akan dijadikan data integer. Tanda # adalah komentar dan tidak akan dieksekusi oleh python. Script lengkap hasil modifikasi akhirnya menjadi seperti ini.

import arcpy

#input
infc	= arcpy.GetParameterAsText(0)

#output
outfc	= arcpy.GetParameterAsText(1)

w = int(arcpy.GetParameterAsText(2))	#lebar
h = int(arcpy.GetParameterAsText(3))	#tinggi

polygons = []
sr = arcpy.Describe(infc).spatialReference
with arcpy.da.SearchCursor(infc,"SHAPE@",spatial_reference=sr) as cursor:
     for row in cursor:
         polygon = arcpy.Polygon(arcpy.Array([arcpy.Point(row[0].centroid.X - w/2,row[0].centroid.Y + h/2),arcpy.Point(row[0].centroid.X - w/2, row[0].centroid.Y - h/2),arcpy.Point(row[0].centroid.X + w/2,row[0].centroid.Y - h/2),arcpy.Point(row[0].centroid.X + w/2,row[0].centroid.Y + h/2)]),sr)
         polygons.append(polygon)

arcpy.CopyFeatures_management(polygons,outfc)

Bersambung …..

Bagikan ini:

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *