Xác định các lớp từ nhiều phiên bản Máy chủ ArcGIS bằng API ArcGIS cho JavaScript 2?


14

Điều này áp dụng cho ArcGIS Server 9.3 với API JavaScript 2.4.

Mục tiêu của tôi là nhấp vào bản đồ và chạy nhiệm vụ Xác định trên tất cả các lớp Động hiển thị.

IdentifyTask đòi hỏi một URL đến endpoint REST, với IdentifyParameters quy định cụ thể mà layerIds sự xác định hoạt động phải được thực hiện trên.

Có vẻ như công cụ Xác định đang mong đợi tất cả các lớp có thể truy cập được từ cùng một điểm cuối REST (nghĩa là cùng một Máy chủ ArcGIS).

Trong trường hợp của tôi, các lớp đang được phục vụ từ nhiều phiên bản Máy chủ ArcGIS - làm thế nào công cụ Xác định có thể hỗ trợ việc này? Ví dụ: nếu các lớp Tòa nhà và Bưu kiện trong bản đồ này đến từ các Máy chủ ArcGIS riêng biệt.

(Điều này có liên quan đến câu hỏi trước đây của tôi , nhưng tôi nhận ra bây giờ tôi cần trả lời câu hỏi này trước)


Đã có bất kỳ cập nhật cho các khái niệm này? Tôi đã sử dụng mẫu fiddle được tham chiếu ở trên. Cảm ơn
giai đoạn

@phase theo như tôi biết các khái niệm vẫn giống nhau khi sử dụng ArcGIS Server 10 và API API 2.6, giả sử đó là những gì bạn muốn nói
Stephen Lead

Câu trả lời:


11

Đầu tiên, đây là một ví dụ API JavaScript được đơn giản hóa để hiển thị khái niệm sử dụng DeferredList để xử lý nhiều tác vụ xác định:

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

Sau đây là một ví dụ trong jsFiddle mà tôi nghĩ sẽ làm những gì bạn muốn, chạy bằng cách sử dụng tất cả các lớp có thể nhìn thấy trong tất cả các lớp bản đồ động có thể nhìn thấy trong bản đồ.

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

Tất cả các lỗi chính tả đã được sửa bây giờ :)

Ý tưởng cơ bản là bất cứ khi nào bản đồ được nhấp hoặc hiển thị được bật, nhận dạng sẽ được chạy lại. Khi nhận dạng được chạy, số lượng tác vụ nhận dạng được kích hoạt tùy thuộc vào số lượng lớp hiển thị và nó chờ cho đến khi tất cả các lớp quay lại để hiển thị kết quả của nó.


điều đó rất có ý nghĩa - cảm ơn rất nhiều vì đã đăng mã mẫu
Stephen Lead

2
Có một vài lỗi chính tả trong mã của bạn - điều này thực sự ấn tượng hơn vì nó ám chỉ bạn đã gõ nó từ bộ nhớ và thậm chí không cần chạy nó. Ngả mũ với bạn!
Stephen chì

Vâng, tôi đã chỉ gõ nó ra khỏi đỉnh đầu của tôi :) Hãy cho tôi biết những lỗi chính tả nhỏ là gì và tôi sẽ sửa chúng.
blord-castillo

Thay đổi thành phiên bản làm việc trong jsFiddle. Phiên bản không hoàn hảo hiệu quả; lý tưởng là tôi sẽ lưu kết quả truy vấn của mình và chỉ làm lại phần showResults khi khả năng hiển thị bị thay đổi bởi điểm nhận dạng không bị thay đổi. Nhưng, tôi nghĩ rằng nó cho thấy khái niệm tốt về cách gắn kết khả năng hiển thị cùng với các nhiệm vụ xác định được thực hiện. Ngoài ra, bạn sẽ muốn lưu trữ một mẫu với mỗi lớp để bạn có thể chỉ cần kéo các mẫu ra khỏi các lớp, thay vì sử dụng logic bên trong các hàm javascript như tôi đã làm.
blord-castillo

4

Tác vụ xác định chỉ có thể tham chiếu một dịch vụ bản đồ, vì vậy bạn sẽ phải:

  • Đặt tất cả các lớp bạn muốn chạy Danh tính trong một dịch vụ bản đồ
  • Chạy nhiều xác định nhiệm vụ trên mỗi lần nhấp vào bản đồ

Tôi gặp phải một tình huống tương tự với một ứng dụng mà tôi muốn có thể xác định trên dịch vụ bản đồ DEM và trên dịch vụ bản đồ kết quả mực nước biển từ một nhiệm vụ xử lý địa lý. Tôi đã chọn để chạy hai Nhận dạng. Điều duy nhất bạn thực sự phải thêm là tìm ra khi cả hai nhiệm vụ được thực hiện.

Luồng cơ bản là (đây là sử dụng Silverlight / C #)

  • thiết lập các biến boolean cho DEM và SLR nhận dạngTaskcomplete
  • Chạy IdentifyTask cho DEM
  • đặt bool cho DEMidentifyTaskComplete thành false
  • Chạy IdentifyTask cho máy ảnh DSLR (sử dụng các tham số chung tương tự như đối với DEM)
  • đặt bool cho SLRidentifyTaskComplete thành false
  • Trong DEMIdentifyTask_ExecuteCompleted trình lắng nghe sự kiện, tôi đặt DEMidentifyTaskcomplete thành true và sau đó kiểm tra xem liệu SLRidentifyTaskcomplete có đúng không (thiết lập ngược lại cho SLRIdentifyTask_ExecuteCompleted)
  • Bất kỳ tác vụ nào hoàn thành cuối cùng, cả hai bool đều sẽ đúng và gọi IdentifyT taskComplete sẽ phân tích cả hai kết quả thành một đối tượng đồ họa tùy chỉnh mà tôi thêm vào bản đồ, sau đó đặt slr và demidentiftytaskcomplete thành false

cảm ơn - đó là những gì tôi sợ, nhưng thật tốt khi biết rằng bạn thấy nó khả thi. Nếu trang web này có sẵn, bạn có thể vui lòng cho tôi biết URL không?
Stephen chì

Nó không công khai, và ở Silverlight bên cạnh. Chúc may mắn!
wwnick

+1 cho nhiều nhiệm vụ xác định. Đối với API JavaScript, bạn có thể quản lý chúng bằng dojo.DeferredList (cũng áp dụng cho nhiều truy vấn).
Derek Swingley

1

Tôi đã tạo lại chính kịch bản này với danh sách hoãn lại, nhưng phần khó khăn chỉ xác định trên các lớp có tỷ lệ. Đây là phiên bản 3.2 jsapi http://www.spatialexception.org/posts/arcgis-javascript-identifytask-returns-scale-deperee-layers


@awesomo, bất kỳ cơ hội để xem liên kết trực tiếp đến giải pháp này?
ripsin

Có một biểu tượng tôi nhận dạng ở phía trên bên phải của thanh công cụ mapserver2.vestra.com/demo/smile
awesomo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.