RESTエンドポイントをナビゲートし、フィールド情報をプログラムで取得する方法


9

ダイナミックマップサービスをArcGIS Server JavaScript APIマップに追加しています。クエリを実行できるように、各コンポーネントレイヤーとそのフィールドを取得する必要があります。

http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/operations/MapServerにあるサンプルのArcGIS Serverサービスディレクトリを参照してください。

このURLをブラウザーで開くと、使用可能なレイヤー(0、1、2)と各レイヤーのフィールドのリストが表示されます

JavaScript関数内でプログラムによってフィールドのリストを取得するにはどうすればよいですか?以下のコードスニペットは、レイヤーのエンドポイントを取得する方法を示していますが、フィールドに到達する方法がわかりません。

(1つのオプションは、レイヤーをフィーチャレイヤーとして追加することですが、可能であればこれを避けたいです)。

var url = "http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/operations/MapServer/";
var dynLayer = new esri.layers.ArcGISDynamicMapServiceLayer(url);
map.addLayer(dynLayer);

dojo.connect(dynLayer, "onLoad", function() {
   var infos = dynLayer.layerInfos;
   for (var i = 0; i <= infos.length - 1; i++) {
       var layerId = infos[i].id;
       var restEndPoint = url + layerId;
       //restEndPoint is the layer's URL - how can I retrieve its fields?
   }
});

おかげで、スティーブ(ArcGIS Serverフォーラムにクロス投稿)

回答:


6

esri.request()を使用して各レイヤーのRESTエンドポイントにアクセスし、フィールドに関する情報を取得します。以下に簡単な例を示します。

<html>
  <head>
    <script type="text/javascript">var djConfig = {parseOnLoad: true};</script>
    <script type="text/javascript" src="http://serverapi.arcgisonline.com/jsapi/arcgis/?v=2.4"></script>
    <script type="text/javascript">
      dojo.require("esri.map");
      // var service_url = 'http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Hurricanes/NOAA_Tracks_1851_2007/MapServer/layers';
      var service_url = 'http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Fire/Sheep/MapServer/layers';

      function init() {
        esri.request({
          url: service_url,
          content: { f: 'json' },
          callbackParamName: 'callback',
          load: processServiceInfo,
          error: errorHandler
        });
      }
      // Runs once
      function processServiceInfo(info) {
        console.log('svc info: ', info);
        dojo.byId('info').innerHTML = '';
        dojo.forEach(info.layers, function(lyr) {

          // Add a new div for each Layer
          var lyr_div = dojo.create('div', { 
            id: 'layer_' + lyr.id,
            innerHTML: '<strong>Layer: ' + lyr.name + '</strong><br />'
          }, dojo.byId('info'));

          dojo.forEach(lyr.fields, function(field) {
            lyr_div.innerHTML += 'Name: ' + field.name + '; Alias: ' + field.alias + '<br />';
          });
        });
      }

      function errorHandler(err) {
        console.log('error: ', err);
      }

      dojo.ready(init);
    </script>
  </head>
  <body>
    <div id="info">field names and aliases will show up here.</div>
  </body>
</html>

そのコードはv2.0のAPIを使用しますが、同じことが2.3または2.4でも機能します。私は最初にEsri JS APIフォーラムに投稿しました。

編集: サービスのすべてのレイヤーを処理するように更新されました。また、コードはAPIのバージョン2.4を使用します。


+1よさそうです。ただし、ユーザーには3つのレイヤーがあるため、レイヤーごとにinitでFieldsInit関数を呼び出す方が便利な場合があります。
カークカイケンダル2011

esri.requestを使用する方法ですが、個々のレイヤーをクエリする代わりに、http://..../MapServer/layers?f = jsonをURLとして使用して、一度にすべてのレイヤーをクエリするだけです。
Sasa Ivetic、2011

あなた全員の間で、私は素晴らしい答えがあると思います:) @Derek Sasaの提案に従ってすべてのレイヤーを処理するようにコードを編集できますか?みんなありがとう
スティーブンリード

スティーブ、マップサービスのすべてのレイヤーの情報を提供するようにコードサンプルを更新しました。
Derek Swingley、2011

ありがとう。JSONの結果をグローバル変数にロードして、いつでもアクセスできるようにして、マップで使用できるレイヤーとフィールドを判別します。鮮やかさ。
スティーブンリード

0

ここでスティックの終わりが間違っている可能性がありますが、問題のレイヤーでクエリを実行して結果を結果セットとして取得しませんか?jsonでそれを要求した場合、結果を解析できますか?

だからこれのために:

http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer/1/query?where=STATE_NAME%3D%27Florida%27&f=json

戻りは次のとおりです。

{"displayFieldName": "STATE_NAME"、 "fieldAliases":{"STATE_NAME": "STATE_NAME"}、 "geometryType": "esriGeometryPolygon"、 "spatialReference":{"wkid":4326}、 "fields":[{" name ":" STATE_NAME "、" type ":" esriFieldTypeString "、" alias ":" STATE_NAME "、" length ":25}]、" features ":[{" attributes ":{" STATE_NAME ":"フロリダ "} 、 "geometry":{"rings":[[[-80.785662408630856,28.785194039580265]、... [-80.5878197219821,24.956376399079556]、[-80.249453677873134,25.354937642313288]]]}}]}}

(読みやすくするために、ほとんどのジオメトリを削除しました)


レイヤー1をクエリする方法、およびSTATE_NAMEというフィールドがあることをどのようにして知りましたか?これは、オンザフライで計算しようとしているものです(つまり、事前に知っているものではなく、実行時にすべての残りのエンドポイントで機能するためにこれが必要です)。ありがとう
スティーブンリード

最も簡単な答えは、マップサービスのレイヤーと他の各マップサービスのレイヤーをカウントし、それらをループしてデータを要求することです。クエリはnullにすることができるため、すべてを元に戻すことができます。その後、データをリストした応答をループできます。
毛深い

したがって、上記の例では、各restEndPointに基づいてQueryTaskを設定し、ジオメトリを返さないクエリを作成します-良い考えです。試してみます-ありがとう!
スティーブンリード

それが私がそれに取り組む方法です
毛深い

これを試してください:レイヤーのURLのURL / YOURLAYERNAME / MapServer / layers?f = json-これは、すべてのレイヤーとそのフィールドのjson描写、または必要なレイヤー番号を示すURL / YOURLAYERNAME / MapServer / 1?f = jsonを返します
毛深い
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.