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 )

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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.