การระบุเลเยอร์จากอินสแตนซ์ของ ArcGIS Server หลายอันโดยใช้ ArcGIS API สำหรับ JavaScript 2


14

สิ่งนี้ใช้กับเซิร์ฟเวอร์ ArcGIS 9.3 ด้วย JavaScript API 2.4

เป้าหมายของฉันคือคลิกบนแผนที่และกำหนดภารกิจให้ทำงานบนเลเยอร์ไดนามิกที่มองเห็นได้ทั้งหมด

IdentifyTaskต้องการ URL ไปยังปลายทาง REST ด้วยIdentifyParameters ที่ระบุว่าlayerIds ใดที่การดำเนินการระบุควรดำเนินการ

ดูเหมือนว่าเครื่องมือระบุจะคาดว่าชั้นทั้งหมดจะสามารถเข้าถึงได้จากจุดปลายทาง REST เดียวกัน (เช่นเซิร์ฟเวอร์ ArcGIS เดียวกัน)

ในกรณีของฉันเลเยอร์จะถูกให้บริการจากอินสแตนซ์ของ ArcGIS Server หลายตัว - เครื่องมือระบุสามารถรองรับสิ่งนี้ได้อย่างไร ตัวอย่างเช่นถ้าเลเยอร์สิ่งปลูกสร้างและพัสดุในแผนที่นี้มาจากเซิร์ฟเวอร์ ArcGIS แยกต่างหาก

(สิ่งนี้เกี่ยวข้องกับคำถามก่อนหน้าของฉันแต่ฉันรู้แล้วว่าตอนนี้ฉันต้องตอบคำถามนี้ก่อน)


มีการอัพเดทแนวคิดเหล่านี้บ้างไหม? ฉันใช้ตัวอย่างซอที่อ้างถึงข้างต้น ขอขอบคุณ
เฟส

@ ขั้นตอนเท่าที่ฉันรู้ว่าแนวคิดยังคงเหมือนเดิมโดยใช้ ArcGIS Server 10 และ JS API 2.6 สมมติว่านั่นคือสิ่งที่คุณหมายถึง
สตีเฟ่นนำ

คำตอบ:


11

อันดับแรกนี่คือตัวอย่าง JavaScript API ที่เรียบง่ายเพื่อแสดงแนวคิดของการใช้ DeferredList เพื่อประมวลผลงานที่ระบุหลายอย่าง:

//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
}

จากนั้นนี่คือตัวอย่างใน jsFiddle ที่ฉันคิดว่าทำในสิ่งที่คุณต้องการเรียกใช้เลเยอร์ที่มองเห็นได้ทั้งหมดในเลเยอร์แผนที่แบบไดนามิกที่มองเห็นได้ทั้งหมดในแผนที่

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

พิมพ์ผิดทั้งหมดได้รับการแก้ไขแล้วตอนนี้ :)

แนวคิดพื้นฐานคือเมื่อใดก็ตามที่มีการคลิกแผนที่หรือเปิดใช้งานการมองเห็นการระบุจะรันใหม่อีกครั้ง เมื่อรันการระบุจำนวนงานเอกลักษณ์ที่ใช้จะขึ้นอยู่กับจำนวนเลเยอร์ที่มองเห็นและรอจนกระทั่งเลเยอร์ทั้งหมดกลับไปแสดงผลลัพธ์


ที่เหมาะสมมาก - ขอบคุณมากสำหรับการโพสต์โค้ดตัวอย่าง
Stephen Lead

2
มีตัวพิมพ์เล็ก ๆ สองสามตัวในรหัสของคุณซึ่งจริงๆแล้วน่าประทับใจมากกว่าเพราะมันบ่งบอกว่าคุณพิมพ์สิ่งนี้จากหน่วยความจำและไม่จำเป็นต้องเรียกใช้ หมวกออกไปกับคุณ!
สตีเฟ่นนำ

ใช่ฉันเพิ่งพิมพ์ออกมาจากหัวของฉัน :) ให้ฉันรู้ว่าสิ่งที่พิมพ์ผิดเล็กน้อยและฉันจะแก้ไขพวกเขา
blord-castillo

