2011-01-02 3 views
3

J'ai un fichier KML qui contient dans chaque nœud <Placemark> un nœud <ExtendedData>, puis un nombre de nœuds <Data> avec des paires clé/valeur. J'ai suivi les exemples à: http://code.google.com/apis/kml/documentation/extendeddata.html et code.google.com/apis/kml/documentation/kmlelementsinmaps.html suggère des cartes supporte les nœuds KML ExtendedData (quoique partiellement), mais je n'arrive pas à trouver un moyen d'accéder à l'objet ExtendedData via javascript. J'utilise:Accès aux informations ExtendedData via l'API Google Maps v3

google.maps.event.addListener(agency_layer, 'click', function(kmlEvent) { 
    console.debug(kmlEvent); 
} 

(où agency_layer est l'objet KML). kmlEvent contient toutes les données de fonctionnalité KML, mais pas les données étendues, et je me gratte la tête. Je veux rendre mon KML sémantiquement sensé, plutôt que de charger plus de données dans la description et de l'analyser plus tard avec javascript.

est-ce que quelqu'un a eu une expérience similaire, ou sait comment accéder aux nœuds ExtendedData via Google Maps API v3?

Répondre

0

Je cherche la même chose. Vous pouvez voir ce que les données sont renvoyées en utilisant la fonction JSON.stringify() sur l'objet kmlEvent:

alert(JSON.stringify(kmlEvent));  

ExtendedData noeuds sont partiellement pris en charge en fonction de la page KML Elements Supported in Google Maps mais je dois encore comprendre comment les utiliser correctement.

+0

Oui, il est dit "non typé seulement" est supporté pour ExtendedData, mais je n'arrive pas à le trouver dans l'objet. –

2

Je cherchais exactement la même chose. J'ai construit une solution jQuery à partir des informations que j'ai trouvées here.

Étant donné que jQuery peut facilement analyser XML et que kml est xml, cela marche plutôt bien. Voici la fonction que j'ai écrite.

function extendedDataToArray(feature) 
{ 
    var returnArray = new Array(); 
    $(feature.getKml()).find("Data").each(function() 
    { 
     returnArray[$(this).attr("name")] = $(this).find("value").text(); 
    } 
    ); 
    return returnArray; 
} 

La fonction retourne un tableau associatif avec les touches correspondant aux noms de vos éléments de données et les valeurs que le contenu de vos balises de valeur. J'espère que cela t'aides!

+0

Merci pour la suggestion d'analyser le KML en utilisant JQuery, le problème est que les nœuds ExtendedData sont retirés lors du chargement via l'API Google Maps, donc je ne peux même pas voir ces données. J'ai fini par accéder directement au fichier KML (similaire à celui-ci) et laisser tomber chaque pin manuellement, plutôt que d'utiliser la fonctionnalité KML dans l'API Google Maps :( –

+0

C'est vraiment dommage: /. Je travaille dans l'API Google Earth, et jusqu'ici il a gardé le kml intact pour chaque Placemark – Alkix

+0

+1 Par ailleurs, JavaScript n'a pas de tableaux associatifs Vous devez déclarer 'returnArray' comme objet' {} '. –

0

Une autre solution peut transmettre des données dans la description du repère et dans la description du prétraitement lorsqu'il doit être utilisé.

/* 
<Placemark> 
    <name></name> 
    <description><![CDATA[ 
    Lorem Ipsum [data]{"datakey":524}[/data] 
    ]]> 
    </description> 
    <Point> 
     <coordinates>COORDINATES</coordinates> 
    </Point> 
</Placemark> 
*/ 
    var map_overlay = new google.maps.KmlLayer(
     'URL_TO_KML_FILE', 
     { 
      'suppressInfoWindows': true 
     } 
    ); 
    map_overlay.setMap(gmap); 

    var placemarkInfo = new google.maps.InfoWindow(); 
    google.maps.event.addListener(map_overlay, 'click', function (kmlEvent) { 

     var text_to_process = kmlEvent.featureData.description, 
     matches = text_to_process.match(/\[data\](.*)\[\/data\]/), 
     json_data_string = matches[1], 
     json_data = JSON.parse(json_data_string), 
     real_description = text_to_process.split('[data]')[0]; 

     alert(json_data.datakey); 

     placemarkInfo.setContent(real_description); 
     placemarkInfo.setPosition(kmlEvent.latLng); 
     placemarkInfo.open(gmap); 

    });