Как перемещаться по конечным точкам REST и получать информацию о поле программно

9

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

См. Образец каталога сервисов ArcGIS Server по адресу http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/operations/MapServer.

Если вы откроете этот URL в браузере, вы увидите список доступных слоев (0,1,2) и поля каждого слоя .

Как я могу получить список полей программно, внутри функции JavaScript? Фрагмент кода ниже показывает, как получить конечные точки слоя, но я не вижу, как добраться до полей.

(Один из вариантов - добавить слои как Feature Layers, но я бы предпочел избежать этого, если это возможно).

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. Первоначально я разместил на форуме Esri JS API .

Редактировать: Обновлено для обработки всех слоев в сервисе. Код также теперь использует версию 2.4 API.

Дерек Суингли
источник
+1 выглядит хорошо. Поскольку у пользователя есть 3 слоя, возможно, было бы более полезно иметь функцию init, вызывающую функцию FieldsInit для каждого слоя.
Кирк Куйкендалл
esri.request - это путь, но вместо того, чтобы запрашивать отдельные слои, просто запросите их все сразу, используя http: //..../MapServer/layers? f = json в качестве URL.
Саша Иветик
Между вами, я думаю, у нас есть отличный ответ :) @Derek Вы можете отредактировать код для обработки всех слоев в соответствии с предложением Сасы, и я отмечу его как принятый? Спасибо всем
Стивен Лид
Вот, пожалуйста, Стив ... обновил мой пример кода, чтобы предоставить информацию для всех слоев в картографическом сервисе.
Дерек Суингли
Спасибо. Я загружаю результат JSON в глобальную переменную, к которой я могу получить доступ в любое время, чтобы определить слои и поля, доступные на карте. Brilliant.
Стивен Лид
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", "spatialReference": { "wkid": 4326}, "полей": [{» название ":" STATE_NAME», "типа": "esriFieldTypeString", "псевдоним": "STATE_NAME", "длина": 25}], "особенности": [{ "атрибуты": { "STATE_NAME": "Флорида"} , "geometry": {"rings": [[[- 80.785662408630856,28.785194039580265], ... [-80.5878197219821,24.956376399079556], [- 80.249453677873134,25.354937642313288]]]}}]]}

(Я удалил большую часть геометрии, чтобы было легче читать)

волосатый
источник
как вы узнали, что запросили слой 1 и что там есть поле с именем STATE_NAME? Это то, что я пытаюсь отработать на лету (т. Е. Мне нужно, чтобы это работало для ЛЮБОЙ конечной точки отдыха во время выполнения, а не той, которую я знаю заранее). Спасибо
Стивен Лид
Ну, самый простой ответ - подсчитать слои в картографическом сервисе и друг в друге картографическом сервисе и просмотреть их, запрашивая данные. Запрос может быть просто нулевым, поэтому вы можете вернуть все обратно. Затем вы можете просмотреть ответ, перечислив данные.
Волосатые
так что в моем примере выше я бы установил QueryTask на основе каждого restEndPoint и создал запрос, который не возвращал геометрию - хорошая идея. Я попробую - спасибо!
Стивен Лид
Вот как я подхожу к этому
Волосатое
Попробуйте это: URL к слою URL / YOURLAYERNAME / MapServer / layer? F = json - Это должно вернуть json-отображение всех ваших слоев и их полей, или URL / YOURLAYERNAME / MapServer / 1? F = json, указывающий номер слоя, который вы хотите
Волосатые