JavaScript 2 용 ArcGIS API를 사용하여 여러 ArcGIS Server 인스턴스에서 레이어를 식별합니까?


14

이는 JavaScript API 2.4가 포함 된 ArcGIS Server 9.3에 적용됩니다.

내 목표는지도를 클릭하고 식별 작업이 보이는 모든 동적 레이어에서 실행되도록하는 것입니다.

식별 작업에는 식별 작업을 수행 할 layerId를 지정하는 식별 매개 변수와 함께 REST 엔드 포인트에 대한 URL이 필요합니다 .

식별 도구가 동일한 REST 엔드 포인트 (즉, 동일한 ArcGIS 서버)에서 모든 레이어에 액세스 할 수있을 것으로 예상합니다.

필자의 경우 여러 ArcGIS Server 인스턴스에서 레이어를 제공하고 있습니다. 식별 도구가이를 어떻게 지원할 수 있습니까? 예를 들어이 의 건물 및 구획 레이어가 별도의 ArcGIS Server에서 온 경우입니다.

(이것은 내 이전 질문 과 관련이 있지만 지금이 질문에 먼저 대답해야한다는 것을 알고 있습니다)


이러한 개념에 대한 업데이트가 있습니까? 위에서 언급 한 바이올린 샘플을 사용하고 있습니다. 감사합니다

내가 아는 한 @phase는 개념이 ArcGIS Server 10과 JS API 2.6을 사용하더라도 여전히 동일하다는 것을 알고 있습니다.
Stephen Lead

답변:


11

먼저 DeferredList를 사용하여 여러 식별 작업을 처리하는 개념을 보여주는 간단한 JavaScript API 예제가 있습니다.

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

모든 오타가 수정되었습니다 :)

기본 아이디어는 맵을 클릭하거나 가시성을 전환 할 때마다 식별이 다시 실행된다는 것입니다. 식별이 실행될 때 실행되는 ID 작업 수는 표시되는 레이어 수에 따라 달라지며 모든 레이어가 결과를 표시하기 위해 돌아올 때까지 기다립니다.


샘플 코드를 게시 해 주셔서 감사합니다
Stephen Lead

2
코드에는 몇 가지 작은 오타가 있습니다. 실제로 메모리에서 입력 했으므로 실행할 필요가 없기 때문에 실제로 더 인상적입니다. 당신에게 모자!
Stephen Lead

그렇습니다, 나는 단지 머리 위로 그것을 타이핑했습니다 :) 사소한 오타가 무엇인지 알려 주면 고칠 것입니다.
blord-castillo

jsFiddle에서 작동하는 버전으로 변경되었습니다. 이 버전은 완벽하게 효율적이지 않습니다. 이상적으로는 쿼리 결과를 저장하고 식별 지점에 의해 가시성이 전환되지 않은 경우 showResults 섹션을 다시 실행합니다. 그러나 가시성 토글을 실행하는 식별 작업과 함께 묶는 방법에 대한 개념을 잘 보여줍니다. 또한 각 레이어와 함께 템플릿을 저장하여 자바 스크립트 함수 내부에서 논리를 사용하지 않고 템플릿을 레이어에서 가져옵니다.
blord-castillo

4

식별 작업은 하나의 맵 서비스 만 참조 할 수 있으므로 다음 중 하나를 수행해야합니다.

  • 하나의 맵 서비스에서 Identity를 실행하려는 모든 레이어를 배치하십시오.
  • 맵 클릭당 여러 식별 작업 실행

DEM 맵 서비스와 지오 프로세싱 작업의 해수면 상승 결과 맵 서비스에서 식별 할 수있는 앱과 비슷한 상황에 처했습니다. 두 개의 식별 작업을 실행하기로 결정했습니다. 실제로 추가해야 할 것은 두 작업이 모두 완료된 시점을 파악하는 것입니다.

기본 흐름은 (Silverlight / C #을 사용하는 것입니다)

  • DEM 및 SLR 식별 부울 변수 설정
  • DEM에 대해 식별 작업 실행
  • DEMidentifyTaskComplete에 대한 bool을 false로 설정하십시오.
  • SLR에 대해 식별 작업 실행 (DEM과 동일한 일반 매개 변수 사용)
  • SLRidentifyTaskComplete에 대한 bool을 false로 설정
  • DEMIdentifyTask_ExecuteCompleted 이벤트 리스너에서 DEMidentifyTaskcomplete를 true로 설정 한 다음 SLRidentifyTaskcomplete가 true인지 확인합니다 (SLRIdentifyTask_ExecuteCompleted와 반대로 설정).
  • 마지막으로 완료된 작업이 무엇이든, 두 bool은 모두 true이며, 두 가지 결과를 모두 맵에 추가하는 사용자 정의 그래픽 객체로 구문 분석 한 다음 slr 및 demidentiftytaskcomplete를 false로 설정하는 DescribeTasksComplete를 호출합니다.

고마워-그게 내가 두려워하는 것이지만, 그것이 가능하다는 것을 알게되는 것이 좋습니다. 이 사이트가 사용 가능한 경우 URL을 알려주십시오.
Stephen Lead

그것은 공개적이지 않으며 Silverlight에 있습니다. 행운을 빕니다!
wwnick

여러 식별 작업의 경우 +1 JavaScript API의 경우 dojo.DeferredList로 관리 할 수 ​​있습니다 (여러 queryTask에도 적용됨).
Derek Swingley

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.