ATTENTION: bien que la méthode de @Lavabeams fonctionne parfaitement (je l'ai adaptée à mes besoins sans aucun problème), le chargement de la couche kml NE FONCTIONNE TOUJOURS PAS correctement. Apparemment, en fonction de la durée d'analyse de votre kml dynamique, le processus d'actualisation de la couche expire et considère que la couche est chargée.
par conséquent, il est sage d'utiliser également un écouteur d'événement de chargement (avant d'ajouter une couche à la carte) et de vérifier ce qui a été effectivement chargé et s'il correspond aux attentes.
ci-dessous un très simple vérification:
var urlKMLStops = 'parseKMLStops12k.php';
var layerKMLStops = new OpenLayers.Layer.Vector("Stops", {
strategies: [new OpenLayers.Strategy.Fixed({ preload: true })],
protocol: new OpenLayers.Protocol.HTTP({
url: urlKMLStops,
format: new OpenLayers.Format.KML({
extractStyles: true,
extractAttributes: true,
maxDepth: 2
})
})
});
layerKMLStops.events.register("loadend", layerKMLStops, function() {
var objFs = layerKMLStops.features;
if (objFs.length > 0) {
alert ('loaded '+objFs.length+' '+objFs[0]+' '+objFs[1]+' '+objFs[2]);
} else {
alert ('not loaded');
UpdateKmlLayer(layerKMLStops);
}
});
avec la couche kml dynamique rafraîchissante, vous pouvez parfois obtenir que des résultats partiels, vous pouvez également vérifier si le nombre de fonctions chargées est égal au nombre attendu de caractéristiques . Mots de prudence: puisque cet écouteur boucle, utilisez un compteur pour limiter le nombre de tentatives de rechargement.
ps: vous pouvez également faire couche rafraîchir une tâche asynchrone en utilisant:
setTimeout(UpdateKmlLayer(layerKMLStops),0);
dernier état du navigateur sur le code ci-dessus: fonctionne bien sur le chrome 20.01132.47, pas sur Firefox 13.0.1 si vous appeler simultanément diverses fonctions (pour charger plusieurs couches kml dynamiques [piste, arrêts, poi]) en utilisant setTimeout.
EDIT: mois plus tard, je ne suis pas totalement satisfait de cette solution. donc j'ai creted 2 étapes intermédiaires qui garantissent que je charge toutes mes données:
- au lieu de tirer le fichier php directement, je fais de l'analyseur php kml un fichier kml. J'utilise ensuite un simple lecteur php pour lire ce fichier.
pourquoi cela fonctionne mieux:
attendant le fichier php pour analyser comme une source pour une couche kml, souvent dehors. MAIS, si vous appelez l'analyseur PHP en tant qu'appel ajax, il devient synchrone et votre code attend que l'analyseur php termine son travail, avant d'actualiser la couche.
étant donné que le fichier kml a déjà été analysé et enregistré lors de mon actualisation, mon simple lecteur php n'expire pas.
également, puisque vous n'avez pas besoin de boucler la couche autant de fois (vous réussissez généralement la première fois), même si le traitement prend plus de temps, il fait les choses la première fois (habituellement - je vérifie toujours si les fonctionnalités ont été chargées).
<?php
session_start();
$buffer2 ="";
// this is for /var/www/ztest
// for production, use '../kmlStore
$kmlFile = "fileVault/".session_id()."/parsedKML.kml";
//echo $kmlFile;
$handle = @fopen($kmlFile, "r");
if ($handle) {
while (($buffer = fgets($handle, 4096)) !== false) {
$buffer2 .= $buffer;
}
echo $buffer2;
if (!feof($handle)) {
echo "Error: unexpected fgets() fail\n";
}
fclose($handle);
}
?>
Ma réponse était beaucoup plus ancienne mais c'est mieux maintenant. Actualisé. – Sphvn