2012-08-02 12 views
5

Ho molti grandi insiemi di dati KML, che vengono serviti utilizzando una gerarchia di collegamenti di rete basati sulla regione; come descritto nella KML reference:Collegamenti di rete basati sulla regione nell'API di Google Earth

Utilizzando Regioni in collaborazione con networklinks, è possibile creare una gerarchia di puntatori, ognuno dei quali fa riferimento a uno specifico sub-regione. Lo <viewRefreshMode>, come mostrato nel seguente file KML, ha un'opzione onRegion, che specifica di caricare i dati Region solo quando Region è attivo. Se fornisci regioni nidificate con più livelli di dettaglio, quantità maggiori di dati vengono caricate solo quando il punto di vista dell'utente attiva il carico successivo.

Funziona bene quando caricato in Google Earth.

Ora desidero caricarli in un'applicazione utilizzando Google Earth plug-in. E ho bisogno di accedere ai contenuti caricati tramite l'API di Google Earth; (Ad esempio, allegare eventi di clic, alterare stili) per integrare il contenuto nell'applicazione.

Il problema è che non ho trovato alcun riferimento a un evento 'on-load' per i collegamenti di rete. Nella mia mente, il modo in cui funzionerebbe è:

  • Caricare il collegamento di rete di livello superiore tramite l'API, allegando una funzione di richiamata che verrà richiamata quando viene caricato il collegamento di rete.
  • Nella funzione di richiamata, analizzare il KML restituito dal collegamento di rete. Per i livelli intermedi nella gerarchia della regione, questo KML conterrà solo i collegamenti di rete al livello di regione successivo. Caricali nel plug-in tramite l'API, specificando nuovamente la stessa funzione di richiamata, che verrà richiamata quando questi vengono caricati (ad esempio quando la loro area diventa visibile).
  • Alla fine, il file KML restituito conterrà il "contenuto" effettivo. In questa fase cariciamo il contenuto effettivo (cioè i segnaposto) nel plug-in, dopo aver apportato le modifiche desiderate (ad esempio allegando i listener di eventi, gli stili di impostazione e così via).

Sto pensando che il javascript sarebbe simile al seguente.
Nota: questo è solo un abbozzo per aiutare a capire la mia domanda. I am NON chiedendo perché questo codice non funziona.

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

È possibile?
Ho preso una svolta sbagliata nel mio modo di pensare? Credo di aver seguito le pratiche consigliate per la gestione di set di dati KML di grandi dimensioni, ma non sono sicuro di come utilizzarle tramite l'API.

Addendum:

Come esempio del tipo di problema che sto cercando di risolvere: Immaginate si sta costruendo un'applicazione web utilizzando il plug-in di Google Earth, e si desidera visualizzare un segnaposto per ogni set di semafori nel mondo. I segnaposto devono essere visualizzati solo con un livello di dettaglio appropriato (ad esempio quando la telecamera si trova a un'altitudine di 5 km). Quando un utente fa clic su un segnaposto, vogliamo che l'app Web carichi statistiche per quel set di semafori e li visualizzi in una barra laterale.

Come progetteresti questo?

risposta

1

Non è necessario accedere direttamente ai dati dell'oggetto per fornire la funzionalità richiesta. Dovresti gestire il caricamento dei dati esattamente come hai fatto, usando una gerarchia di collegamenti di rete basati sulla regione. Quindi se lo scenario di utilizzo è simile a quello specificato nell'appendice, utilizzare semplicemente i dati di destinazione dall'evento clic per caricare i dati statistici in base ai segnaposto, come richiesto.

Ad esempio, è possibile semplicemente impostare un gestore di eventi generici per il mouse sull'oggetto della finestra e quindi verificare se il target è un segnaposto. Puoi aggiungere questo listener generico prima di caricare qualsiasi dato e verrà comunque attivato quando fai clic sui segnaposto caricati dinamicamente. Non è necessario collegare i singoli ascoltatori di eventi ai segnaposto.

ad es.

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

Hai ragione. Impostando gestori di eventi di livello 'globale', posso quindi filtrare l'ID di destinazione per determinare come gestire l'evento. Grazie! –

+0

Nessun problema, felice di aver aiutato. – Fraser

0

Non sono sicuro se questo è abbastanza ciò che si vuole, ma c'è un api kmltree che sarà:

  1. costruire fuori l'albero kml per voi in base al kml dato
  2. ti permettono di avere un 'kmlloaded 'gestore di eventi

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

se richiede per portare in un altro js api ma funziona piuttosto bene e ti dà alcune buone funzionalità incorporate.

Finora non ho trovato nulla solo dal plug-in che sarà generare un evento quando il kml viene caricato ...

si potrebbe essere in grado di provare a utilizzare fetchKml() soprattutto se si è brutalmente quell'URL per il link lì dentro?

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

Grazie per la risposta Matt. Ho esaminato il progetto KmlTree; ma non credo che affronti il ​​problema. Sembra che si tratti di analizzare KML in un menu ad albero. Non credo che gestisca i collegamenti di rete basati sulla regione? Ho aggiunto un addendum alla mia domanda, con un esempio del tipo di problema che sto cercando di risolvere. –

Problemi correlati