जावास्क्रिप्ट 2 के लिए आर्कजीआईएस एपीआई का उपयोग करके कई आर्कजीआईएस सर्वर इंस्टेंस से परतों की पहचान?


14

यह जावास्क्रिप्ट एपीआई 2.4 के साथ आर्कगिस सर्वर 9.3 पर लागू होता है।

मेरा लक्ष्य मानचित्र पर क्लिक करना है और सभी दृश्यमान गतिशील परतों पर पहचान कार्य चलाना है।

IdentifyTask को REST एंडपॉइंट के लिए एक URL की आवश्यकता होती है, IdentifyParameters के साथ यह निर्दिष्ट करता है कि कौन सा लेयर पहचान प्रक्रिया पर काम करना चाहिए।

ऐसा लगता है कि पहचान उपकरण सभी परतों को एक ही REST समापन बिंदु (यानी, समान आर्किस सर्वर) से सुलभ होने की उम्मीद कर रहा है।

मेरे मामले में, कई ArcGIS सर्वर इंस्टेंस से लेयर्स दी जा रही हैं - आइडेंटिफाई टूल इसे कैसे सपोर्ट कर सकता है? उदाहरण के लिए, यदि इस मानचित्र में इमारतें और पार्सल परतें अलग-अलग आर्कजीआईएस सर्वर से आ रही थीं।

(यह मेरे पिछले प्रश्न से संबंधित है , लेकिन मुझे एहसास है कि अब मुझे पहले इस प्रश्न का उत्तर देने की आवश्यकता है)


क्या इन अवधारणाओं का कोई अद्यतन किया गया है? मैं ऊपर संदर्भित फिडेल नमूने का उपयोग कर रहा हूं। धन्यवाद
चरण

@phase जहाँ तक मुझे पता है कि अवधारणाएँ अभी भी आर्कजीस सर्वर 10 और जेएस एपीआई 2.6 का उपयोग कर रही हैं, यह मानते हुए कि आपका क्या मतलब है
स्टीफन लीड

जवाबों:


11

सबसे पहले, कई पहचान कार्यों को संसाधित करने के लिए DeferredList का उपयोग करने की अवधारणा को दिखाने के लिए एक सरल जावास्क्रिप्ट एपीआई उदाहरण है:

//Assume that map is your map object
var idTask1, idTask2, idParams = new esri.tasks.IdentifyParameters();
var url1 = "<server1 url>", var url2 = "<server2 url>";
dojo.connect(map, "onLoad", initIdentifies);
function initIdentifies(map) { //map.onLoad passes in the map object
    idTask1 = new esri.tasks.IdentifyTask(url1);
    idTask2 = new esri.tasks.IdentifyTask(url2);
    //A few sample constant parameters. Set more or less as you need
    idParams.tolerance = 12;
    idParams.returnGeometry = true;
    idParams.layerOption = esri.tasks.IdentifyParameters.LAYER_OPTION_ALL;
    dojo.connect(map, "onClick", runIdentifies);
}
function runIdentifies(evt) {
    var defTask1 = new dojo.Deferred(), defTask2 = new dojo.Deferred;
    var dlTasks = new dojo.DeferredList([defTask1, defTask2]);
    dlTasks.then(showResults); //defTasks will fire after defTask1 and defTask2 have completed
    //These parameters change with each request
    idParams.width = map.width;
    idParams.height = map.height;
    idParams.geometry = evt.mapPoint;
    idParams.mapExtent = map.extent;
    try {
        idTask1.execute(idParams, defTask1.callback, defTask1.errback); //Pass the response into the callback on defTask1
    } catch (e) {
        console.log("Error caught");
        console.log(e);
        defTask1.errback(e); //If you get an error, execute the errback
    }
    try {
        idTask2.execute(idParams, defTask2.callback, defTask2.errback); //Pass the response into the callback on defTask2
    } catch (e) {
        console.log("Error caught");
        console.log(e);
        defTask2.errback(e); //If you get an error, execute the errback
    }
}
function showResults(r) {
    //The format of 'r' is [[Boolean task 1 success, [task 1 results]],[Boolean task 2 success, [task 2 results]]]
    //using the array 'r', build and show your infoWindow as normal
}

फिर यहाँ jsFiddle में एक उदाहरण है कि मुझे लगता है कि आप क्या चाहते हैं, नक्शे में सभी दृश्यमान गतिशील नक्शे परतों में सभी दृश्यमान परतों का उपयोग करके चलता है।

http://jsfiddle.net/blordcastillo/mULcz/

अब सभी टाइपो तय हो गए हैं :)

मूल विचार यह है कि जब भी मानचित्र पर क्लिक किया जाता है या दृश्यता टॉगल की जाती है, तो पहचान फिर से हो जाती है। जब पहचान को चलाया जाता है, तो निकाल दिए गए पहचान कार्यों की संख्या दिखाई देने वाली परतों की संख्या पर निर्भर करती है, और यह तब तक इंतजार करती है जब तक कि सभी परतें अपने परिणामों को प्रदर्शित करने के लिए वापस नहीं आती हैं।


यह बहुत समझ में आता है - नमूना कोड पोस्ट करने के लिए बहुत बहुत धन्यवाद
स्टीफन लीड

