Cara menavigasi titik akhir REST dan mengambil informasi Field secara terprogram

9

Saya menambahkan Layanan Peta Dinamis ke peta API JavaScript Server ArcGIS, dan saya perlu menghubungi setiap lapisan komponen dan bidangnya, sehingga saya dapat menjalankan kueri.

Lihat contoh direktori layanan Server ArcGIS di http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/operations/MapServer

Jika Anda membuka URL ini di browser Anda dapat melihat daftar lapisan yang tersedia (0,1,2) dan bidang masing-masing lapisan .

Bagaimana saya bisa mengambil daftar bidang secara programatik, dalam fungsi JavaScript? Cuplikan kode di bawah ini menunjukkan cara mengambil titik akhir layer, tapi saya tidak bisa melihat cara membuka bidang.

(Salah satu opsi adalah menambahkan layer sebagai Feature Layers, tapi saya lebih suka menghindari ini jika memungkinkan).

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

Terima kasih, Steve (diposting silang ke forum ArcGIS Server )

Stephen Lead
sumber

Jawaban:

6

Gunakan esri.request () untuk menekan titik akhir REST setiap lapisan untuk mendapatkan info tentang bidang. Berikut ini contoh sederhana:

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

Kode itu menggunakan v2.0 dari API tetapi hal yang sama akan bekerja pada 2.3 atau 2.4. Saya awalnya diposting di forum Esri JS API .

Sunting: Diperbarui untuk menangani semua lapisan dalam suatu layanan. Kode sekarang juga menggunakan versi 2.4 API.

Derek Swingley
sumber
+1 Terlihat bagus. Karena pengguna memiliki 3 lapisan, mungkin init memanggil fungsi FieldsInit untuk setiap lapisan mungkin lebih berguna.
Kirk Kuykendall
esri.request adalah jalan yang harus dilalui, tetapi alih-alih mengajukan kueri lapisan individual, cukup kueri semuanya sekaligus dengan menggunakan http: //..../MapServer/layers? f = json sebagai URL.
Sasa Ivetic
Di antara kalian semua, saya pikir kami memiliki jawaban yang bagus :) @Derek dapatkah Anda mengedit kode untuk menangani semua lapisan sesuai saran Sasa, dan saya akan menandainya sebagai diterima? Terima kasih semuanya
Stephen Lead
Begitulah Steve ... memperbarui sampel kode saya untuk memberikan info untuk semua lapisan dalam layanan peta.
Derek Swingley
Terima kasih. Saya memuat hasil JSON ke variabel global yang dapat saya akses kapan saja, untuk menentukan lapisan dan bidang yang tersedia di peta. Cemerlang.
Stephen Lead
0

Saya mungkin memiliki ujung tongkat yang salah di sini, tetapi tidakkah Anda hanya melakukan kueri pada layer yang dimaksud dan mendapatkan hasilnya kembali sebagai resultset? Jika Anda memintanya dalam json, Anda dapat menguraikan hasilnya?

Jadi untuk ini:

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

Pengembaliannya adalah:

{"displayFieldName": "STATE_NAME", "fieldAliases": {"STATE_NAME": "STATE_NAME"}, "geometryType": "esriGeometryPolygon", "spatialReference": {"wkid": 4326}, "{" "" nama ":" STATE_NAME "," ketik ":" esriFieldTypeString "," alias ":" STATE_NAME "," length ": 25}]," fitur ": [{" atribut ": {" STATE_NAME ":" Florida "} , "geometri": {"dering": [[[- 80.785662408630856,28.785194039580265], ... [-80.5878197219821, 24.956376399079556], [- 80.249453677873134,25.354937642313288]]}}

(Saya telah menghapus sebagian besar geometri untuk membuatnya lebih mudah dibaca)

Berbulu
sumber
bagaimana Anda tahu permintaan lapisan 1, dan ada bidang yang disebut STATE_NAME? Itulah yang saya coba untuk lakukan saat itu juga (yaitu, saya membutuhkan ini untuk bekerja untuk titik akhir APA SAJA saat run-time, bukan yang saya tahu sebelumnya). Terima kasih
Stephen Lead
baik jawaban paling sederhana adalah dengan menghitung lapisan-lapisan dalam layanan peta, dan masing-masing layanan peta lainnya, dan mengulanginya dengan meminta data. Kueri bisa berupa nol, jadi Anda mengembalikan semuanya. Anda kemudian dapat mengulangi respons daftar data.
Berbulu
jadi dalam contoh saya di atas, saya akan menetapkan QueryTask berdasarkan setiap restEndPoint, dan membuat kueri yang tidak mengembalikan geometri - ide bagus. Saya akan mencobanya - terima kasih!
Stephen Lead
Begitulah cara saya mendekatinya
Berbulu
Coba ini: Url ke URL lapisan / YOURLAYERNAME / MapServer / layers? F = json - Ini akan mengembalikan gambaran json dari semua lapisan Anda dan bidang mereka atau URL / YOURLAYERNAME / MapServer / 1? F = json menunjukkan nomor lapisan yang Anda inginkan
Berbulu