Mengidentifikasi lapisan dari beberapa instance ArcGIS Server menggunakan ArcGIS API untuk JavaScript 2?

14

Ini berlaku untuk ArcGIS Server 9.3 dengan JavaScript API 2.4.

Tujuan saya adalah mengklik pada peta dan menjalankan tugas Identifikasi pada semua lapisan Dinamis yang terlihat.

IdentifyTask memerlukan URL ke titik akhir REST, dengan IdentifyParameters menentukan layerIds tempat operasi identifikasi harus dilakukan.

Tampaknya alat Identify mengharapkan semua lapisan dapat diakses dari titik akhir REST yang sama (yaitu, ArcGIS Server yang sama).

Dalam kasus saya, lapisan dilayani dari beberapa instance ArcGIS Server - bagaimana alat Identifikasi dapat mendukung ini? Misalnya, jika lapisan Bangunan dan Paket di peta ini berasal dari Server ArcGIS yang terpisah.

(Ini terkait dengan pertanyaan saya sebelumnya , tetapi saya sadar sekarang saya harus menjawab pertanyaan ini terlebih dahulu)

Stephen Lead
sumber
Apakah ada pembaruan untuk konsep-konsep ini? Saya telah menggunakan sampel biola yang dirujuk di atas. Terima kasih
fase
@phase sejauh yang saya tahu konsepnya masih sama menggunakan ArcGIS Server 10 dan JS API 2.6, dengan asumsi itulah yang Anda maksud
Stephen Lead

Jawaban:

11

Pertama, berikut adalah contoh API JavaScript yang disederhanakan untuk menunjukkan konsep menggunakan DeferredList untuk memproses beberapa tugas identifikasi:

//Assume that map is your map object
var idTask1, idTask2, idParams = new esri.tasks.IdentifyParameters();
var url1 = "<server1 url>", var url2 = "<server2 url>";
dojo.connect(map, "onLoad", initIdentifies);
function initIdentifies(map) { //map.onLoad passes in the map object
    idTask1 = new esri.tasks.IdentifyTask(url1);
    idTask2 = new esri.tasks.IdentifyTask(url2);
    //A few sample constant parameters. Set more or less as you need
    idParams.tolerance = 12;
    idParams.returnGeometry = true;
    idParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL;
    dojo.connect(map, "onClick", runIdentifies);
}
function runIdentifies(evt) {
    var defTask1 = new dojo.Deferred(), defTask2 = new dojo.Deferred;
    var dlTasks = new dojo.DeferredList([defTask1, defTask2]);
    dlTasks.then(showResults); //defTasks will fire after defTask1 and defTask2 have completed
    //These parameters change with each request
    idParams.width = map.width;
    idParams.height = map.height;
    idParams.geometry = evt.mapPoint;
    idParams.mapExtent = map.extent;
    try {
        idTask1.execute(idParams, defTask1.callback, defTask1.errback); //Pass the response into the callback on defTask1
    } catch (e) {
        console.log("Error caught");
        console.log(e);
        defTask1.errback(e); //If you get an error, execute the errback
    }
    try {
        idTask2.execute(idParams, defTask2.callback, defTask2.errback); //Pass the response into the callback on defTask2
    } catch (e) {
        console.log("Error caught");
        console.log(e);
        defTask2.errback(e); //If you get an error, execute the errback
    }
}
function showResults(r) {
    //The format of 'r' is [[Boolean task 1 success, [task 1 results]],[Boolean task 2 success, [task 2 results]]]
    //using the array 'r', build and show your infoWindow as normal
}

Maka di sini adalah contoh di jsFiddle yang menurut saya melakukan apa yang Anda inginkan, berjalan menggunakan semua lapisan yang terlihat di semua lapisan peta dinamis yang terlihat di peta.

http://jsfiddle.net/blordcastillo/mULcz/

Semua kesalahan ketik sudah diperbaiki sekarang :)

