of class "nztopo", see http://www.topomap.co.nz/.
*/
function NZTopo_Parse($p1, $p2, $p3, $p4, $p5, $p6, $p7, $p8, $p9) {
#
global $NZTopoZoom;
global $debugon; # for debug
// Initialise variables
$retval = ''; # return value
$opt = ParseArgs($p1 . ' ' . $p2 . ' ' . $p3 . ' ' . $p4 . ' ' . $p5 . ' ' . $p6 . ' ' . $p7 . ' ' . $p8 . ' ' . $p9);
$version = 2; # fixed version of nztopomap interface
$newwin = 1; # open map in new window
$ppcm = 80; # 80 pixels per centrimetre to provide base scale for maps
$width = $opt['width']; # iframe parameter
$height = $opt['height']; # iframe parameter
$float = $opt['float'] ? 'float:' . $opt['float'] . ';' : ""; # div parameter
$clear = $opt['clear'] ? 'clear:' . $opt['clear'] . ';' : ""; # div parameter
$pdiv = $clear . $float ? ' style="' . $clear . $float . '"' : "";
// query string parameters
$bllbs = (boolean) $opt['llbs'];
if( $bllbs ) { # get size of map in km
list ($widthkm, $heightkm, $dbgval) = llbskm($opt['llbs']);
$retval .= $dbgval;
$width = max ($widthkm * $ppcm, $width); # override height
$height = max ($heightkm * $ppcm, $width); # override height
}
$query = '';
$query .= '&new=' . $newwin;
$query .= $opt['ll'] ? '&ll=' . $opt['ll'] : "";
$query .= $opt['llbs'] ? '&llbs=' . $opt['llbs'] : "";
$query .= $opt['topo50'] ? '&topo50=' . $opt['topo50'] : "";
$query .= $opt['nzbs'] ? '&nzbs=' . $opt['nzbs'] : "";
$query .= $opt['nzne'] ? '&nzne=' . $opt['nzne'] : "";
$query .= $opt['kml'] ? '&kml=' . rawurlencode($opt['kml']) : "";
$query .= $opt['gpx'] ? '&gpx=' . rawurlencode($opt['gpx']) : "";
$query .= $opt['pin'] ? '&pin=' . $opt['pin'] : "";
$query .= $opt['label'] ? '&lbl=' . rawurlencode(htmlentities($opt['label'])) : ""; # double url encode unicode chars for them to work with the topo map
$query .= $opt['zoom'] ? '&z=' . $opt['zoom'] : '&z=' . $NZTopoZoom;
$awidth = $width ? ' width="' . $width . '"' : ""; # iframe parameter
$aheight = $height ? ' height="' . $height . '"' : ""; # iframe parameter
$src = 'http://www.topomap.co.nz/NZTopoMapEmbedded?&v=' . $version . $query;
$retval .= '
' . "\n";
$retval .= '' . $width . '+' . $height;
$retval .= '
' . "\n";
/* example HTML for nztopomap
*/
if( $debugon ) {
$retval .= 'p1=' . $p1 . ' p2=' . $p2 . ' p3=' . $p3 . ' p4=' . $p4 . ' p5=' . $p5 . ' p6=' . $p6 . ' p7=' . $p7 . ' p8=' . $p8 . ' p9=' . $p9 . '' . "\n";
$retval .= 'src=' . $src . '
' . "\n";
}
return $retval;
} # NZTopo_Parse
function llbskm($llbs) {
global $debugon; # for debug
$dbgval = '';
$latlngs = preg_split ('/[,;]/', $llbs);
$lats = array_filter($latlngs, "odd");
$lngs = array_filter($latlngs, "even");
$maxlat = max ($lats);
$maxlng = max ($lngs);
$minlat = min ($lats);
$minlng = min ($lngs);
/* rectangle coordinates are (lat/long)
left: right:
top: max/min max/max
bot: min/min min/max
*/
$width1 = distance ($maxlat, $minlng, $maxlat, $maxlng);
$width2 = distance ($minlat, $minlng, $minlat, $maxlng);
$height1 = distance ($maxlat, $minlng, $minlat, $minlng);
$height2 = distance ($maxlat, $maxlng, $minlat, $maxlng);
$widthkm = ceil (max ($width1, $width2)); # take largest width and round up to km
$heightkm = ceil (max ($height1, $height2)); # take largest height and round up to km
if( $debugon ) {
$dbgval .= 'lats="' . var_export ($lats, TRUE) . '"' . "\n";
$dbgval .= 'lngs="' . implode ('", "', $lngs) . '"' . "\n";
$dbgval .= 'minlat=' . $minlat . ', maxlat=' . $maxlat . ', minlng=' . $minlng . ', maxlng=' . $maxlng . '' . "\n";
$dbgval .= 'w1=' . $width1 . ', w2=' . $width2 . ', h1=' . $height1 . ', h2=' . $height2 . ', w=' . $widthkm . ', h=' . $heightkm . '' . "\n";
}
return array ($widthkm, $heightkm, $dbgval);
}
# http://snipplr.com/view/2531/
function distance($lat1, $lng1, $lat2, $lng2)
{
$pi80 = M_PI / 180;
$lat1 *= $pi80;
$lng1 *= $pi80;
$lat2 *= $pi80;
$lng2 *= $pi80;
$r = 6372.797; // mean radius of Earth in km
$dlat = $lat2 - $lat1;
$dlng = $lng2 - $lng1;
$a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlng / 2) * sin($dlng / 2);
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
$km = $r * $c;
return $km;
} # distance
function odd($var)
{ // returns whether the input integer is odd
return($var % 2);
} # odd
function even($var)
{ // returns whether the input integer is even
return(!($var % 2));
} # even