2012-08-02 9 views
5

मैं कई बड़े KML डेटा सेट्स, जो इस क्षेत्र आधारित नेटवर्क-लिंक का एक पदानुक्रम का उपयोग कर सेवा कर रहे हैं है, KML reference में वर्णित हैं:क्षेत्र के आधार पर Google Earth API में नेटवर्क लिंक

networklinks साथ संयोजन के रूप में क्षेत्र का उपयोग करना, आप जिनमें से प्रत्येक एक विशिष्ट उप-क्षेत्र को इंगित करता है, संकेत के एक पदानुक्रम बना सकते हैं। <viewRefreshMode>, जैसा कि निम्न केएमएल फ़ाइल में दिखाया गया है, पर एक ऑनऑर्गियन विकल्प है, जो क्षेत्र सक्रिय होने पर केवल क्षेत्र डेटा लोड करने के लिए निर्दिष्ट करता है। यदि आप विस्तार के कई स्तरों के साथ नेस्टेड क्षेत्र प्रदान करते हैं, तो डेटा की बड़ी मात्रा केवल तभी लोड की जाती है जब उपयोगकर्ता का दृष्टिकोण अगले लोड को ट्रिगर करता है।

यह Google धरती में लोड होने पर अच्छी तरह से काम करता है।

मैं अब Google Earth plug-in का उपयोग कर एक आवेदन में इन लोड करने के लिए कामना करता हूं। और मुझे Google Earth API के माध्यम से लोड की गई सामग्री तक पहुंचने की आवश्यकता है; (यानी आवेदन में सामग्री को एकीकृत करने के लिए क्लिक ईवेंट संलग्न करें, शैलियों को बदलें)।

मुद्दा है, मैं नेटवर्क लिंक के लिए एक 'ऑन लोड' घटना के लिए किसी भी संदर्भ नहीं मिला है। मेरे मन में, जिस तरह से यह काम होता है: एपीआई के माध्यम से

  • लोड उच्च-स्तरीय नेटवर्क लिंक, एक कॉल-बैक समारोह जो जब नेटवर्क लिंक भरी हुई है सक्रिय किया जाएगा संलग्न।
  • कॉल-बैक फ़ंक्शन में, नेटवर्क लिंक द्वारा केएमएल को वापस पार्स करें। क्षेत्रीय पदानुक्रम में मध्यवर्ती स्तर के लिए, इस केएमएल में अगले क्षेत्र स्तर के लिए केवल नेटवर्क लिंक होंगे। इन्हें एपीआई के माध्यम से प्लग-इन में लोड करें, फिर उसी कॉल-बैक फ़ंक्शन को निर्दिष्ट करें, जो इन्हें लोड होने पर लागू किया जाएगा (यानी जब उनका क्षेत्र दृश्यमान हो)।
  • आखिरकार, एम एल वास्तविक 'सामग्री' में शामिल होंगे लौट आए। इस चरण में हम किसी भी वांछित संशोधन करने के बाद वास्तविक सामग्री (यानी प्लेसमार्क) को प्लग-इन में लोड करते हैं (उदा। ईवेंट-श्रोताओं को जोड़ना, शैलियों को सेट करना आदि)।

मुझे लगता है कि जावास्क्रिप्ट निम्नलिखित की तरह कुछ दिखता है।
कृपया ध्यान दें: यह मेरे प्रश्न को समझने में सहायता करने के लिए सिर्फ एक मोटा स्केच है। मैं कर रहा हूँ नहीं क्यों इस कोड काम नहीं करता पूछ।

//create network link 
var networkLink = ge.createNetworkLink(""); 
networkLink.setName("Regionated hierarchy root"); 

// create a Link object 
//the network-links contained in the kml that will be returned in this file 
//are region-based; they will only be loaded when the user zooms into the relevant 
//region. 
var link = ge.createLink(""); 
link.setHref("http://foo.com/regionatedRoot.kml"); 

// attach the Link to the NetworkLink 
networkLink.setLink(link); 

//specify the callback function to be invoked when the network link is loaded 
//this is is the part that doesn't actually exist; pure fiction... 
networkLink.onLoad = networkLinkLoaded; 

// add the NetworkLink feature to Earth 
ge.getFeatures().appendChild(networkLink); 

// function which will be invoked when a network-link is loaded 
// i.e. when its region becomes active 
function networkLinkLoaded(kml) { 

    //parse the kml returned for child network links, 
    //this will create the network link KmlObject, with a 
    //region specified on it. 
    for (childNetworkLink in parseNetworkLinks(kml)) { 
     //and append them, again hooking up the call-back 
     childNetworkLink.onLoad = networkLinkLoaded; 
     ge.getFeatures().appendChild(childNetworkLink); 
    } 

    //if the user has zoomed in far enough, then the kml returned will 
    //contain the actual content (i.e. placemarks). 
    //parse the kml returned for content (in this case placemarks) 
    for (placemark in parsePlacemarks(kml)) { 
     //here we would attach event-listeners to the placemark 
     ge.getFeatures().appendChild(placemark); 
    } 
} 

क्या यह संभव है?
क्या मैंने अपनी सोच में गलत मोड़ लिया है? मेरा मानना ​​है कि मैंने बड़े केएमएल डेटासेट के प्रबंधन के लिए अनुशंसित प्रथाओं का पालन किया है, लेकिन मुझे एपीआई के माध्यम से इनका उपयोग करने के बारे में अनिश्चितता है।

परिशिष्ट:

