JavaScript 2 için ArcGIS API'sini kullanarak birden çok ArcGIS Sunucusu örneğindeki katmanları mı tespit ediyorsunuz?


14

Bu JavaScript API 2.4 ile ArcGIS Server 9.3 için geçerlidir.

Amacım haritayı tıklamak ve Tanımla görevinin tüm görünür Dinamik katmanlarda çalışmasını sağlamaktır.

IdentifyTask , REST uç noktasına bir URL gerektirir ve IdentifyParameters , tanımlama işleminin hangi layerIds üzerinde gerçekleştirileceğini belirtir .

Tanımlama aracı, tüm katmanların aynı REST uç noktasından (yani aynı ArcGIS Sunucusu) erişilebilir olmasını bekliyor gibi görünüyor.

Benim durumumda, katmanlar birden fazla ArcGIS Server örneğinden sunuluyor - Tanımlama aracı bunu nasıl destekleyebilir? Örneğin, bu haritadaki Binalar ve Parsel katmanları ayrı ArcGIS Sunucularından geliyorsa.

(Bu önceki sorumla ilgili , ama şimdi önce bu soruyu cevaplamam gerektiğini anlıyorum)


Bu kavramlarda güncelleme yapıldı mı? Yukarıda referans verilen keman örneği kullanıyorum. Teşekkürler
faz

Bildiğim kadarıyla, kavramların ArcGIS Server 10 ve JS API 2.6 kullanarak hala aynı olduğunu bildiğim kadarıyla, ne demek istediğinizi varsayarak
Stephen Lead

Yanıtlar:


11

İlk olarak, birden çok tanımlama görevini işlemek için DeferredList kullanma kavramını gösteren basitleştirilmiş bir JavaScript API örneği:

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

O zaman burada jsFiddle'da istediğini yaptığımı, haritadaki tüm görünür dinamik harita katmanlarındaki tüm görünür katmanları kullanarak çalıştığını gösteren bir örnek var.

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

Tüm yazım hataları artık düzeltildi :)

Temel fikir, harita her tıklandığında veya görünürlük değiştirildiğinde, tanımlamanın yeniden çalıştırılmasıdır. Tanımlama çalıştırıldığında, tetiklenen kimlik görevlerinin sayısı görünür katman sayısına bağlıdır ve tüm katmanların sonuçlarını görüntülemek için geri dönmesini bekler.


çok mantıklı - örnek kodunu gönderdiğiniz için çok teşekkürler
Stephen Lead

2
Kodunuzda birkaç küçük yazım hatası var - bu, bellekten yazdığınızı ve hatta çalıştırmanız gerekmediği için daha etkileyici. Sana şapka çıkarıyorum!
Stephen Lead

Evet, bunu sadece başımın üst kısmından yazdım :) Küçük tipoların ne olduğunu bana bildirin ve onları düzeltirim.
blord-castillo

JsFiddle'da çalışan bir sürüme değiştirildi. Versiyon mükemmel verimli değil; ideal olarak benim sorgu sonuçları kaydetmek ve sadece tanımlama noktası tarafından görünürlük değiştiğinde showResults bölümünü yeniden. Ancak, yapılan görevleri tanımlamakla birlikte görünürlük geçişini nasıl bağlayacağımız kavramını iyi gösterdiğini düşünüyorum. Ayrıca, benim yaptığım gibi javascript işlevlerinin içindeki mantığı kullanmak yerine, şablonları yalnızca katmanlardan çekebilmeniz için her bir katmanla bir şablon depolamak istersiniz.
blord-castillo

4

Tanımlama görevi yalnızca bir harita hizmetine başvurabilir, bu nedenle şunlardan birini yapmanız gerekir:

  • Identity'yi çalıştırmak istediğiniz tüm katmanları tek bir harita hizmetine yerleştirin
  • Harita tıklaması başına birden çok IdentifyTasks çalıştırın

Bir DEM harita hizmetinde tanımlamak istediğim bir uygulama ile ve bir coğrafi işlem görevinden bir deniz seviyesi yükseliş sonucu harita hizmetinde benzer bir durumla karşılaştım. İki IdentifyTasks çalıştırmayı seçtim. Gerçekten eklemeniz gereken tek şey, her iki görevin de ne zaman yapıldığını bulmaktır.

Temel akış şudur (bu Silverlight / C # kullanıyordu)

  • DEM ve SLR için boole değişkenlerini ayarlama
  • DEM için IdentifyTask'ı çalıştırın
  • DEMidentifyTaskComplete için bool değerini false olarak ayarla
  • IdentifyTask'ı SLR için çalıştırın (DEM ile aynı genel parametreleri kullanarak)
  • SLRidentifyTaskComplete için bool değerini false olarak ayarla
  • DEMIdentifyTask_ExecuteCompleted olay dinleyicisinde, DEMidentifyTaskcomplete öğesini true olarak ayarladım ve sonra SLRidentifyTaskcomplete öğesinin doğru olup olmadığını kontrol ettim (SLRIdentifyTask_ExecuteCompleted için tersini ayarlayın)
  • Hangi görev en son tamamlanırsa bitilsin, her iki bools da doğru olur ve her iki sonucu da haritaya eklediğim özel bir grafik nesnesine ayrıştıran, sonra slr ve demidentiftytaskcomplete öğesini false olarak ayarlayan IdentifyTasksComplete öğesini çağırır.

teşekkür ederim - korktuğum şey bu, ancak çalışılabilir bulduğunuzu duymak güzel. Bu site mevcutsa, lütfen URL'yi bana bildirir misiniz?
Stephen Lead

Herkese açık değil ve Silverlight'ta. İyi şanslar!
wwnick

Çoklu tanımlama görevleri için +1. JavaScript API'sı için bunları dojo.DeferredList ile yönetebilirsiniz (birden çok queryTasks için de geçerlidir).
Derek Swingley

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.