REST 엔드 포인트를 탐색하고 프로그래밍 방식으로 필드 정보를 검색하는 방법


9

ArcGIS Server JavaScript API 맵에 Dynamic Map Service를 추가하고 있으며 각 구성 요소 레이어와 해당 필드를 파악해야 쿼리를 실행할 수 있습니다.

http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/operations/MapServer 에서 샘플 ArcGIS Server 서비스 디렉토리를 참조하십시오.

브라우저에서이 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?
   }
});

감사합니다, Steve ( 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 개의 레이어를 가지고 있기 때문에, 각 레이어마다 FieldsInit 함수를 호출하는 것이 더 유용 할 수 있습니다.
Kirk Kuykendall

esri.request는 갈 길이지만 개별 레이어를 쿼리하는 대신 URL로 http : //..../MapServer/layers? f = json을 사용하여 레이어를 한 번에 모두 쿼리하면됩니다.
Sasa Ivetic

@Derek 당신은 Sasa의 제안에 따라 모든 레이어를 처리하기 위해 코드를 편집 할 수 있습니까? 허용 된 것으로 표시합니까? 모두 감사합니다
Stephen Lead

거기에 Steve가 있습니다 ...지도 서비스의 모든 레이어에 대한 정보를 제공하도록 코드 샘플을 업데이트했습니다.
Derek Swingley

감사. JSON 결과를 전역 변수에로드하여 언제든지 액세스 할 수 있으며 맵에서 사용 가능한 레이어와 필드를 결정할 수 있습니다. 훌륭한.
Stephen Lead

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}, "fields": [{ " name ":"STATE_NAME ","type ":"esriFieldTypeString ","alias ":"STATE_NAME ","length ": 25}],"기능 ": [{"속성 ": {"STATE_NAME ":"플로리다 "} , "형상": { "링": [[[-80.785662408630856,28.785194039580265], ... [-80.5878197219821,24.956376399079556], [-80.249453677873134,25.354937642313288]]]}]}

(읽기 쉽도록 대부분의 지오메트리를 제거했습니다)


레이어 1을 쿼리하고 STATE_NAME이라는 필드가 있다는 것을 어떻게 알았습니까? 그것이 바로 작동하려고하는 것입니다 (즉, 사전에 알고있는 것이 아닌 런타임에 모든 나머지 엔드 포인트에서 작동하려면 이것이 필요합니다). 감사합니다
Stephen Lead

가장 간단한 대답은 맵 서비스의 레이어와 서로의 맵 서비스를 계산하고 데이터를 요청하는 레이어를 반복하는 것입니다. 쿼리는 null 일 수 있으므로 모든 것을 다시 가져옵니다. 그런 다음 데이터를 나열하는 응답을 반복 할 수 있습니다.
털이

위의 예제에서 각 restEndPoint를 기반으로 QueryTask를 설정하고 기하학을 반환하지 않는 쿼리를 작성했습니다. 시도해 볼게요-고마워요!
Stephen Lead

그것이 내가 접근 한 방법입니다
Hairy

이 시도 :? 레이어 URL에 URL을 / YOURLAYERNAME / 맵 서버 / 층 = JSON F -이 원하는 레이어 수를 나타내는 모든 계층과 분야 또는 URL / YOURLAYERNAME / 맵 서버 / 1 = JSON F의 JSON 묘사를 반환해야합니다
털이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.