Ide dasarnya adalah bahwa setiap kali peta diklik atau visibilitas diaktifkan, identifikasinya dijalankan kembali. Ketika identifikasi dijalankan, jumlah tugas identitas yang dipecat tergantung pada jumlah lapisan yang terlihat, dan menunggu hingga semua lapisan kembali untuk menampilkan hasilnya.

tuan-castillo
sumber
itu masuk akal - terima kasih banyak untuk memposting kode sampel
Stephen Lead
2
Ada beberapa kesalahan ketik kecil dalam kode Anda - yang sebenarnya lebih mengesankan karena menyiratkan Anda mengetik ini dari memori dan bahkan tidak perlu menjalankannya. Angkat topi untukmu!
Stephen Lead
Ya, saya baru saja mengetikkannya di atas kepala saya :) Biarkan saya tahu apa kesalahan ketik kecil dan saya akan memperbaikinya.
blord-castillo
Diubah ke versi yang berfungsi di jsFiddle. Versi ini tidak sepenuhnya efisien; idealnya saya akan menyimpan hasil permintaan saya dan hanya mengulangi bagian showResults ketika visibilitas diaktifkan oleh titik identifikasi tidak berubah. Tapi, saya pikir itu menunjukkan konsep dengan baik tentang bagaimana mengikat visibilitas dengan beralih bersama dengan tugas mengidentifikasi dieksekusi. Juga, Anda ingin menyimpan template dengan setiap layer sehingga Anda bisa menarik template dari layer, daripada menggunakan logika di dalam fungsi javascript seperti yang saya lakukan.
blord-castillo
4

Tugas identifikasi hanya dapat merujuk satu layanan peta, jadi Anda harus:

  • Letakkan semua lapisan yang ingin Anda jalankan Identity di dalam satu layanan peta
  • Jalankan beberapa IdentifyTasks per klik peta

Saya mengalami situasi yang sama dengan aplikasi di mana saya ingin dapat mengidentifikasi pada layanan peta DEM, dan pada layanan peta hasil kenaikan permukaan laut dari tugas geoprocessing. Saya memilih untuk menjalankan dua IdentifyTasks. Satu-satunya hal yang benar-benar harus Anda tambahkan adalah mencari tahu ketika kedua tugas selesai.

Aliran dasarnya adalah (ini menggunakan Silverlight / C #)

  • setup variabel boolean untuk DEM dan SLR identitaskaskelengkap
  • Jalankan IdentifyTask untuk DEM
  • atur bool untuk DEMidentifyTaskComplete menjadi false
  • Jalankan IdentifyTask untuk SLR (menggunakan parameter umum yang sama seperti untuk DEM)
  • atur bool untuk SLRidentifyTaskComplete menjadi false
  • Di DEMIdentifyTask_ExecuteCompleted pendengar acara, saya menetapkan DEMidentifyTaskcomplete menjadi true dan kemudian memeriksa untuk melihat apakah SLRidentifyTaskcomplete benar (mengatur sebaliknya untuk SLRIdentifyTask_ExecuteCompleted)
  • Tugas apa pun yang selesai terakhir, kedua bools akan menjadi benar, dan memanggil IdentifyTasksComplete yang mem-parsing kedua hasil menjadi objek grafis khusus yang saya tambahkan ke peta, lalu atur slr dan demidentiftytaskomplet ke false
Wickick
sumber
terima kasih - itulah yang saya takuti, tetapi senang mendengar bahwa Anda menganggapnya bisa diterapkan. Jika situs ini tersedia, bisakah Anda memberi tahu saya URL?
Stephen Lead
Itu tidak umum, dan ada di Silverlight selain itu. Semoga berhasil!
wwnick
+1 untuk beberapa tugas identifikasi. Untuk JavaScript API, Anda dapat mengelolanya dengan dojo.DeferredList (juga berlaku untuk beberapa queryTasks).
Derek Swingley