ATENCIÓN: mientras que el método de @Lavabeams funciona perfectamente bien (lo he adaptado a mis necesidades sin ningún problema), la carga de la capa kml NO SIEMPRE SE COMPLETA correctamente.
aparentemente, dependiendo de cuánto tiempo lleva analizar el kml dinámico, el proceso de actualización de capa expira y considera la capa cargada.
por lo tanto, es aconsejable usar también un oyente de eventos de carga (antes de agregar capa al mapa) y verificar lo que se cargó efectivamente y si coincide con las expectativas.
por debajo de un muy simple comprobación:
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);
}
});
con capa KML dinámico refrescante, a veces se puede obtener sólo resultados parciales, así que sería bueno también comprobar si el número de elementos cargados es igual al número esperado de características .
palabras de advertencia: dado que este oyente realiza un bucle, use un contador para limitar el número de intentos de recarga.
PS: También puede ser que desee para hacer la capa actualizar una tarea asíncrona mediante el uso de:
setTimeout(UpdateKmlLayer(layerKMLStops),0);
estado más reciente del navegador de código anterior: Funciona bien en cromo 20.01132.47, no en Firefox 13.0.1 si invocar simultáneamente varias funciones (para cargar múltiples capas kilométricas [track, stops, poi's]) usando setTimeout.
EDITAR: meses después, no estoy totalmente satisfecho con esta solución. así creé 2 pasos intermedios que garantizan que cargue todos mis datos:
- en lugar de tirar el archivo php directamente, hago que el analizador php kml guarde un archivo kml. Luego uso un simple lector php para leer este archivo.
por qué esto funciona mejor:
esperando el archivo php para analizar como origen de una capa KML, a menudo el tiempo de espera. PERO, si llamas al analizador php como una llamada ajax, se convierte en sincrónico y tu código espera a que el analizador php complete su trabajo, antes de proceder a actualizar la capa.
ya que el archivo kml ya se ha analizado y guardado cuando actualizo, mi lector php simple no agota el tiempo de espera.
también, ya que no tiene que pasar por la capa tantas veces (por lo general tiene éxito la primera vez), aunque el procesamiento lleva más tiempo, hace las cosas la primera vez (por lo general, sigo controlando si las características fueron cargadas).
<?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);
}
?>
Mi respuesta fue mucho más antigua, pero ahora es mejor. Actualizado. – Sphvn