Як орієнтуватися в кінцевих точках REST та програматично отримувати інформацію про поле


9

Я додаю службу динамічних карт у карту API ArcGIS Server JavaScript, і мені потрібно влаштуватись на кожен компонентний шар та його поля, щоб я міг запустити запит.

Дивіться зразок каталогу служб ArcGIS на веб-сайті http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/operations/MapServer

Якщо відкрити цю URL-адресу в браузері, ви побачите список доступних шарів (0,1,2) та поля кожного шару .

Як я можу отримати список полів програмно в межах функції JavaScript? Фрагмент коду нижче показує, як отримати кінцеві точки шару, але я не бачу, як дістатися до полів.

(Один із варіантів - додати шари як шари функцій, але я вважаю за краще уникати цього, якщо це можливо).

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

Дякую, Стів (перекладено на форум ArcGIS Server )

Відповіді:


6

Використовуйте esri.request (), щоб потрапити на кінцеву точку REST кожного шару, щоб отримати інформацію про поля. Ось простий приклад:

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

Цей код використовує v2.0 API, але те саме буде працювати в 2.3 або 2.4. Я спочатку розмістив на форумі API Esri JS API .

Редагувати: оновлено для обробки всіх шарів сервісу. Зараз у коді також використовується версія 2.4 API.


+1 Виглядає добре. Оскільки користувач має 3 шари, можливо, кориснішим є функція init викликати функцію FieldsInit для кожного шару.
Кірк Куйкендал

esri.request - це шлях, але замість того, щоб запитувати окремі шари, просто запитуйте їх усі відразу, використовуючи http: //..../MapServer/layers? f = json як URL.
Саса Іветік

Між усіма вас, я думаю, що у нас є чудова відповідь :) @Derek чи можете ви відредагувати код для обробки всіх шарів відповідно до пропозиції Саси, і я позначу його як прийнятий? Дякую всім
Стівен Ведучий

Там ви, Стів ... оновив зразок коду, щоб надати інформацію для всіх шарів служби карти.
Дерек Свінглі

Дякую. Я завантажую результат JSON в глобальну змінну, до якої я можу в будь-який час отримати доступ, щоб визначити шари та поля, наявні на карті. Блискуча.
Стівен Ведучий

0

У мене може бути неправильний кінець палички тут, але хіба ви просто не виконуєте запит на відповідному шарі та отримуєте результати назад як набір результатів? Якщо ви запитаєте його в json, можете проаналізувати результати?

Отже, для цього:

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

Повернення:

{"displayFieldName": "STATE_NAME", "fieldAliases": {"STATE_NAME": "STATE_NAME"}, "geometryType": "esriGeometryPolygon", "paceReference ": {" wkid ": 4326}," polja ": [{" назва ":" STATE_NAME "," type ":" esriFieldTypeString "," псевдонім ":" STATE_NAME "," довжина ": 25}]," особливості ": [{" атрибути ": {" STATE_NAME ":" Florida "} , "геометрія": {"кільця": [[[- 80.785662408630856,28.785194039580265], ... [-80.5878197219821,24.956376399079556], [- 80.249453677873134,25.354937642313288]]]}}]}

(Я видалив більшу частину геометрії, щоб полегшити читання)


як ви знали, що запитувати рівень 1 і що там було поле під назвою STATE_NAME? Це те, що я намагаюся опрацювати на ходу (тобто мені це потрібно для роботи для будь-якої кінцевої точки відпочинку під час виконання, а не тієї, яку я знаю заздалегідь). Спасибі
Стівен Ведучий

ну найпростішою відповіддю було б порахувати шари в сервісі карт та один одному сервісі карт та прокрутити їх із запитом даних. Запит може бути просто нульовим, тому ви повернете все назад. Потім ви можете переглядати відповідь, у якій перераховуються дані.
Волосатий

тому в моєму прикладі вище я встановив QueryTask на основі кожного restEndPoint і будував запит, який не повертав геометрію - хороша ідея. Я спробую - спасибі!
Стівен Ведучий

Ось як я підійшов би до цього
Волосатий

Спробуйте це: URL-адреса для шару / YOURLAYERNAME / MapServer / шари? F = json - це повинно повернути зображення json усіх ваших шарів та їхніх полів або URL / YOURLAYERNAME / MapServer / 1? F = json із зазначенням потрібного номера шару
Волохатий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.