ArcGIS API for JavaScript 2を使用して、複数のArcGIS Serverインスタンスからレイヤーを識別しますか?


14

これは、JavaScript API 2.4を備えたArcGIS Server 9.3に適用されます。

私の目標は、マップをクリックして、表示されているすべてのダイナミックレイヤーで識別タスクを実行することです。

IdentifyTaskはで、RESTエンドポイントにURLを必要IdentifyParametersがどの指定layerIds特定の操作がで実行する必要があります。

識別ツールは、すべてのレイヤーが同じRESTエンドポイント(つまり、同じArcGIS Server)からアクセス可能であることを期待しているようです。

私の場合、レイヤーは複数のArcGIS Serverインスタンスから提供されています-識別ツールはこれをどのようにサポートできますか?たとえば、このマップの BuildingsレイヤーとParcelsレイヤーが別々のArcGIS Serverからのものである場合。

(これは以前の質問に関連していますが、この質問に最初に答える必要があることに気付きました)


これらの概念の更新はありましたか?上記のフィドルサンプルを使用しています。ありがとう
フェーズ

@phase限り、私は概念がまだあなたが何を意味するかというのを想定して、ArcGISのサーバ10とJSのAPI 2.6を使用して同じです知っている
スティーブン・鉛

回答:


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タスクの数は、表示されるレイヤーの数に依存し、すべてのレイヤーが戻って結果を表示するまで待機します。


サンプルコードを掲示するために多くの感謝-それは多くの意味を作る
スティーブン・鉛

2
あなたのコードには小さなタイプミスがいくつかあります-これは実際にはメモリからこれを入力し、実行する必要さえないことを意味するため、より印象的です。あなたに帽子をかぶる!
スティーブンリード

はい、私はちょうど私の頭の上でそれをタイプしました:)マイナーなタイプミスが何であるか私に知らせて、私はそれらを修正します。
blord-castillo

jsFiddleで作業バージョンに変更されました。バージョンは完全に効率的ではありません。理想的には、クエリ結果を保存し、識別ポイントが変更されないことで可視性が切り替えられたときにshowResultsセクションをやり直します。しかし、可視性と実行されるタスクの識別を切り替える方法の概念をよく示していると思います。また、各レイヤーにテンプレートを保存して、私がやったようにjavascript関数内のロジックを使用するのではなく、レイヤーからテンプレートをプルするだけで済みます。
blord-castillo

4

識別タスクは1つのマップサービスしか参照できないため、次のいずれかを行う必要があります。

  • Identityを実行するすべてのレイヤーを1つのマップサービスに配置します
  • マップクリックごとに複数のIdentifyTasksを実行します

DEMマップサービスと、ジオプロセシングタスクの海面上昇結果マップサービスで識別できるようにしたいアプリで、同様の状況に遭遇しました。2つのIdentifyTasksを実行することにしました。本当に追加する必要があるのは、両方のタスクがいつ完了したかを把握することだけです。

基本的なフローは(これはSilverlight / C#を使用していた)

  • DEMおよびSLRの識別ブール値のセットアップ
  • DEMのIdentifyTaskを実行します
  • DEMidentifyTaskCompleteのブール値をfalseに設定します
  • SLRに対してIdentifyTaskを実行します(DEMと同じ一般的なパラメーターを使用)
  • SLRidentifyTaskCompleteのブール値をfalseに設定します
  • DEMIdentifyTask_ExecuteCompletedイベントリスナーで、DEMidentifyTaskcompleteをtrueに設定し、SLRidentifyTaskcompleteがtrueであるかどうかを確認します(SLRIdentifyTask_ExecuteCompletedの反対の設定)
  • どちらのタスクが最後に終了したとしても、両方のブール値がtrueになり、IdentifyTasksCompleteを呼び出して、両方の結果を解析してカスタムグラフィックオブジェクトをマップに追加し、slrとdemidentiftytaskcompleteをfalseに設定します

ありがとう-それは私が恐れていたものですが、あなたがそれが実行可能であると聞いたのは良いことです。このサイトが利用可能な場合、URLを教えてください。
スティーブンリード

これはパブリックではなく、Silverlightにもあります。幸運を!
wwnick

複数の識別タスクの場合は+1。JavaScript APIの場合、dojo.DeferredListでそれらを管理できます(複数のqueryTasksにも適用されます)。
デレクスウィングレー

1

遅延リストでこのシナリオを再現しましたが、トリッキーな部分は、スケールのあるレイヤーでのみ識別することでした。これは、バージョン3.2 jsapi http://www.spatialexception.org/posts/arcgis-javascript-identifytask-returns-scale-dependent-layers用です


@awesomo、このソリューションへのライブリンクが表示される可能性はありますか?
リプシン14年

ツールバーの右上にi識別アイコンがありますmapserver2.vestra.com/demo/smile
awesomo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.