tag = 'Folder';
$this->items = array();
$this->children = array();
//set the minimum back
$this->setItem('name',$subjectPlacemark->getItem('name'));
if ($timestamp = $subjectPlacemark->getChild('TimeStamp')) {
$this->addChild(clone $timestamp,'','TimeStamp');
}
if ($subjectPlacemark->issetItem('visibility')) {
$this->setItem('visibility',$subjectPlacemark->getItem('visibility'));
}
//add the subject placemark
$this->addChild($subjectPlacemark);
//add the photographer placemark
$photographerPlacemark = $this->addChild(new kmlPlacemark(null,'Photographer'));
if (!empty($photographer)) {
$photographerPlacemark->setItemCDATA('description',"($photographer)");
}
$sbjPoint = $subjectPlacemark->getChild('Point');
//setup the sightline
$MultiGeometry = $photographerPlacemark->addChild('MultiGeometry');
$MultiGeometry->addChild($kmlPoint);
$LineString = $MultiGeometry->addChild('LineString');
$LineString->setItem('tessellate',1);
$LineString->setItem('altitudeMode','clampToGround');
$LineString->setItem('coordinates',$sbjPoint->getItem('coordinates')." ".$kmlPoint->getItem('coordinates'));
//seems a LookAt is required (but is nice to set the heading anyway!)
$LookAt = $photographerPlacemark->addChild('LookAt');
$this->addChild($LookAt);
$LookAt->setItem('longitude',$kmlPoint->lon);
$LookAt->setItem('latitude',$kmlPoint->lat);
$LookAt->setItem('tilt',70);
$LookAt->setItem('range',1000);
if (strlen($view_direction) && $view_direction != -1) {
$LookAt->setItem('heading',$view_direction);
} else {
$LookAt->setItem('heading',$kmlPoint->calcHeadingToPoint($sbjPoint));
}
$Style = $photographerPlacemark->addChild('Style');
$IconStyle = $Style->addChild('IconStyle');
$IconStyle->setItem('scale',0.7);
$Icon = $IconStyle->addChild('Icon');
$Icon->setItem('href',"http://maps.google.com/mapfiles/kml/pal4/icon46.png");
$LabelStyle = $Style->addChild('LabelStyle');
$LabelStyle->setItem('scale',0);
return $this;
}
public function addViewDirection($view_direction) {
$LookAt = $this->addChild('LookAt');
$sbjPoint = $this->getChild('Point');
$LookAt->setItem('longitude',$sbjPoint->lon);
$LookAt->setItem('latitude',$sbjPoint->lat);
$LookAt->setItem('tilt',70);
$LookAt->setItem('range',1000);
if (strlen($view_direction) && $view_direction != -1) {
$LookAt->setItem('heading',$view_direction);
} else {
$LookAt->setItem('heading',0);
}
}
}
class kmlPlacemark_Circle extends kmlPlacemark {
public function __construct($id,$itemname = '',$kmlPoint = null,$d = 10000) {
parent::__construct($id,$itemname,$kmlPoint);
if (is_object($kmlPoint)) {
$this->addCircle($kmlPoint,$d);
}
}
public function addCircle($kmlPoint,$d) {
if ($sbjPoint = $this->unsetChild('Point')) {
$MultiGeometry = $this->addChild('MultiGeometry');
$MultiGeometry->addChild($sbjPoint);
$LineString = $MultiGeometry->addChild('LineString');
} else {
$LineString = $this->addChild('LineString');
}
$coordinates = array();
// convert coordinates to radians
$lat1 = deg2rad($kmlPoint->lat);
$long1 = deg2rad($kmlPoint->lon);
//d in meters;
$d_rad = $d/6378137;
// loop through the array and write path linestrings
for($i=0; $i<360; $i+=12) {
$radial = deg2rad($i);
$lat_rad = asin(sin($lat1)*cos($d_rad) + cos($lat1)*sin($d_rad)*cos($radial));
$dlon_rad = atan2(sin($radial)*sin($d_rad)*cos($lat1), cos($d_rad)-sin($lat1)*sin($lat_rad));
$lon_rad = fmod(($long1+$dlon_rad + M_PI), 2*M_PI) - M_PI;
$coordinates[] = sprintf('%.6f,%.6f,0',rad2deg($lon_rad),rad2deg($lat_rad));
}
$coordinates[] = $coordinates[0];//join it back up by reusing the first point
$LineString->setItem('coordinates',join(' ',$coordinates));
}
}
#$_SERVER['HTTP_HOST'] = "www.geograph.org.uk";
function getKmlFilepath($extension,$level,$square = null,$gr='',$i = 0) {
#$i = 270727;
if (is_object($square)) {
$s = $square->gridsquare;
if ($level > 2) {
$n = sprintf("%d%d",intval($square->eastings/20)*2,intval($square->northings/20)*2);
}
} elseif (!empty($gr)) {
preg_match('/^([A-Z]{1,2})([\d_]*)$/',strtoupper($gr),$m);
$s = $m[1];
if ($level > 2) {
$numbers = $m[2];
$numlen = strlen($m[2]);
$c = $numlen/2;
$n = sprintf("%d%d",intval($numbers{0}/2)*2,intval($numbers{$c}/2)*2);
}
}
$base=$_SERVER['DOCUMENT_ROOT'].'/kml';
$prefix = "/kml";
$base2=$_SERVER['DOCUMENT_ROOT'].'/sitemap';
if ($i) {
$base .= "/$i";
$prefix .= "/$i";
$base2 .= "/$i";
}
if (!is_dir("$base/$s"))
mkdir("$base/$s");
if (!is_dir("$base2/$s"))
mkdir("$base2/$s");
if ($n && !is_dir("$base/$s/$n"))
mkdir("$base/$s/$n");
if ($n && !is_dir("$base2/$s/$n"))
mkdir("$base2/$s/$n");
if ($level == 3) {
return "$prefix/$s/$n.$extension";
} elseif ($level == 2) {
return "$prefix/$s.$extension";
} elseif ($level <= 1) {
return "$prefix/geograph.$extension";
} else {
if ($n && !is_dir("$base/$s/$n/$level"))
mkdir("$base/$s/$n/$level");
if ($n && !is_dir("$base2/$s/$n/$level"))
mkdir("$base2/$s/$n/$level");
return "$prefix/$s/$n/$level/$gr.$extension";
}
}
function kmlPageFooter(&$kml,&$square,$gr,$self,$level,$html = '',$list = '') {
global $db,$CONF;
if (isset($_GET['debug'])) {
print "Open in Google Earth
";
print "";
} elseif (isset($_GET['download'])) {
$kml->outputKML();
exit;
} else {
$file = getKmlFilepath($kml->extension,$level,$square,$gr);
$db->Execute("replace into kmlcache set `url` = '$self?gr=$gr',filename='$file',`level` = $level,`rendered` = 1");
$base=$_SERVER['DOCUMENT_ROOT'];
$kml->outputFile('kmz',false,$base.$file);
if ($html) {
$file = str_replace("kml",'sitemap',$file);
$file = str_replace("kmz",'html',$file);
if (!empty($list)) {
$s = "Photos in ".$list." :: Geograph British Isles";
} elseif (isset($square->grid_reference)) {
$s = "Photos in {$square->grid_reference} :: Geograph British Isles";
} elseif (!empty($gr)) {
$s = "Photos near ".$gr." :: Geograph British Isles";
} else {
$s = "Photos in ".$CONF['references_all'][0];
}
$file1 = getKmlFilepath($kml->extension,$level-1,$square,$gr);
$file1 = str_replace("kml",'sitemap',$file1);
$file1 = str_replace("kmz",'html',$file1);
$html = "
Homepage | Sitemap | Up one level | $s
". "