Come navigare negli endpoint REST e recuperare le informazioni sul campo in modo programmatico


9

Sto aggiungendo un servizio di mappa dinamica a una mappa dell'API JavaScript del server ArcGIS e devo acquisire ogni livello di componente e i relativi campi, in modo da poter eseguire una query.

Vedi la directory dei servizi del server ArcGIS di esempio su http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/operations/MapServer

Se si apre questo URL in un browser, è possibile visualizzare l'elenco dei livelli disponibili (0,1,2) e i campi di ciascun livello .

Come posso recuperare l'elenco dei campi a livello di codice, all'interno di una funzione JavaScript? Lo snippet di codice seguente mostra come recuperare gli endpoint del livello, ma non riesco a vedere come accedere ai campi.

(Un'opzione è quella di aggiungere i livelli come Feature Feature, ma preferirei evitarlo, se possibile).

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

Grazie, Steve (postato sul forum ArcGIS Server )

Risposte:


6

Utilizzare esri.request () per colpire l'endpoint REST di ogni livello per ottenere informazioni sui campi. Ecco un semplice esempio:

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

Quel codice utilizza v2.0 dell'API ma la stessa cosa funzionerà con 2.3 o 2.4. Originariamente ho pubblicato nel forum API di Esri JS .

Modifica: aggiornato per gestire tutti i livelli in un servizio. Il codice ora utilizza anche la versione 2.4 dell'API.


+1 sembra buono. Dal momento che l'utente ha 3 livelli, forse avere init chiama una funzione FieldsInit per ogni livello potrebbe essere più utile.
Kirk Kuykendall,

esri.request è la strada da percorrere, ma invece di interrogare i singoli livelli, basta interrogarli tutti in una volta usando http: //..../MapServer/layers? f = json come URL.
Sasa Ivetic,

Tra tutti voi, penso che abbiamo un'ottima risposta :) @Derek puoi modificare il codice per gestire tutti i livelli secondo il suggerimento di Sasa, e lo segnerò come accettato? Grazie a tutti
Stephen Lead,

Ecco a te Steve ... ho aggiornato il mio esempio di codice per fornire informazioni per tutti i livelli in un servizio di mappe.
Derek Swingley,

Grazie. Sto caricando il risultato JSON in una variabile globale a cui posso quindi accedere in qualsiasi momento, per determinare i livelli e i campi disponibili nella mappa. Brillante.
Stephen Lead,

0

Potrei avere la parte sbagliata dello stick qui, ma non esegui semplicemente una query sul layer in questione e ottieni i risultati come set di risultati? Se lo chiedi in json, puoi analizzare i risultati?

Quindi per questo:

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

Il ritorno è:

{ "DisplayFieldName": "STATE_NAME", "fieldAliases": { "STATE_NAME": "STATE_NAME"}, "GeometryType": "esriGeometryPolygon", "spatialReference": { "wkid": 4326}, "campi": [{" name ":" STATE_NAME", "type": "esriFieldTypeString", "alias": "STATE_NAME", "lunghezza": 25}], "caratteristiche": [{ "attributi": { "STATE_NAME": "Florida"} , "geometria": {"anelli": [[[- 80.785662408630856,28.785194039580265], ... [-80.5878197219821,24.956376399079556], [- 80.249453677873134,25.354937642313288]]]}}]

(Ho rimosso la maggior parte della geometria per facilitare la lettura)


come hai saputo interrogare il livello 1 e che esisteva un campo chiamato STATE_NAME? Questo è ciò che sto cercando di elaborare al volo (cioè, ho bisogno che funzioni per QUALSIASI endpoint di riposo in fase di esecuzione, non uno che conosco in anticipo). Grazie
Stephen Lead,

beh, la risposta più semplice sarebbe quella di contare i livelli nel servizio di mappe e ogni altro servizio di mappe e scorrere attraverso di essi richiedendo i dati. Una query può essere semplicemente nulla, quindi puoi riportare tutto indietro. È quindi possibile scorrere in sequenza la risposta che elenca i dati.
Peloso

quindi nel mio esempio sopra, imposterei un QueryTask basato su ogni restEndPoint e creerei una query che non restituiva geometria - buona idea. Ci proverò - grazie!
Stephen Lead,

È così che mi avvicinerei
Peloso

Prova questo: Url per layer URL / YOURLAYERNAME / MapServer / layer? F = json - Questo dovrebbe restituire una rappresentazione json di tutti i tuoi layer e dei loro campi o URL / YOURLAYERNAME / MapServer / 1? F = json che indica il numero di layer desiderato
Peloso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.