// build quadrant representation
function build_q($x, $y, $z, $chars = '0123')
{
$s = '';
for ($i=($z-1); $i>=0; $i--)
$s .= $chars[((($y >> $i) & 1) << 1) + (($x >> $i) & 1)];
return $s;
}
function build_url($x, $y, $z, $t)
{
if ($t == 'goog_map')
return 'http://mt'.(($x+$y)&3).'.google.com/mtv=w2.99&x='.$x.'&y='.$y.'&zoom='.(17-$z).'';
elseif ($t == 'goog_sat')
return 'http://kh'.(($x+$y)&3).'.google.com/khv=99&t=t'.build_q($x, $y, $z, 'qrts').'';
elseif ($t == 'goog_hyb')
return 'http://mt'.(($x+$y)&3).'.google.com/mtv=w2t.99&x='.$x.'&y='.$y.'&zoom='.(17-$z).'';
elseif ($t == 'goog_ter')
return 'http://mt'.(($x+$y)&3).'.google.com/mtv=w2p.99&x='.$x.'&y='.$y.'&zoom='.(17-$z).'';
elseif ($t == 'ditu')
return 'http://servicetile.mapabc.com/googlechina/maptilev=cn1&x='.$x.'&y='.$y.'&zoom='.(17-$z).'';
elseif ($t == 'msn_map')
return 'http://r'.((($y&1)<<1)+($x&1)).'.ortho.tiles.virtualearth.net/tiles/r'.build_q($x, $y, $z).'.pngg=131';
elseif ($t == 'msn_sat')
return 'http://a'.((($y&1)<<1)+($x&1)).'.ortho.tiles.virtualearth.net/tiles/a'.build_q($x, $y, $z).'.pngg=131';
elseif ($t == 'msn_hyb')
return 'http://h'.((($y&1)<<1)+($x&1)).'.ortho.tiles.virtualearth.net/tiles/h'.build_q($x, $y, $z).'.pngg=131';
elseif ($t == 'msn_ter')
return 'http://r'.((($y&1)<<1)+($x&1)).'.ortho.tiles.virtualearth.net/tiles/r'.build_q($x, $y, $z).'.pngg=131&shading=hill';
elseif ($t == 'msn_brasil')
return 'http://img'.((($y&1)<<1)+($x&1)+1).'.maplink3.com.br/MapaVE.aspxv=r|'.((($y&1)<<1)+($x&1)+1).'|r|'.build_q($x, $y, $z).'|png|66';
elseif ($t == 'y_map')
return 'http://png.maps.yimg.com/pngv=4.1&t=m&s=256&f=j&x='.$x.'&y='.(((1<<$z)>>1)-1-$y).'&z='.(18-$z).'';
elseif ($t == 'y_sat')
return 'http://aerial.maps.yimg.com/ximgv=1.7&t=a&s=256&x='.$x.'&y='.(((1<<$z)>>1)-1-$y).'&z='.(18-$z).'';
elseif ($t == 'y_hyb')
return 'http://aerial.maps.yimg.com/tilev=2.5&t=p&x='.$x.'&y='.(((1<<$z)>>1)-1-$y).'&z='.(18-$z).'';
elseif ($t == 'y_map_in')
return 'http://tile.in.maps.yahoo.com/tileimgtype=png&v=0.96&x='.$x.'&y='.(((1<<$z)>>1)-1-$y).'&z='.(18-$z).'';
elseif ($t == 'y_hyb_in')
return 'http://aerial.in.maps.yahoo.com/tileimgtype=png&v=0.93&x='.$x.'&y='.(((1<<$z)>>1)-1-$y).'&z='.(18-$z).'';
elseif ($t == 'ask_map')
return 'http://'.(($z<11) ? 'mapstatic' : 'mapcache').(1+(($x+$y)&3)).'.ask.com/map/'.(19-$z).'/'.($x-((1<<$z)>>1)).'/'.($y-((1<<$z)>>1)).'partner=&tc=28';
elseif ($t == 'ask_sat')
return 'http://'.(($z<11) ? 'mapstatic' : 'mapcache').(1+(($x+$y)&3)).'.ask.com/sat/'.(19-$z).'/'.($x-((1<<$z)>>1)).'/'.($y-((1<<$z)>>1)).'partner=&tc=28';
elseif ($t == 'ask_hyb')
return 'http://'.(($z<11) ? 'mapstatic' : 'mapcache').(1+(($x+$y)&3)).'.ask.com/mapt/'.(19-$z).'/'.($x-((1<<$z)>>1)).'/'.($y-((1<<$z)>>1)).'partner=&tc=28';
elseif ($t == 'ask_phy')
return 'http://'.(($z<11) ? 'mapstatic' : 'mapcache').(1+(($x+$y)&3)).'.ask.com/phy/'.(19-$z).'/'.($x-((1<<$z)>>1)).'/'.($y-((1<<$z)>>1)).'partner=&tc=28';
elseif ($t == 'osm_m')
return 'http://tile.openstreetmap.org/'.$z.'/'.$x.'/'.$y.'.png';
elseif ($t == 'osm_o')
return 'http://tah.openstreetmap.org/Tiles/tile/'.$z.'/'.$x.'/'.$y.'.png';
elseif ($t == 'oam')
return 'http://tile.openaerialmap.org/tiles/v=mgm&layer=openaerialmap-900913&x='.$x.'&y='.$y.'&zoom='.$z.'';
elseif ($t == 'moon_elev')
return 'http://mw1.google.com/mw-planetary/lunar/lunarmaps_v1/terrain/'.$z.'/'.$x.'/'.((1<<$z)-$y-1).'.jpg';
elseif ($t == 'moon_vis')
return 'http://mw1.google.com/mw-planetary/lunar/lunarmaps_v1/clem_bw/'.$z.'/'.$x.'/'.((1<<$z)-$y-1).'.jpg';
elseif ($t == 'moon_apo')
return 'http://mw1.google.com/mw-planetary/lunar/lunarmaps_v1/apollo/'.$z.'/'.$x.'/'.((1<<$z)-$y-1).'.jpg';
elseif ($t == 'mars_elev')
return 'http://mw1.google.com/mw-planetary/mars/elevation/t'.build_q($x, $y, $z, 'qrts').'.jpg';
elseif ($t == 'mars_vis')
return 'http://mw1.google.com/mw-planetary/mars/visible/t'.build_q($x, $y, $z, 'qrts').'.jpg';
elseif ($t == 'mars_ir')
return 'http://mw1.google.com/mw-planetary/mars/infrared/t'.build_q($x, $y, $z, 'qrts').'.jpg';
else
return 'unknown';
}
function to_merc($x, $y, $z, $t) {
// $t is not used
$sh = 7+$z;
// $bit = 1<<(8+$z);
// $tx = $x & ($bit-1);
$tx = doubleval($x*256) / (1<<$sh) - 1.0;
$lon = $tx * 180.0;
$ty = doubleval($y*256) / (1<<$sh) - 1.0;
$ty *= M_PI;
$ey = rad2deg(atan(exp($ty)));
$lat = ($ey * 2.0) - 90.0;
return array('lon' => $lon, 'lat' => -$lat);
}
$maps = array(
'goog_map' => array('name' => 'Google Maps', 'minz' => 0, 'maxz' => 19, 'trans' => false, 'order' => 1),
'goog_sat' => array('name' => 'Google Satellite', 'minz' => 0, 'maxz' => 22, 'trans' => false, 'order' => 1),
'goog_hyb' => array('name' => 'Google Hybrid (Labels)', 'minz' => 1, 'maxz' => 19, 'trans' => true, 'order' => 2),
'goog_ter' => array('name' => 'Google Terrain', 'minz' => 0, 'maxz' => 15, 'trans' => false, 'order' => 1),
'ditu' => array('name' => 'Google Ditu (China Maps)', 'minz' => 0, 'maxz' => 17, 'trans' => false, 'order' => 1),
'msn_map' => array('name' => 'Windows Live Maps', 'minz' => 1, 'maxz' => 19, 'trans' => false, 'order' => 1),
'msn_sat' => array('name' => 'Windows Live Satellite', 'minz' => 1, 'maxz' => 19, 'trans' => false, 'order' => 1),
'msn_hyb' => array('name' => 'Windows Live Hybrid', 'minz' => 1, 'maxz' => 19, 'trans' => false, 'order' => 1),
'msn_ter' => array('name' => 'Windows Live Terrain', 'minz' => 1, 'maxz' => 19, 'trans' => false, 'order' => 1),
'msn_brasil' => array('name' => 'Live Brasil Maps', 'minz' => 1, 'maxz' => 19, 'trans' => false, 'order' => 1),
'y_map' => array('name' => 'Yahoo Maps', 'minz' => 1, 'maxz' => 17, 'trans' => false, 'order' => 1),
'y_sat' => array('name' => 'Yahoo Satellite', 'minz' => 1, 'maxz' => 17, 'trans' => false, 'order' => 1),
'y_hyb' => array('name' => 'Yahoo Hybrid (Labels)', 'minz' => 1, 'maxz' => 17, 'trans' => true, 'order' => 2),
'y_map_in' => array('name' => 'Yahoo India Maps', 'minz' => 1, 'maxz' => 17, 'trans' => false, 'order' => 1),
'y_hyb_in' => array('name' => 'Yahoo India Hybrid (Labels)', 'minz' => 1, 'maxz' => 17, 'trans' => true, 'order' => 3),
'ask_map' => array('name' => 'Ask.com Maps', 'minz' => 1, 'maxz' => 19, 'trans' => false, 'order' => 1),
'ask_sat' => array('name' => 'Ask.com Satellite', 'minz' => 1, 'maxz' => 19, 'trans' => false, 'order' => 1),
'ask_hyb' => array('name' => 'Ask.com Hybrid (Labels)', 'minz' => 1, 'maxz' => 19, 'trans' => true, 'order' => 2),
'ask_phy' => array('name' => 'Ask.com Physical', 'minz' => 1, 'maxz' => 19, 'trans' => false, 'order' => 1),
'osm_m' => array('name' => 'OpenStreetMap (Mapnik)', 'minz' => 0, 'maxz' => 17, 'trans' => false, 'order' => 1),
'osm_o' => array('name' => 'OpenStreetMap (Osmarender)', 'minz' => 0, 'maxz' => 17, 'trans' => false, 'order' => 1),
'oam' => array('name' => 'OpenAerialMap', 'minz' => 0, 'maxz' => 17, 'trans' => false, 'order' => 1),
'moon_elev' => array('name' => 'Google Moon (Elevation)', 'minz' => 0, 'maxz' => 7, 'trans' => false, 'order' => 1),
'moon_vis' => array('name' => 'Google Moon (Visible)', 'minz' => 0, 'maxz' => 9, 'trans' => false, 'order' => 1),
'moon_apo' => array('name' => 'Google Moon (Apollo)', 'minz' => 0, 'maxz' => 15, 'trans' => false, 'order' => 1),
'mars_elev' => array('name' => 'Google Mars (Elevation)', 'minz' => 0, 'maxz' => 8, 'trans' => false, 'order' => 1),
'mars_vis' => array('name' => 'Google Mars (Visible)', 'minz' => 0, 'maxz' => 8, 'trans' => false, 'order' => 1),
'mars_ir' => array('name' => 'Google Mars (Infrared)', 'minz' => 0, 'maxz' => 8, 'trans' => false, 'order' => 1),
);
function network_link($t) {
global $maps, $v, $dx, $dy;
?>
0
http://mt.mgmaps.com/kml/maps-1.1.phpmt=&v=&dx=&dy=
}
// offset
$dx = 0;
$dy = 0;
if (isset($_GET['dx']))
$dx = doubleval($_GET['dx']);
if (isset($_GET['dy']))
$dy = doubleval($_GET['dy']);
$t = htmlspecialchars($_GET['mt']);
if (!array_key_exists($t, $maps)) {
header('Content-Type: application/vnd.google-earth.kml+xml; charset=utf8');
header('Content-Disposition: attachment; filename=maps.kml');
echo ''."\n";
?>
Map Overlays
1
Google Maps
0
network_link('goog_map'); ?>
network_link('goog_sat'); ?>
network_link('goog_hyb'); ?>
network_link('goog_ter'); ?>
network_link('ditu'); ?>
Windows Live Maps
0
network_link('msn_map'); ?>
network_link('msn_sat'); ?>
network_link('msn_hyb'); ?>
network_link('msn_ter'); ?>
network_link('msn_brasil'); ?>
Yahoo Maps
0
network_link('y_map'); ?>
network_link('y_sat'); ?>
network_link('y_hyb'); ?>
network_link('y_map_in'); ?>
network_link('y_hyb_in'); ?>
Ask.com Maps
0
network_link('ask_map'); ?>
network_link('ask_sat'); ?>
network_link('ask_hyb'); ?>
network_link('ask_phy'); ?>
OpenStreetMap
0
network_link('osm_m'); ?>
network_link('osm_o'); ?>
network_link('oam'); ?>
exit;
}
// all or none of (x,y,z) must be set
if (!isset($_GET['x']) || !isset($_GET['y']) || !isset($_GET['z'])) {
$notset = 1;
$x = 0;
$y = 0;
$z = 0;
}
else {
$notset = 0;
$x = intval($_GET['x']);
$y = intval($_GET['y']);
$z = intval($_GET['z']);
}
// convert to mercator
$min = to_merc($x, $y+1, $z, $t);
$max = to_merc($x+1, $y, $z, $t);
$min['lat'] += $dy;
$min['lon'] += $dx;
$max['lat'] += $dy;
$max['lon'] += $dx;
header('Content-Type: application/vnd.google-earth.kml+xml; charset=utf8');
header('Content-Disposition: attachment; filename=maps'.(($notset != 0) ? ('_'.$t) : ('_'.$t.'_'.$z.'_'.$x.'_'.$y)).'.kml');
echo ''."\n";
if ($notset != 0) {
?>
256
-1
http://mt.mgmaps.com/kml/maps-1.1.phpmt=&x=0&y=0&z=0&v=&dx=&dy=
onRegion
}
else {
$med = to_merc($x+.5, $y+.5, $z, $t);
?>
256
-1
if ($z < $maps[$t]['maxz']) { ?>
0_0_1
256
-1
http://mt.mgmaps.com/kml/maps-1.1.phpmt=&x=0&y=0&z=1&v=&dx=&dy=
onRegion
1_0_1
256
-1
http://mt.mgmaps.com/kml/maps-1.1.phpmt=&x=1&y=0&z=1&v=&dx=&dy=
onRegion
0_1_1
256
-1
http://mt.mgmaps.com/kml/maps-1.1.phpmt=&x=0&y=1&z=1&v=&dx=&dy=
onRegion
1_1_1
256
-1
http://mt.mgmaps.com/kml/maps-1.1.phpmt=&x=1&y=1&z=1&v=&dx=&dy=
onRegion
}
if ($z >= $maps[$t]['minz']) { ?>