ВНИМАНИЕ: хотя метод @Lavabeams работает отлично (я адаптировал его под свои нужды без проблем), загрузка слоя kml НЕ ВСЕГДА ЗАВЕРШАЕТСЯ должным образом.
очевидно, в зависимости от того, сколько времени занимает анализ динамического kml, процесс обновления слоя прерывается и считает загруженный слой.
поэтому целесообразно также использовать прослушиватель событий загрузки (перед добавлением слоя на карту) и проверить, что было эффективно загружено и соответствует ли оно ожиданиям.
ниже очень простой проверки:
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);
}
});
при динамическом обновлении слоя kml иногда вы можете получить только частичные результаты, поэтому вы можете также проверить, равно ли число загруженных объектов ожидаемому числу объектов.
предостерегающие слова: поскольку этот слушатель зацикливается, используйте счетчик, чтобы ограничить количество попыток перезагрузки.
ps: вы можете также захотеть сделать обновление слоя асинхронной задачей, используя:
setTimeout(UpdateKmlLayer(layerKMLStops),0);
последнее состояние браузера в приведенном выше коде: хорошо работает в chrome 20.01132.47, а не в firefox 13.0.1, если вы одновременно вызываете различные функции (для загрузки нескольких динамических слоев kml [track, stop, poi's]), используя setTimeout.
РЕДАКТИРОВАТЬ: несколько месяцев спустя я не полностью удовлетворен этим решением. поэтому я сделал 2 промежуточных шага, которые гарантируют, что я загружу все свои данные:
- вместо того, чтобы извлекать файл php напрямую, я заставляю парсер php kml сохранять файл kml. Затем я использую простую программу чтения PHP, чтобы прочитать этот файл.
почему это работает лучше:
ожидание, пока php-файл не будет проанализирован как источник для слоя kml, часто заканчивается. НО, если вы вызываете парсер php как вызов ajax, он становится синхронным, и ваш код ожидает, пока парсер php завершит свою работу, прежде чем приступить к обновлению слоя.
, так как файл kml уже был проанализирован и сохранен при обновлении, мой простой php reader не истекает.
также, так как вам не нужно проходить через слой столько раз (вы обычно добиваетесь успеха в первый раз), даже если обработка занимает больше времени, в первый раз все получается (обычно - я все еще проверяю, функции были загружены).
<?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);
}
?>