Cómo navegar por los puntos finales REST y recuperar información de campo mediante programación

9

Estoy agregando un servicio de mapas dinámicos a un mapa de API de JavaScript de ArcGIS Server, y necesito obtener cada capa de componente y sus campos, para poder ejecutar una consulta.

Consulte el directorio de servicios de ejemplo de ArcGIS Server en http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/operations/MapServer

Si abre esta URL en un navegador, puede ver la lista de capas disponibles (0,1,2) y los campos de cada capa .

¿Cómo puedo recuperar la lista de campos mediante programación, dentro de una función de JavaScript? El fragmento de código a continuación muestra cómo recuperar los puntos finales de la capa, pero no puedo ver cómo llegar a los campos.

(Una opción es agregar las capas como Capas de entidades, pero preferiría evitar esto si es posible).

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

Gracias, Steve (publicado en el foro de ArcGIS Server )

Stephen Lead
fuente

Respuestas:

6

Use esri.request () para alcanzar el punto final REST de cada capa para obtener información sobre los campos. Aquí hay un ejemplo simple:

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

Ese código usa v2.0 de la API pero lo mismo funcionará en 2.3 o 2.4. Originalmente publiqué en el foro de Esri JS API .

Editar: actualizado para manejar todas las capas en un servicio. El código ahora también usa la versión 2.4 de la API.

Derek Swingley
fuente
+1 Se ve bien. Sin embargo, dado que el usuario tiene 3 capas, quizás tener una llamada init a la función FieldsInit para cada capa podría ser más útil.
Kirk Kuykendall
esri.request es el camino a seguir, pero en lugar de consultar capas individuales, simplemente consulte todas a la vez utilizando http: //..../MapServer/layers? f = json como la URL.
Sasa Ivetic
Entre todos ustedes, creo que tenemos una gran respuesta :) @Derek, ¿pueden editar el código para manejar todas las capas según la sugerencia de Sasa, y lo marcaré como aceptado? Gracias a todos
Stephen Lead
Ahí va Steve ... actualicé mi muestra de código para proporcionar información para todas las capas en un servicio de mapas.
Derek Swingley
Gracias. Estoy cargando el resultado JSON en una variable global a la que puedo acceder en cualquier momento para determinar las capas y los campos disponibles en el mapa. Brillante.
Stephen Lead
0

Puede que tenga el extremo incorrecto del palo aquí, pero ¿no solo realiza una consulta en la capa en cuestión y obtiene los resultados como un conjunto de resultados? Si lo solicita en json, ¿puede analizar los resultados?

Entonces para esto:

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

El regreso es:

{"displayFieldName": "STATE_NAME", "fieldAliases": {"STATE_NAME": "STATE_NAME"}, "geometryType": "esriGeometryPolygon", "spaceialReference": {"wkid": 4326}, "fields": [[{" nombre ":" STATE_NAME "," type ":" esriFieldTypeString "," alias ":" STATE_NAME "," length ": 25}]," features ": [{" atributos ": {" STATE_NAME ":" Florida "} , "geometry": {"rings": [[[- - 80.785662408630856,28.785194039580265], ... [-80.5878197219821,24.956376399079556], [- 80.249453677873134,25.354937642313288]]]}}}

(He eliminado la mayor parte de la geometría para facilitar la lectura)

Peludo
fuente
¿cómo sabías consultar la capa 1 y que había un campo llamado STATE_NAME? Eso es lo que estoy tratando de resolver sobre la marcha (es decir, necesito que esto funcione para CUALQUIER punto final de descanso en tiempo de ejecución, no uno que conozca de antemano). Gracias
Stephen Lead
bueno, la respuesta más simple sería contar las capas en el servicio de mapas, y cada servicio de mapas, y recorrerlas solicitando los datos. Una consulta puede ser nula, por lo que puede recuperar todo. Luego puede recorrer la respuesta que enumera los datos.
Peludo
así que en mi ejemplo anterior, establecería una QueryTask basada en cada restEndPoint, y construiría una consulta que no devolviera la geometría, buena idea. Lo intentaré, ¡gracias!
Stephen Lead
Así es como lo
abordaría
Pruebe esto: URL a capa URL / YOURLAYERNAME / MapServer / layers? F = json - Esto debería devolver una representación json de todas sus capas y sus campos o URL / YOURLAYERNAME / MapServer / 1? F = json indicando el número de capa que desea
Peludo