समस्या मैं हल करने के लिए कोशिश कर रहा हूँ के प्रकार का एक उदाहरण के रूप में: कल्पना कीजिए कि आप Google धरती प्लग इन का उपयोग कर एक वेब अनुप्रयोग का निर्माण कर रहे हैं, और आप हर सेट के लिए एक स्थान-चिह्न प्रदर्शित करना चाहते हैं दुनिया में यातायात-रोशनी के। प्लेसमार्क केवल उचित स्तर के विवरण पर प्रदर्शित होना चाहिए (उदाहरण के लिए जब कैमरा 5 किमी ऊंचाई पर होता है)। जब कोई उपयोगकर्ता किसी प्लेमार्क पर क्लिक करता है, तो हम चाहते हैं कि वेब ऐप ट्रैफिक-लाइट के उस सेट के आंकड़े लोड करे, और उन्हें साइडबार में प्रदर्शित करें।

आप यह कैसे इंजीनियर हैं?

उत्तर

1

आप सीधे आप की आवश्यकता सुविधा प्रदान करने के वस्तु डेटा तक पहुँच की जरूरत नहीं होगी। क्षेत्र-आधारित नेटवर्क-लिंक के पदानुक्रम का उपयोग करके आप डेटा लोड को ठीक तरह से संभालेंगे। फिर यदि आपका उपयोग परिदृश्य आपके परिशिष्ट में सेट किए गए जैसा है, तो आप बस आवश्यक ईवेंट के आधार पर अपने सांख्यिकीय डेटा को लोड करने के लिए क्लिक ईवेंट से लक्ष्य डेटा का उपयोग करेंगे।

उदाहरण के लिए, आप विंडो ऑब्जेक्ट पर बस एक सामान्य मूसडाउन ईवेंट हैंडलर सेट कर सकते हैं और फिर यह देखने के लिए परीक्षण कर सकते हैं कि लक्ष्य एक स्थल चिह्न है या नहीं। आप किसी भी डेटा को लोड करने से पहले इस जेनेरिक श्रोता को जोड़ सकते हैं और जब भी आप अपने गतिशील रूप से लोड किए गए प्लेस पर क्लिक करते हैं तो इसे अभी भी निकाल दिया जाएगा। अलग-अलग ईवेंट-श्रोताओं को प्लेसमार्क पर संलग्न करने की कोई आवश्यकता नहीं है।

उदा।

window.google.earth.addEventListener(ge.getWindow(), 'mousedown', onWindowMouseDown); 

var onWindowMouseDown = function(event) { 
    if (event.getTarget().getType() == 'KmlPlacemark') { 
    // get the placemark that was clicked 
    var placemark = event.getTarget(); 

    // do something with it, or one of its relative objects... 
    var document = placemark.getOwnerDocument(); 
    var parent = placemark.getParentNode(); 

    // etc... 
    } 
} 
+0

आप सही हैं। 'ग्लोबल' लेवल इवेंट-हैंडलर सेट अप करके, मैं ईवेंट को संभालने का तरीका निर्धारित करने के लिए लक्ष्य आईडी पर फ़िल्टर कर सकता हूं। धन्यवाद! –

+0

कोई चिंता नहीं, मदद करने में खुशी हुई। – Fraser

0

सुनिश्चित नहीं हैं कि अगर यह है आप काफी क्या चाहते हैं लेकिन वहाँ एक kmltree एपीआई कि होगा है:

  1. kml पेड़ बाहर निर्माण के लिए दी
  2. अनुमति देते हैं आप के लिए एक 'kmlloaded है kml के आधार पर 'ईवेंट हैंडलर

http://code.google.com/p/kmltree/

function initCB(instance){ 
    ge = instance; 
    ge.getWindow().setVisibility(true); 

    var gex = gex = new GEarthExtensions(ge); 

    var tree = kmltree({ 
     url: 'http://foo.com/regionatedRoot.kml', 
     gex: gex, 
     mapElement: $('#map3d'), 
     element: $('#tree'), 
    }); 

    $(tree).bind('kmlLoaded', function(event, kmlObject){ //do something here }); 

    tree.load(); 
} 

यह की आवश्यकता होती है आप एक और जेएस एपीआई लाने के लिए लेकिन यह बहुत अच्छा काम करता है और आपको कार्यक्षमता में कुछ अच्छा बनाया गया है।

अब तक मैं कुछ भी बस से प्लग में जब kml भरी हुई है कि एक ईवेंट सक्रिय करेगा ...

आप) fetchKml (उपयोग करने का प्रयास करने के लिए सक्षम हो सकता है खासकर यदि आप हार्डकोड कर रहे हैं नहीं मिला है उस लिंक के लिए यूआरएल?

google.earth.fetchKml(ge, 'http://foo.com/regionatedRoot.kml', function(kmlObject){ 
    //do logic here 
}); 
+0

उत्तर मैट के लिए धन्यवाद। मैंने KmlTree परियोजना को देखा है; लेकिन मुझे विश्वास नहीं है कि यह इस मुद्दे को संबोधित करता है। यह एक पेड़-मेनू में केएमएल को पार्स करने के बारे में प्रतीत होता है। मुझे विश्वास नहीं है कि यह क्षेत्र-आधारित नेटवर्क लिंक को संभालता है? मैंने समस्या के प्रकार के उदाहरण के साथ, मेरे प्रश्न में एक परिशिष्ट जोड़ा है जिसे मैं हल करने की कोशिश कर रहा हूं। –

संबंधित मुद्दे