On 2010-11-25 19:45, Danny Backx wrote:
On Thu, 2010-11-25 at 14:17 +0100, Lambertus wrote:
If there is interest in my script (PHP) then I can clean it up a bit and
post it here.
Yes please.
Danny
The script is attached. I've added some inline comments and hope all is
clear. Don't hesitate to ask if you have any questions.
= 10) {
echo "Splitting $tileid with nodes=$nodes, starting at $mapid. Max id was $maxid, level = $level\n";
$command = "java -Xmx1792M -jar ~/garmin/utils/splitter/splitter.jar --no-trim --mapid=".$mapid." --max-nodes=".$nodes." --write-kml=".$tileid.".kml --geonames-file=$cities $tileid.osm.gz";
passthru($command);
$newtileid = $maxid;
// Determine the maximum id produced by the split
$newmaxid = getMaxSourceId();
// require at least two sub files
if (($newmaxid - $maxid) < 2) {
echo "The split did not result in at least two subtiles, try again with less nodes per tile\n";
$level++;
$newmaxid = subsplit($tileid, $maxid, $level);
} else {
// Render the new source files
$maxid++;
$tiles = $newmaxid - $maxid;
for ($i = 0; $i <= $tiles; $i++) {
echo "Start a new recursive render with $maxid, $newmaxid, $level, $nodes\n";
$newmaxid = render($maxid, $newmaxid, $level);
$maxid++;
}
echo "Done with subsplit at level $level\n";
}
} else {
echo "Subsplitting passed the minimum node count. Giving up\n";
$newmaxid = $maxid;
}
return $newmaxid;
}
// Return the number of the file with the highest filenumber
function getMaxSourceId() {
$maxid = 0;
$ids = getSourceIds();
foreach ($ids as $id) {
if ($id > $maxid)
$maxid = $id;
}
return $maxid;
}
// Return the available filenumbers
function getSourceIds() {
$ids = array();
foreach (glob("*.osm.gz") as $filename) {
$parts = explode(".", $filename);
$ids[] = $parts[0];
}
return $ids;
}
// Delete a directory tree. Please ensure $dir ends with a slash
function delTree($dir) {
$files = glob( $dir . '*', GLOB_MARK );
foreach( $files as $file ){
if( substr( $file, -1 ) == '/' )
delTree( $file );
else
unlink( $file );
}
rmdir( $dir );
}
/*
* Below are some functions to update the list of available tiles from the initial split with the subsplit results
*/
function simplexml_append(SimpleXMLElement $parent, SimpleXMLElement $new_child){
$node1 = dom_import_simplexml($parent);
$dom_sxe = dom_import_simplexml($new_child);
$node2 = $node1->ownerDocument->importNode($dom_sxe, true);
$node1->appendChild($node2);
}
function simplexml_replace(SimpleXMLElement $parent, SimpleXMLElement $new_child){
$node1 = dom_import_simplexml($parent);
$dom_sxe = dom_import_simplexml($new_child);
$node2 = $node1->ownerDocument->importNode($dom_sxe, true);
$node1->parentNode->replaceChild($node2,$node1);
}
function updateKml($name) {
$kmlRed = "
";
$kmlBlue = "
";
// Load the original KML file
if (file_exists("$name.kml")) {
$xml = simplexml_load_file("$name.kml");
} else {
exit("Failed to open $name.kml.");
}
// loop through all KML files to update the original KML file
foreach (glob("*.kml") as $replacement) {
if (strpos($replacement, $name) === false) {
$id = explode(".", $replacement);
// Load each new KML file
$newxml = simplexml_load_file($replacement);
foreach ($xml->Document->Placemark as $oldPlacemark) {
if (strpos($oldPlacemark->name, $id[0]) !== false) {
// This KML file contains subtiles -> delete the tile they replace
$
$oNode->parentNode->removeChild($oNode);
break;
}
}
// Add the subtiles
foreach ($newxml->Document->Placemark as $newPlacemark) {
simplexml_append($xml->Document, $newPlacemark);
}
}
}
// Determine which tiles actually exist (update KML rendering)
$red = simplexml_load_string($kmlRed);
$blue = simplexml_load_string($kmlBlue);
simplexml_replace($xml->Document->Style, $red);
simplexml_append($xml->Document, $blue);
foreach ($xml->Document->Placemark as $tile) {
$id = $tile->name;
if (file_exists($id.".img") == true) {
$tile->styleUrl = "#Blue";
} else {
$tile->styleUrl = "#Red";
}
}
// Write out the new version of the KML file
$fh = fopen("$name.kml.1", "w+");
if ($fh) {
fwrite($fh, $xml->asXML());
fclose($fh);
}
// rename original KML file to old
rename("$name.kml", "$name.kml.old");
// rename new KML file to original
rename("$name.kml.1", "$name.kml");
}
/* The original Mkgmap commandline from the render() function:
* $output = passthru("ulimit -t 600 && java -Xmx1792M -ea -jar ~/garmin/utils/mkgmap/mkgmap.jar --adjust-turn-headings --latin1 --name-tag-list=name:en,int_name,name:zh_py,name:engels,name --remove-short-arcs --add-pois-to-areas --make-opposite-cycleways --link-pois-to-ways --route --description='OSM World Routable' --series-name='OSM World Routable' --input-file=$file", $retval);
*/
?>