如何以编程方式浏览REST端点和检索字段信息


9

我正在向ArcGIS Server JavaScript API地图添加动态地图服务,并且需要掌握每个组件层及其字段,以便可以运行查询。

请参阅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论坛

Answers:


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>

该代码使用API​​的v2.0,但相同的东西将在2.3或2.4下工作。我最初发布在Esri JS API论坛中

编辑: 更新为处理服务中的所有图层。该代码现在还使用API​​的2.4版。


+1看起来不错。由于用户有3层,因此可能需要对每层进行init调用FieldsInit函数。
柯克·库肯达尔

esri.request是必经之路,但无需查询单个图层,只需使用http://..../MapServer/layers?f = json作为URL一次即可查询所有图层。
2011年

你们之间,我认为我们有一个不错的答案:) @Derek您可以根据Sasa的建议编辑代码以处理所有图层,我将其标记为接受吗?谢谢大家
Stephen Lead

您可以去Steve ...更新我的代码示例,以提供地图服务中所有图层的信息。
德里克·斯威利

谢谢。我正在将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”,“ spatialReference”:{“ wkid”:4326},“ fields”:[{“ name“:” STATE_NAME“,” type“:” esriFieldTypeString“,” alias“:” STATE_NAME“,” length“:25}],” features“:[{” attributes“:{” STATE_NAME“:” Florida“} ,“ geometry”:{“ rings”:[[[-。80.785662408630856,28.785194039580265],... [-80.5878197219821,24.956376399079556],[-80.249453677873134,25.354937642313288]]]}]}

(为了方便阅读,我删除了大多数几何图形)


您怎么知道要查询第1层,并且有一个名为STATE_NAME的字段?这就是我要即时解决的问题(即,我需要在运行时为任何其他终结点工作,而不是我事先知道的工作)。谢谢
Stephen Lead

最简单的答案就是计算地图服务中的图层以及彼此之间的地图服务,然后遍历它们以请求数据。查询可以只是一个空查询,因此您可以将所有内容都带回来。然后,您可以遍历列出数据的响应。

因此,在上面的示例中,我将基于每个restEndPoint设置一个QueryTask,并构建一个不返回几何的查询-好主意。我会尝试的-谢谢!
斯蒂芬·利德

那就是我要处理的方式

尝试以下操作:URL到URL / YOURLAYERNAME / MapServer / layers?f = json图层-这将返回所有图层及其字段的json描述,或URL / YOURLAYERNAME / MapServer / 1?f = json表示所需的图层编号
多毛的
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.