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.