REST uç noktalarında gezinme ve Alan bilgilerini programlı olarak alma


9

Bir ArcGIS Server JavaScript API eşlemesine Dinamik Harita Hizmeti ekliyorum ve her bileşen katmanını ve alanlarını tutmam gerekiyor, böylece bir sorgu çalıştırabilirim.

Http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/operations/MapServer adresindeki örnek ArcGIS Sunucusu hizmetleri dizinine bakın.

Bu URL'yi bir tarayıcıda açarsanız, kullanılabilir katmanların (0,1,2) ve her katmanın alanlarının listesini görebilirsiniz .

JavaScript işlevinde alanların listesini programlı olarak nasıl alabilirim? Aşağıdaki kod snippet'i katman uç noktalarının nasıl alınacağını gösterir, ancak alanlara nasıl ulaşılacağını göremiyorum.

(Bir seçenek katmanları Özellik Katmanları olarak eklemektir, ancak mümkünse bundan kaçınmayı tercih ederim).

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

Teşekkürler Steve ( ArcGIS Server forumuna çapraz gönderildi )

Yanıtlar:


6

Alanlar hakkında bilgi almak için her katmanın REST bitiş noktasına ulaşmak için esri.request () öğesini kullanın. İşte basit bir örnek:

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

Bu kod API'nin v2.0'ını kullanır, ancak aynı şey 2.3 veya 2.4'te çalışır. Başlangıçta Esri JS API forumunda yayınladım .

Düzenle: Bir hizmetteki tüm katmanları işlemek için güncellendi. Kod şimdi API'nın 2.4 sürümünü de kullanıyor.


+1 İyi görünüyor. Kullanıcının 3 katmanı olduğundan, init çağrısı yapmak her katman için bir FieldsInit işlevi kullanmak daha yararlı olabilir.
Kirk Kuykendall

esri.request gidilecek yoldur, ancak tek tek katmanları sorgulamak yerine URL olarak http: //..../MapServer/layers? f = json kullanarak hepsini tek seferde sorgulayın.
Sasa Ivetic

Hepiniz arasında, harika bir cevabımız olduğunu düşünüyorum :) @Derek Sasa'nın önerisi doğrultusunda tüm katmanları işlemek için kodu düzenleyebilir ve kabul edilmiş olarak işaretleyeceğim? Herkese teşekkürler
Stephen Lead

İşte ya Steve ... bir harita hizmetindeki tüm katmanlar için bilgi sağlamak için kod örneğimi güncelledim.
Derek Swingley

Teşekkürler. JSON sonucunu, daha sonra istediğiniz zaman, haritadaki kullanılabilir katmanları ve alanları belirlemek için erişebileceğiniz global bir değişkene yüklüyorum. Parlak.
Stephen Lead

0

Burada sopanın yanlış ucuna sahip olabilirim, ancak sadece söz konusu katman üzerinde bir sorgu gerçekleştirmiyor ve sonuçları bir sonuç kümesi olarak geri almıyor musunuz? Eğer json içinde sorarsanız, sonuçları ayrıştırabilirsiniz?

Bunun için:

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

Dönüş:

{ "DisplayFieldName": "STATE_NAME", "fieldAliases": { "STATE_NAME": "STATE_NAME"} "GeometryType": "esriGeometryPolygon", "spatialReference": { "wkid": 4326}, "alanlar": [{" adı ":" STATE_NAME", "type": "esriFieldTypeString", "takma": "STATE_NAME", "uzunluk": 25}], "özellikleri": [{ "nitelikler": { "STATE_NAME": "Florida"} , "geometri": {"halkalar": [[[- - 80.785662408630856,28.785194039580265], ... [-80.5878197219821,24.956376399079556], [- 80.249453677873134,25.354937642313288]]]}}}}}}

(Okumayı kolaylaştırmak için geometrinin çoğunu kaldırdım)


1. katmanı nasıl sorgulayacağınızı ve STATE_NAME adında bir alan olduğunu nasıl bildiniz? Anında çalışmaya çalıştığım şey bu (yani, önceden bildiğim değil, çalışma zamanında HERHANGİ bir dinlenme uç noktası için çalışmak için buna ihtiyacım var). Teşekkürler
Stephen Lead

en basit cevap, harita hizmetindeki katmanları ve birbirlerinin harita hizmetlerini saymak ve veriler arasında geçiş yapmaktır. Bir sorgu sadece boş bir sorgu olabilir, böylece her şeyi geri getirirsiniz. Daha sonra verileri listeleyen yanıtta döngü yapabilirsiniz.
Kıllı

Bu yüzden yukarıdaki örneğimde, her restEndPoint'e dayalı bir QueryTask ayarladım ve geometriyi döndürmeyen bir sorgu oluşturdum - iyi fikir. Bir deneyeceğim - teşekkürler!
Stephen Lead

Bu şekilde yaklaşırım
Hairy

Bunu deneyin: URL URL'si / YOURLAYERNAME / MapServer / layers? F = json - Bu, tüm katmanlarınızın ve alanlarının veya istediğiniz katman numarasını gösteren URL / YOURLAYERNAME / MapServer / 1? F = json'un json tasvirini döndürmelidir
Kıllı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.