2
आपके कोड में कुछ छोटे टाइपो हैं - जो वास्तव में अधिक प्रभावशाली हैं क्योंकि इसका मतलब है कि आपने इसे मेमोरी से टाइप किया है और इसे चलाने की आवश्यकता भी नहीं है। आप को सलाम!
स्टीफन लीड

हां, मैंने अपने सिर के ऊपर से ही टाइप किया था :) मुझे बताएं कि मामूली टाइपो क्या हैं और मैं उन्हें ठीक कर दूंगा।
ब्लॉर्ड-कास्टिलो

JsFiddle में एक कामकाजी संस्करण में बदल गया। संस्करण पूरी तरह से कुशल नहीं है; आदर्श रूप में मैं अपने क्वेरी परिणामों को बचाऊंगा और जब दृश्यता की पहचान नहीं की जाएगी तो दृश्यता के बदल जाने पर शो शोल्‍स अनुभाग को फिर से बनाएं। लेकिन, मुझे लगता है कि यह अवधारणा को अच्छी तरह से दिखाता है कि दृश्यता के साथ-साथ निष्पादित किए जाने वाले कार्यों को कैसे निष्पादित किया जाए। इसके अलावा, आप प्रत्येक लेयर के साथ एक टेम्प्लेट को स्टोर करना चाहते हैं ताकि आप लेयर्स के टेम्प्लेट्स को लेयर्स के बजाय ले ले सकें, जैसे कि मैंने जावास्क्रिप्ट फ़ंक्शंस के अंदर लॉजिक का उपयोग किया।
ब्लॉर्ड-कास्टिलो

4

पहचान कार्य केवल एक मानचित्र सेवा को संदर्भित कर सकता है, इसलिए आपको या तो करना होगा:

  • उन सभी परतों को रखें जिन्हें आप एक मानचित्र सेवा में पहचान को चलाना चाहते हैं
  • प्रति क्लिक क्लिक में एकाधिक IdentifyTasks चलाएं

मैं एक ऐसी स्थिति में एक ऐप के साथ भाग गया, जहां मैं एक डेम मैप सेवा पर पहचान करने में सक्षम होना चाहता था, और एक जियोप्रोसेसिंग कार्य से समुद्र स्तर वृद्धि परिणाम मानचित्र सेवा पर। मैंने दो IdentifyTasks चलाने का विकल्प चुना। केवल एक चीज जिसे आपको वास्तव में जोड़ना है, जब दोनों कार्य किए जाते हैं।

मूल प्रवाह है (यह सिल्वरलाइट / C # का उपयोग कर रहा था)

  • डेम और एसएलआर पहचान के लिए सेटअप बूलियन चर
  • DEM के लिए IdentifyTask चलाएं
  • BEM को DEMidentifyTaskComplete के लिए सेट करें
  • SLR के लिए IdentifyTask चलाएँ (DEM के लिए समान सामान्य मापदंडों का उपयोग करके)
  • झूठी के लिए SLRidentifyTaskComplete के लिए सेट बूल
  • DEMIdentifyTask_ExecuteCompleted इवेंट श्रोता में, मैं DEMidentifyTaskcomplete को सही पर सेट करता हूं और फिर यह देखने के लिए जांचें कि क्या SLRidentifyTaskcomcomplete सत्य है (SLRIDentifyTask_ExecuteCompleted के लिए विपरीत सेट करें)
  • जो भी कार्य अंतिम रूप से समाप्त होता है, दोनों बूल सही होंगे, और IdentifyTasksComplete को कॉल करेगा, जो दोनों परिणामों को एक कस्टम ग्राफिक ऑब्जेक्ट में जोड़ता है जिसे मैं मानचित्र में जोड़ता हूं, फिर slr और demidentiftytaskcomplete को झूठा सेट करें

धन्यवाद - यह वही है जो मुझे डर था, लेकिन यह सुनना अच्छा है कि आपने इसे काम करने योग्य पाया। यदि यह साइट उपलब्ध है, तो क्या आप मुझे URL बता सकते हैं?
स्टीफन लीड

यह सार्वजनिक नहीं है, और इसके अलावा सिल्वरलाइट में है। सौभाग्य!
wwnick

एकाधिक पहचान कार्यों के लिए +1। जावास्क्रिप्ट एपीआई के लिए, आप उन्हें dojo.DeferredList के साथ प्रबंधित कर सकते हैं (कई क्वेरी पर भी लागू होता है)।
डेरेक स्विंगले

1

मैंने इस बहुत ही परिदृश्य को स्थगित सूची के साथ फिर से बनाया, लेकिन मुश्किल हिस्सा केवल उन परतों की पहचान कर रहा था जो पैमाने पर हैं। यह संस्करण 3.2 jsapi http://www.spatialexception.org/posts/arcgis-javascript-identifytask-returns-scale-dependent-layers के लिए है


@awesomo, इस समाधान का लाइव लिंक देखने का कोई मौका?
रिप्सिन

वहाँ एक मैं के उपकरण पट्टी ऊपरी दाईं ओर स्थित आइकन की पहचान है mapserver2.vestra.com/demo/smile
awesomo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.