Cách điều hướng các điểm cuối REST và truy xuất thông tin Trường theo chương trình


9

Tôi đang thêm Dịch vụ Bản đồ động vào bản đồ API JavaScript của ArcGIS Server và tôi cần nắm giữ từng lớp thành phần và các trường của nó, để tôi có thể chạy truy vấn.

Xem thư mục dịch vụ ArcGIS Server mẫu tại http://sampleserver3.arcgisonline.com/ArcGIS/rest/service/HomelandSecurity/operations/MapServer

Nếu bạn mở URL này trong trình duyệt, bạn có thể thấy danh sách các lớp có sẵn (0,1,2) và các trường của mỗi lớp .

Làm cách nào tôi có thể truy xuất danh sách các trường theo chương trình, trong một hàm JavaScript? Đoạn mã dưới đây cho thấy cách truy xuất các điểm cuối của lớp, nhưng tôi không thể thấy cách đi đến các trường.

(Một tùy chọn là thêm các lớp dưới dạng Lớp tính năng, nhưng tôi muốn tránh điều này nếu có thể).

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

Cảm ơn, Steve (đăng chéo lên diễn đàn ArcGIS Server )

Câu trả lời:


6

Sử dụng esri.request () để nhấn điểm cuối REST của mỗi lớp để nhận thông tin về các trường. Đây là một ví dụ đơn giản:

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

Mã đó sử dụng v2.0 của API nhưng điều tương tự sẽ hoạt động ở 2.3 hoặc 2.4. Ban đầu tôi đã đăng trong diễn đàn API Esri .

Chỉnh sửa: Cập nhật để xử lý tất cả các lớp trong một dịch vụ. Mã hiện cũng sử dụng phiên bản 2.4 của API.


+1 Có vẻ tốt. Vì người dùng có 3 lớp mặc dù, có thể có init gọi hàm FieldsInit cho mỗi lớp có thể hữu ích hơn.
Kirk Kuykendall

esri.request là cách để đi, nhưng thay vì truy vấn các lớp riêng lẻ, chỉ cần truy vấn tất cả chúng cùng một lúc bằng cách sử dụng http: //..../MapServer/layers? f = json làm URL.
Sasa Ivetic

Giữa tất cả các bạn, tôi nghĩ chúng ta có một câu trả lời tuyệt vời :) @Derek bạn có thể chỉnh sửa mã để xử lý tất cả các lớp theo đề xuất của Sasa không và tôi sẽ đánh dấu nó là chấp nhận? Cảm ơn tất cả mọi người
Stephen Lead

Có đi Steve ... đã cập nhật mẫu mã của tôi để cung cấp thông tin cho tất cả các lớp trong dịch vụ bản đồ.
Derek Swingley

Cảm ơn. Tôi đang tải kết quả JSON vào một biến toàn cục mà sau đó tôi có thể truy cập bất cứ lúc nào để xác định các lớp và trường có sẵn trên bản đồ. Xuất sắc.
Stephen chì

0

Tôi có thể có kết thúc sai của thanh ở đây, nhưng bạn không thực hiện một truy vấn trên lớp được đề cập và nhận kết quả như một kết quả? Nếu bạn yêu cầu nó trong json, bạn có thể phân tích kết quả?

Vì vậy, đối với điều này:

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

Sự trở lại là:

{"displayFieldName": "STATE_NAME", "fieldAliases": {"STATE_NAME": "STATE_NAME"}, "hình học": "esriGeometryPolygon", "spatialReference": {"wkid": 4326}, " tên ":" STATE_NAME "," loại ":" esriFieldTypeString "," bí danh ":" STATE_NAME "," chiều dài ": 25}]," tính năng ": [{" thuộc tính ": {" STATE_NAME ":" Florida "} , "hình học": {"nhẫn": [[[- 80.785662408630856,28.785194039580265], ... [-80.5878197219821,24.956376399079556], [- 80.249453677873134

(Tôi đã loại bỏ hầu hết các hình học để đọc dễ dàng hơn)


Làm thế nào bạn biết truy vấn lớp 1 và có một trường có tên là STATE_NAME? Đó là những gì tôi đang cố gắng thực hiện nhanh chóng (nghĩa là tôi cần điều này để làm việc cho BẤT K end điểm dừng nghỉ nào vào thời gian chạy, không phải là điểm mà tôi biết trước). Cảm ơn
Stephen chì

câu trả lời đơn giản nhất là đếm các lớp trong dịch vụ bản đồ và từng dịch vụ bản đồ khác và lặp qua chúng yêu cầu dữ liệu. Một truy vấn có thể là một null, vì vậy bạn mang mọi thứ trở lại. Sau đó, bạn có thể lặp qua phản hồi liệt kê dữ liệu.
Lông

vì vậy, trong ví dụ của tôi ở trên, tôi đã đặt QueryTask dựa trên mỗi restEndPoint và xây dựng một truy vấn không trả về hình học - ý tưởng hay. Tôi sẽ thử nó - cảm ơn!
Stephen chì

Đó là cách tôi tiếp cận nó
Lông

Hãy thử điều này: Url để lớp URL / YOULAYERNAME / MapServer / layer? F = json - Điều này sẽ trả về mô tả json của tất cả các lớp của bạn và các trường của chúng hoặc URL / YOULAYERNAME / MapServer / 1? F = json chỉ ra số lớp bạn muốn
Lông
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.