วิธีการนำทาง REST endpoints และดึงข้อมูล Field โดยทางโปรแกรม


9

ฉันกำลังเพิ่ม Dynamic Map Service ลงในแผนที่ ArcGIS Server JavaScript API และฉันต้องได้รับการยึดของแต่ละส่วนประกอบเลเยอร์และฟิลด์ของมันเพื่อที่ฉันจะสามารถเรียกใช้แบบสอบถาม

ดูตัวอย่างไดเรกทอรีบริการเซิร์ฟเวอร์ ArcGIS ที่http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/HomelandSecurity/operations/MapServer

ถ้าคุณเปิด 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 เป็นวิธีที่จะไป แต่แทนที่จะค้นหาแต่ละเลเยอร์เพียงแค่ค้นหาพวกมันทั้งหมดในครั้งเดียวโดยใช้ http: //..../MapServer/layers? f = json เป็น URL
Sasa Ivetic

ระหว่างคุณทั้งหมดฉันคิดว่าเรามีคำตอบที่ยอดเยี่ยม :) @Derek คุณสามารถแก้ไขรหัสเพื่อจัดการเลเยอร์ทั้งหมดตามคำแนะนำของ Sasa แล้วฉันจะทำเครื่องหมายว่ายอมรับหรือไม่? ขอบคุณทุกคน
Stephen Lead

Steve ya ไปที่นั่น ... อัปเดตตัวอย่างโค้ดของฉันเพื่อให้ข้อมูลสำหรับเลเยอร์ทั้งหมดในบริการแผนที่
Derek Swingley

ขอบคุณ ฉันกำลังโหลดผลลัพธ์ 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} "เขต": [{" ชื่อ ":" STATE_NAME", "type": "esriFieldTypeString", "นามแฝง": "STATE_NAME", "ความยาว": 25}] "คุณสมบัติ": [{ "คุณลักษณะ": { "STATE_NAME": "ฟลอริด้า"} , "เรขาคณิต": {"วงแหวน": [[- 80.785662408630856,28.785194039580265],]] [... -80.5878197219821,24.956376399079556], [] -

(ฉันลบรูปเรขาคณิตส่วนใหญ่ออกเพื่อให้อ่านง่ายขึ้น)


คุณรู้จักแบบสอบถามชั้น 1 ได้อย่างไรและมีเขตข้อมูลชื่อ STATE_NAME อย่างไร นั่นคือสิ่งที่ฉันพยายามที่จะทำงานทันที (เช่นฉันต้องการสิ่งนี้เพื่อทำงานให้กับจุดพักที่ใดก็ได้ในเวลาทำงานไม่ใช่สิ่งที่ฉันรู้ล่วงหน้า) ขอบคุณ
สตีเฟ่นนำ

คำตอบที่ง่ายที่สุดก็คือการนับเลเยอร์ในบริการแผนที่และบริการแผนที่ซึ่งกันและกันและวนรอบพวกเขาเพื่อขอข้อมูล แบบสอบถามอาจเป็นค่าว่างดังนั้นคุณจึงนำทุกอย่างกลับมา จากนั้นคุณสามารถวนซ้ำผ่านการตอบกลับที่แสดงรายการข้อมูล
ขน

ดังนั้นในตัวอย่างด้านบนของฉันฉันจะตั้งค่า QueryTask ตาม restEndPoint แต่ละอันและสร้างคิวรีที่ไม่ส่งคืนเรขาคณิต - ความคิดที่ดี ฉันจะลองดู - ขอบคุณ!
Stephen Lead

นั่นเป็นวิธีที่ฉันจะเข้าใกล้
ขน

ลองสิ่งนี้: Url to layer URL / YOURLAYERNAME / MapServer / layers? f = json - สิ่งนี้จะส่งคืนการแสดง json ของเลเยอร์ทั้งหมดของคุณและฟิลด์หรือ URL / YOURLAYERNAME / MapServer / 1? f = json เพื่อระบุหมายเลขเลเยอร์ที่คุณต้องการ
ขน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.