เปลี่ยนเป็นเวอร์ชั่นใช้งานได้ใน jsFiddle รุ่นนี้ไม่มีประสิทธิภาพสมบูรณ์แบบ นึกคิดฉันจะบันทึกผลการค้นหาของฉันและเพิ่งทำซ้ำส่วน showResults เมื่อการมองเห็นถูกสลับโดยการระบุจุดจะไม่เปลี่ยนแปลง แต่ฉันคิดว่ามันแสดงให้เห็นแนวความคิดที่ดีของวิธีการผูกการมองเห็นสลับกับงานระบุดำเนินการ นอกจากนี้คุณต้องการเก็บเทมเพลตกับแต่ละเลเยอร์เพื่อให้คุณสามารถดึงเทมเพลตออกจากเลเยอร์แทนที่จะใช้ตรรกะภายในฟังก์ชันจาวาสคริปต์อย่างที่ฉันทำ
blord-castillo

4

ภารกิจการระบุสามารถอ้างอิงบริการแผนที่เดียวได้เท่านั้นดังนั้นคุณจะต้อง:

  • ใส่เลเยอร์ทั้งหมดที่คุณต้องการรัน Identity ไว้ในบริการแผนที่เดียว
  • เรียกใช้ IdentifyTasks หลาย ๆ อันต่อการคลิกแผนที่

ฉันพบสถานการณ์ที่คล้ายกันกับแอพที่ฉันต้องการระบุบริการแผนที่ DEM และบริการแผนที่ผลลัพธ์ที่เพิ่มขึ้นจากระดับน้ำทะเลจากงานด้านกระบวนการทางภูมิศาสตร์ ฉันเลือกที่จะรัน IdentifyTasks สองรายการ สิ่งเดียวที่คุณต้องเพิ่มคือการคิดออกเมื่องานทั้งสองเสร็จสิ้น

การไหลพื้นฐานคือ (นี่คือการใช้ Silverlight / C #)

  • การตั้งค่าตัวแปรบูลีนสำหรับ DEM และ SLR identTaskcomplete
  • เรียกใช้ IdentifyTask สำหรับ DEM
  • ตั้งค่าบูลสำหรับ DEMidentifyTaskComplete เป็น false
  • เรียกใช้ IdentifyTask สำหรับ SLR (ใช้พารามิเตอร์ทั่วไปเช่นเดียวกับ DEM)
  • ตั้งค่าบูลสำหรับ SLRidentifyTaskComplete เป็น false
  • ใน DEMIdentifyTask_ExecuteCompleted ตัวฟังเหตุการณ์ฉันตั้งค่า DEMidentifyTaskcomplete เป็น true แล้วตรวจสอบว่า SLRidentifyTaskcomplete เป็นจริงหรือไม่ (ตั้งค่าตรงกันข้ามกับ SLRIdentifyTask_ExecuteCompleted)
  • งานใดที่เสร็จสิ้นล่าสุดทั้งสองคนจะเป็นจริงและโทร IdentifyTasksComplete ซึ่งแยกผลลัพธ์ทั้งสองเป็นวัตถุกราฟิกที่กำหนดเองซึ่งฉันเพิ่มลงในแผนที่จากนั้นตั้งค่า slr และ demidentiftytaskcomplete ให้เป็นเท็จ

ขอบคุณ - นั่นคือสิ่งที่ฉันกลัว แต่เป็นเรื่องดีที่ได้ยินว่าคุณพบว่าใช้งานได้ หากไซต์นี้พร้อมใช้งานคุณช่วยบอกให้ฉันรู้ URL ได้ไหม?
Stephen Lead

มันไม่ได้เป็นแบบสาธารณะและอยู่ใน Silverlight ด้วย โชคดี!
wwnick

+1 สำหรับงานที่ระบุหลาย ๆ สำหรับ JavaScript API คุณสามารถจัดการได้ด้วย dojo.DeferredList (ใช้ได้กับหลาย queryTasks)
Derek Swingley

1

ฉันสร้างสถานการณ์จำลองนี้ขึ้นอีกครั้งโดยมีรายการรอการตัดบัญชี แต่ส่วนที่ซับซ้อนนั้นมีการระบุเฉพาะในเลเยอร์ที่อยู่ในสเกลเท่านั้น สำหรับรุ่น 3.2 jsapi http://www.spatialexception.org/posts/arcgis-javascript-identifytask-returns-scale-dอิสรภาพ-layers


@awesomo มีโอกาสเห็นลิงค์สดไปยังโซลูชันนี้ไหม?
ripsin

มีไอคอนระบุ i ที่ด้านบนขวาของแถบเครื่องมือmapserver2.vestra.com/demo/smile
awesomo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.