Como navegar nos pontos de extremidade REST e recuperar informações de campo programaticamente

9

Estou adicionando um Serviço de Mapa Dinâmico a um mapa da API JavaScript do ArcGIS Server e preciso me apossar de cada camada de componente e seus campos, para que eu possa executar uma consulta.

Veja o diretório de serviços do ArcGIS Server de amostra em http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/operations/MapServer

Se você abrir esse URL em um navegador, poderá ver a lista de camadas disponíveis (0,1,2) e os campos de cada camada .

Como posso recuperar a lista de campos programaticamente, em uma função JavaScript? O trecho de código abaixo mostra como recuperar os pontos finais da camada, mas não consigo ver como chegar aos campos.

(Uma opção é adicionar as camadas como Camadas de recursos, mas prefiro evitar isso, se possível).

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?
   }
});

Obrigado, Steve (postado no fórum do ArcGIS Server )

Stephen Lead
fonte

Respostas:

6

Use esri.request () para acessar o terminal REST de cada camada para obter informações sobre os campos. Aqui está um exemplo simples:

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

Esse código usa a v2.0 da API, mas a mesma coisa funcionará em 2.3 ou 2.4. Eu originalmente publicado no fórum Esri JS API .

Editar: atualizado para lidar com todas as camadas em um serviço. O código agora também usa a versão 2.4 da API.

Derek Swingley
fonte
+1 Parece bom. Porém, como o usuário possui 3 camadas, talvez ter a chamada init de uma função FieldsInit para cada camada possa ser mais útil.
precisa saber é o seguinte
esri.request é o caminho a seguir, mas em vez de consultar camadas individuais, basta consultá-las todas de uma vez usando http: //..../MapServer/layers? f = json como a URL.
Sasa Ivetic
Entre todos vocês, acho que temos uma ótima resposta :) @Derek, você pode editar o código para lidar com todas as camadas de acordo com a sugestão de Sasa, e vou marcá-lo como aceito? Obrigado a todos
Stephen Lead
Lá está Steve ... atualizei meu exemplo de código para fornecer informações para todas as camadas em um serviço de mapa.
Derek Swingley
Obrigado. Estou carregando o resultado JSON em uma variável global que posso acessar a qualquer momento, para determinar as camadas e os campos disponíveis no mapa. Brilhante.
Stephen chumbo
0

Talvez eu esteja com o lado errado do stick aqui, mas você não realiza uma consulta na camada em questão e obtém os resultados novamente como um conjunto de resultados? Se você solicitar em json, poderá analisar os resultados?

Então, para isso:

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

O retorno é:

{"displayFieldName": "STATE_NAME", "fieldAliases": {"STATE_NAME": "STATE_NAME"}, "geometryType": "esriGeometryPolygon", "spatialReference": {"wkid": 4326}, "fields": [{" nome ":" STATE_NAME "," tipo ":" esriFieldTypeString "," alias ":" STATE_NAME "," comprimento ": 25}]," features ": [{" attribute ": {" STATE_NAME ":" Florida "} , "geometry": {"rings": [[[- 80.785662408630856,28.785194039580265]], ... [-80.5878197219821,24.956376399079556], [- 80.249453677873134,25.354937642313288]]]}}]]

(Removi a maior parte da geometria para facilitar a leitura)

Peludo
fonte
como você sabia consultar a camada 1 e que havia um campo chamado STATE_NAME? É isso que estou tentando resolver on-the-fly (ou seja, eu preciso que isso funcione para QUALQUER terminal de descanso em tempo de execução, não um que eu conheça antes). Obrigado
Stephen Lead
bem, a resposta mais simples seria contar as camadas no serviço de mapa, e um ao outro serviço de mapa, e percorrê-las solicitando os dados. Uma consulta pode ser apenas nula, então você traz tudo de volta. Em seguida, você pode percorrer a resposta listando os dados.
Hairy
portanto, no meu exemplo acima, eu definiria um QueryTask com base em cada restEndPoint e criaria uma consulta que não retornaria geometria - boa ideia. Vou tentar - obrigado!
Stephen Lead
É assim que eu iria abordá-lo
Hairy
Tente o seguinte: URL para URL da camada / YOURLAYERNAME / MapServer / layers? F = json - Isso deve retornar uma representação json de todas as suas camadas e seus campos ou URL / YOURLAYERNAME / MapServer / 1? F = json, indicando o número da camada que você deseja
Cabeludo