Arcgispro’da Python ile toolbox II
Herkesek Merhaba,
Bu blog yazısında ilk önce birden fazla veriyi append yapan ve ardından bu verilerden aldığımız değerlere göre boş fieldları dolduracağımız bir tool yapacağız.
Kullandığımız veriler Tkgm üzerinden parsel sorgudan dxf olarak indirirdi. Normalde persel sorgudan shp ve geojson olarak da indirebiliyoruz ama kullanacağımız veriler her zaman cbs uyumlu olmaz. Hatta piyasada çoğu zaman veriler cad formayında gelir. Arcmapte cad verilerini okuyabilmek için cadreader adında bir eklenti kuruyorduk. Arcgisproda bua gerek yok. Dwg ve dxf formatındaki verileri direk okuyabiliyoruz ama maalesef ncz formatındaki verileri okuyamıyoruz.
Projemizde yeni notebook’u açtıktan sonra ilk olarak ihtiyacımız olan kütüphaneleri import ediyoruz.
import arcpy
import osArdından ihtiyacımız olan değişkenleri tanımlıyoruz.
fc=r"D:\Medium\Arcpy\toolbox2\toolbox2.gdb\Parsel"
cad_data=r"D:\Medium\Arcpy\toolbox2\Cad_data"Buradaki fc append edeceğimiz feature class , cad_data değişkenindesinde ise cad verilerinin bulunduğu klasörün dizini bulunmakta. Şimdi os.listdir komutu ile bu verilerin ilk önce isimlerini alalım ve projeyi adım adım geliştirelim.
for cad in os.listdir(cad_data):
print(cad)
tkgm-parsel-sorgu-sonuc-511-ada-1-parsel.dxf
tkgm-parsel-sorgu-sonuc-512-ada-1-parsel.dxf
tkgm-parsel-sorgu-sonuc-512-ada-2-parsel.dxfBir önceki görsele dikkatli bakarsanız arcgis dxf verisini farklı parçalara bölerek okumaktadır. Parsel verisi alan olduğu için Polygon olan parçayı alacağız. Dizin karşılığı ise aşağıdaki gibidir.
D:\Medium\Arcpy\toolbox2\Cad_data\tkgm-parsel-sorgu-sonuc-512-ada-3-parsel.dxf\PolygonBu formatta veriyi alabilmek için os kütüphanesinden path.join komutunu kullanıyoruz.
for cad in os.listdir(cad_data):
cad_pol=os.path.join(cad_data,cad,"Polygon")
print(cad_pol)
D:\Medium\Arcpy\toolbox2\Cad_data\tkgm-parsel-sorgu-sonuc-511-ada-1-parsel.dxf\Polygon
D:\Medium\Arcpy\toolbox2\Cad_data\tkgm-parsel-sorgu-sonuc-512-ada-1-parsel.dxf\Polygon
D:\Medium\Arcpy\toolbox2\Cad_data\tkgm-parsel-sorgu-sonuc-512-ada-2-parsel.dxf\PolygonŞimdi append fonksiyonunu kullanabiliriz.
for cad in os.listdir(cad_data):
cad_pol=os.path.join(cad_data,cad,"Polygon")
arcpy.Append_management(inputs=cad_pol
,target=fc
,schema_type="NO_TEST")Append fonksiyonundaki parametreler aşağıdaki gibidir.
- inputs: Ekleyeceğimiz veriler. Burada son değişken cad_pol olarak giriyoruz.
- target: Append yapacağımız fc.
- schema_type: Append edeceğimiz veriler ile fc arasındaki fieldlerin eşleşip eşleşme zorunluluğunun belirlendiği parametre. Bu parametre boş bırakılırsa varsayılan olarak eşleşme zorunluluğu olduğunu anlamına gelir. Biz burada “NO_TEST” diyeceğiz böylece herhangi bir eşleşme zorunluğu olmayacak.
Komutu çalıştırdığızda aşağıdaki gibi verileri tek tek ekleyeceğiniz göreceksiniz.
Append işlemi tamamladı yalnız bir eksik var oda append yaptıktan sonra parsel katmanında Ada ve Parsel fieldlarının boş olması.
Bunu düzeltmek için append sırasında cad verierinde bulunan DocName field’ını geçici olarak Ada field’ı ile eşleyeceğiz ardından bu field’a göre Ada ve Parsel verilerini dolduracağız.
Append sırasında fieldları eşlemek için field_mapping oluşturacağız. Oluşturma aşamaları satır satır gösterip son olarak bu kodların güncel yerlerini göstereceğim.
Get ozan uzun’s stories in your inbox
Join Medium for free to get updates from this writer.
İlk olarak boş bir field mapping tanımlayacağız. (Bu komut döngü dışında olacak.)
t_maps=arcpy.FieldMappings()Ardından hedef fc’yi(Parsel) bu field mapping’e ekliyoruz. (Bu komut döngü dışında olacak.)
t_maps.addTable(fc)Sırada bu filed mapping’ten ada field’ını çekmemiz gerekiyor. Bunun için field’ın index’ini bilmemiz gerekiyor. fc’ımız ufak olduğu için index direk 0 olduğunu biliyoruz. fazla field’ın bulunduğu fcler için findFieldMapIndex komutunu kullanabilirsiniz.(Aşağıdaki komut döngü içerisinde kullanılacak.)
ada_f=t_maps.getFieldMap(0)Ardından Son değişkene ekleyeceğimiz verinin field’ını ekliyoruz.(Bu komut döngü içerisinde kullanılacak.)
ada_f.addInputField(cad_pol,"DocName")Ve son olarak bu field’ı ada field ile değiştireceğiz ve yine index kullanacağız.(Bu komut döngü içerisinde kullanılacak.)
t_maps.replaceFieldMap(0,ada_f)Tüm bu eklentileri tamamladığımızda döngümüz aşağıdaki gibi olacaktır.
t_maps=arcpy.FieldMappings()
t_maps.addTable(fc)
for cad in os.listdir(cad_data):
cad_pol=os.path.join(cad_data,cad,"Polygon")
ada_f=t_maps.getFieldMap(0)
ada_f.addInputField(cad_pol,"DocName")
t_maps.replaceFieldMap(0,ada_f)
arcpy.Append_management(inputs=cad_pol
,target=fc
,schema_type="NO_TEST"
,field_mapping=t_maps)Komutun son halini çalıştırdığımızda veriler aşağıdaki gibi olacaktır.
Şimdi UpdateCursor kullanarak ada filed’ında ihtiyacımız olan verileri alıp ada ve parsel field’larını dolduracağız. Aşağıdaki komutta ilk parametre işlem yapacağımı fc’yi (Parsel) giriyoruz. İkinci parametre olarak işlem yapacağımız field’ları liste olarak giriyoruz.
with arcpy.da.UpdateCursor(fc,("ADA","PARSEL")) as rows:
for row in rows:
print(row[0])
tkgm-parsel-sorgu-sonuc-511-ada-1-parsel.dxf
tkgm-parsel-sorgu-sonuc-512-ada-1-parsel.dxf
tkgm-parsel-sorgu-sonuc-512-ada-2-parsel.dxfprinttin içerisinde row[0] direk ADA field’ına denk geliyor çünkü ikinci parametredeki ilk field ADA olduğu için index’i 0 oluyor. Şimdi bu verileri split komutu ile “-” göre bir liste yapalım ver içerinden ada ve parsel bilgilerini alalım.
with arcpy.da.UpdateCursor(fc,("ADA","PARSEL")) as rows:
for row in rows:
ada_no=row[0].split("-")[4]
parsel_no=row[0].split("-")[6]
print("Ada no: "+ada_no)
print("Parsel no: "+parsel_no)
Ada no: 511
Parsel no: 1
Ada no: 512
Parsel no: 1
Ada no: 512
Parsel no: 2
Ada no: 512
Parsel no: 3
Ada no: 512
Parsel no: 4
Ada no: 513
Parsel no: 1
Ada no: 513şimdi ada ve parsel değişkenlerini fieldlara göre güncelleyelim.
with arcpy.da.UpdateCursor(fc,("ADA","PARSEL")) as rows:
for row in rows:
ada_no=row[0].split("-")[4]
parsel_no=row[0].split("-")[6]
row[0]=ada_no
row[1]=parsel_no
rows.updateRow(row)Şimdi notebook’umuzu export edip tool içerisine yerleştirebiliriz. Bu işlemler bir önceki blok yazısında detaylı ir şekilde anlatılmıştı. Bu yüzden bu aşamaları bu yazıda atlıyorum. Yalnız parametre tanımlamada diğerlerine göre ufak bir fark var ona kısaca bakalım.
Burada datatype kısmı folder olacak. Çünkü kod içerisinde verilerin klasörünün içerisinden çekiyoruz. Scripti’i tool’un içerisine nasıl ekleneceği ve parametreleri nasıl oluşturulacağını bir önceki makale üzerinden bakabilirsiniz.







