Arcgis Server Domain Query

17 Oca

Arcgis ile oluşturulan Geodatabase üzerinde tanımlanan attribute domain yani kod listeleri arcgis server üzerinden yayınlanmaktadır.

Tanımlanan attribute domain’ler feature class üzerindeki alanlara eklenebilmektedir. Örneğin tablodaki land_type alanına yukarıdaki LandValue tipi atanabilmektedir. Kullanıcılar ekranda “Residential” değerini görürken değer olarak “Res” kullanırlar. Bu yöntem web ortamındaki combobox ile benzer özelliktedir.

Tanımlanan kod listelerine arcgis server yayınları üzerinden erişmek mümkündür. Yayınlanan FeatureServer veya MapServer aresindeki queryDomains adresi sorgulamak için gerekli arayüzü sağlar.

Aşağıdaki örnekte örnek arcgis server adresinden bir kesit sunulmuştur.

https://sampleserver6.arcgisonline.com/arcgis/rest/services/Water_Network/FeatureServer/queryDomains?layers=16&f=html

"domains": [
  {
   "type": "codedValue",
   "name": "piPipeMaterial",
   "description": "Pipe material types based on NASSCO standards",
   "codedValues": [
    {
     "name": "ABS Plastic",
     "code": "ABS"
    },
    {
     "name": "Asbestos Cement",
     "code": "AC"
    }],
   "fieldType": "esriFieldTypeString",
   "mergePolicy": "esriMPTDefaultValue",
   "splitPolicy": "esriSPTDefaultValue"
  }

Liste çok uzun olduğu için bir kısmı alınmıştır.

Elde edilen bu kod listesini web veya desktop uygulamalarda kullanmak mümkündür. Bu şekilde alan tipinden policy tiplerine kadar bütün bilgileri edinebiliyoruz.

Javascript Callaback Hell Nedir?

16 Oca

Programlama dünyasında asenkron yani eş zamansız olarak tabir edilen fonksiyonlar, yürütülen diğer fonksiyonlara paralel olarak çalışırlar.

Neden asenkron?

Asenkron işlemler, kod içerisinde çalıştırılan bir fonksiyonun ne kadar zaman alınacağı veya ne zaman tamamlanacağı bilinmediği durumlarda tercih edilirler. Örneğin aşağıdaki işlemlerin ne kadar süreceği bilinemez;

  • API’den talepte bulunmak.
  • Dosya okuma ve yazma işlemleri.
  • Veritabanında işlem yapmak.
  • Email göndermek.

Asenkron fonksiyonlar “sen diğer işlemlere devam et, benim işim bittiğinde ben sana haber ederim” yönteminde çalışırlar. Asenkron fonksiyonlar bize haber etmek için callback diye adlandırılan fonksiyonları kullanılırlar.

setTimeout() örneği

Javascript programlamada asenkron işlemlere örnek olabilecek en basit fonksiyon setTimeout() fonksiyonudur. setTimeout(callback, miliseconds) fonksiyonu iki parametre alır. Parametrelerden biri işlem bittiğinde çalıştırılacak olan callback fonksiyonu, diğeri ne kadar bekleneceğidir. Belirlenen süre kadar bekledikten sonra, parametre olarak aldığı fonksiyonu çalıştırır.

function notify() {
  console.log("Notification!");
}

setTimeout(notify, 3000);

Örnekte, 3 saniye bekledikten sonra callback olarak belirlenen notify() fonksiyonu çalıştırılır.

Asenkron fonksiyonlar çağrıldığında, hemen ardından çalıştırılan kod asenkron fonksiyonun bitmesini beklemek zorunda değildir.

function notify() {
  console.log("Notification!");
}

setTimeout(notify, 3000);
console.log("Merhaba!");

Yukardaki örnekte sırayla;

  • Önce setTimeout() süreci başlatılır.
  • Konsola “Merhaba!” yazılır.
  • 3 saniye dolduktan sonra konsola “Notification!” yazılır.

Callback hell

Callback hell(cehennem) kavramı, callback fonksiyonlar içerisinde tekrar asenkron fonksiyonların ardı ardına çağırılmasıyla oluşan karışık ortama verilen isimdir.

İşlemler dizisi şu şekilde olsun:

  • Ayarlar dosyasını oku ve API url bilgisini al.
  • API url talebi gönder ve iş listesini al.
  • Listedeki iş listesini başka bir API’ye Post olarak gönder
fs.read("settings.json", function(error, result){
    http.get(result.toDoUrl, function(toDoResponse){
        toDoResponse.todos.forEach(item=> { 
             http.post(result.customerToDoUrl, item, 
                function(response){
                 console.log(response);
             })
        }); 
    }
})

İşlem adımı ne kadar fazlaysa iç içe geçen işlemler dizisi o kadar uzun olacaktır.

Javascript programlama dilinde callback hell’den kurtulabilmek ya da daha düzenli hale getirebilmek için Promise yöntemi uygulanmaya başlandı. Ancak bu sefer de promise hell oluşmaya başladı.

Bu sorunlardan bizi kurtaran modern javascript kavramı async/await olmuştur.

async/await

Yukarıdaki işlemi async/await ile aşağıdaki şekilde de kullanabiliriz.

const settings = await fs.read("settings.json");
const todoResponse = await http.get(result.toDoUrl);

todoResponse.todos.forEach(item => { 
     const response = await http.post(result.customerToDoUrl, item);
     console.log(response);
})

ArcGIS Subtype Kullanılan FeatureClass üzerinde Domain Kullanımı

7 Oca

ArcGIS platformunda oluşturulan coğrafi veri tabanları (geodatabase) üzerinde attribute domain’ler oluşturarak veri tabanındaki bütün FeatureClass’lar üzerinde kullanabilirsiniz. Attribute domain’ler FeatureClass üzerinde tanımlanan filed veri tipi ile uyumlu olmalıdır. Çünkü her attribute domain bir veri tipine sahiptir. Bu veri tipleri:

  • Short
  • Long
  • Float
  • Double
  • Text

Örnek bir attribute domain aşağıdaki gibi tanımlanabilir.

Burada “su_tipi” adında bir attribute domain oluşturulmuştur. Aldığı değerler ise code ve description alanlarına doldurulmuştur.

Hazırlanan attribute domain, bir feature class içerisindeki field üzerine aşağıdaki şekilde eklenip defalut değeri seçilebilir.

Artık siz içmesuyu ana hat çizimi yaparken su tipleri otomatik olarak “Arıtılmış” değerlerini almış olacaktır.

Dikkat

Ancak, eğer tanımladığınız feature class(şekilde içmesuyu ana hattı) üzerinde oluşturduğunuz bir subtype varsa attribute domain değerleri otomatik olarak gelmeyebilir. Bu durumda Arcgis Pro üzerinde attribute domain neden çalışmıyor diye düşünebilirsiniz. Ancak Arcgis Pro üzerinde subtype oluşturulduğunda her type için farklı attribute domain özelliği tanımlayabilme yeteneği getirilmiştir. Bu nedenle siz her bir subtype için değerleri yeniden belirlemek durumunda kalabilirsiniz. Eğer tanımlamazsanız çizim yaparken attribute değerleriniz null olarak gelebilir.

Yukarıdaki içmesuyu ana hat feature class üzerinde “*hat_tipi” field biraz daha koyu renkle ve “*” ile işaretlenmiştir. Bunun nedeni, hat_tipi alanında bir subtype tanımlanmış olmasıdır. Bu durumda her bir subtype üzerinde attribute domain tanımlamalarını tekrar gözden geçirmek durumunda kaldım. Eğer attribute domain tanımlamanızı, subtype oluşturduktan sonra yaptıysanız bu ayarları mutlaka kontrol etmelisiniz.

Subtype ekranında her bir su_tipi alanının belirlenmiş olduğunuzda artık bir sorun ile karşılaşmazsınız.