Jak nawigować po punktach końcowych REST i programowo pobierać informacje o polu

9

Dodam usługę dynamicznej mapy do mapy ArcGIS Server JavaScript API i muszę zdobyć każdą warstwę komponentu i jej pola, aby móc uruchomić zapytanie.

Zobacz przykładowy katalog usług ArcGIS Server pod adresem http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/operations/MapServer

Jeśli otworzysz ten adres URL w przeglądarce, zobaczysz listę dostępnych warstw (0,1,2) i pola każdej warstwy .

Jak mogę programowo pobrać listę pól w ramach funkcji JavaScript? Poniższy fragment kodu pokazuje, jak pobrać punkty końcowe warstwy, ale nie widzę, jak dostać się do pól.

(Jedną z opcji jest dodanie warstw jako warstw obiektów, ale wolałbym tego unikać, jeśli to możliwe).

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

Dzięki, Steve (wysłany na forum ArcGIS Server )

Stephen Lead
źródło

Odpowiedzi:

6

Użyj esri.request (), aby trafić do punktu końcowego REST każdej warstwy i uzyskać informacje o polach. Oto prosty przykład:

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

Ten kod używa wersji 2.0 interfejsu API, ale to samo będzie działać w wersji 2.3 lub 2.4. Pierwotnie opublikowałem na forum Esri JS API .

Edycja: Zaktualizowano, aby obsługiwał wszystkie warstwy w usłudze. Kod używa teraz także wersji 2.4 interfejsu API.

Derek Swingley
źródło
+1 Wygląda dobrze. Ponieważ użytkownik ma 3 warstwy, być może bardziej przydatne może być wywołanie przez init funkcji FieldsInit dla każdej warstwy.
Kirk Kuykendall
esri.request jest właściwą drogą, ale zamiast sprawdzać poszczególne warstwy, po prostu odpytuj je wszystkie naraz, używając http: //..../MapServer/layers? f = json jako adresu URL.
Sasa Ivetic
Myślę, że między wami mamy świetną odpowiedź :) @Derek, czy możesz edytować kod do obsługi wszystkich warstw zgodnie z sugestią Sasy, a ja oznaczę go jako zaakceptowany? Dzięki wszystkim
Stephen Lead
Proszę bardzo, Steve ... zaktualizowałem mój przykładowy kod, aby zapewnić informacje dla wszystkich warstw w usłudze map.
Derek Swingley,
Dzięki. Ładuję wynik JSON do zmiennej globalnej, do której mogę uzyskać dostęp w dowolnym momencie, aby określić warstwy i pola dostępne na mapie. Znakomity.
Stephen Lead
0

Mogę mieć niewłaściwy koniec kija tutaj, ale czy nie wykonujesz po prostu zapytania na danej warstwie i odzyskujesz wyniki jako zestaw wyników? Jeśli poprosisz o to w Json, możesz przeanalizować wyniki?

Więc po to:

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

Zwrot wynosi:

{„displayFieldName”: „STATE_NAME”, „fieldAliases”: {„STATE_NAME”: „STATE_NAME”}, „geometryType”: „esriGeometryPolygon”, „spatialReference”: {„wkid”: 4326}, „pola”: [{” nazwa „:„ STATE_NAME ”,„ typ ”:„ esriFieldTypeString ”,„ alias ”:„ STATE_NAME ”,„ długość ”: 25}],„ cechy ”: [{„ atrybuty ”: {„ STATE_NAME ”:„ Floryda ”} "geometria": { "pierścieni" [[[- 80.785662408630856,28.785194039580265 ...], [-80.5878197219821,24.956376399079556], [- 80.249453677873134,25.354937642313288]]]}}]}

(Usunąłem większość geometrii, aby ułatwić czytanie)

Włochaty
źródło
skąd wiedziałeś, by wykonać zapytanie o warstwę 1 i że istnieje pole o nazwie STATE_NAME? Właśnie to próbuję wypracować w locie (tj. Potrzebuję tego, aby pracować dla KAŻDEGO punktu końcowego odpoczynku w czasie wykonywania, a nie takiego, który znam wcześniej). Dzięki
Stephen Lead
cóż, najprostszą odpowiedzią byłoby policzenie warstw w usłudze map i każdej innej usłudze map i przechodzenie przez nie z żądaniem danych. Zapytanie może być po prostu zerowe, więc przywrócisz wszystko. Następnie możesz przejrzeć odpowiedź z listą danych.
Hairy
więc w powyższym przykładzie ustawiłem QueryTask na podstawie każdego restEndPoint i zbudowałem zapytanie, które nie zwróci geometrii - dobry pomysł. Spróbuję - dzięki!
Stephen Lead
Tak do tego podchodzę
Hairy
Spróbuj tego: URL do warstwy URL / NAZWA_UŻYTKOWNIKA / MapServer / warstwy? F = json - Powinno to zwrócić opis json wszystkich twoich warstw i ich pól lub URL / NAZWA TWOJEJ NAZWY / MapServer / 1? F = json wskazujący żądany numer warstwy
Hairy