+# Helper functions for the CGI variant. Taken from the openstreetmap-Wiki.
+use Math::Trig;
+sub Project {
+ my ($X, $Y, $Zoom) = @_;
+ my $Unit = 1 / (2 ** $Zoom);
+ my $relY1 = $Y * $Unit;
+ my $relY2 = $relY1 + $Unit;
+
+ # note: $LimitY = ProjectF(degrees(atan(sinh(pi)))) = log(sinh(pi)+cosh(pi)) = pi
+ # note: degrees(atan(sinh(pi))) = 85.051128..
+ #my $LimitY = ProjectF(85.0511);
+
+ # so stay simple and more accurate
+ my $LimitY = pi;
+ my $RangeY = 2 * $LimitY;
+ $relY1 = $LimitY - $RangeY * $relY1;
+ $relY2 = $LimitY - $RangeY * $relY2;
+ my $Lat1 = ProjectMercToLat($relY1);
+ my $Lat2 = ProjectMercToLat($relY2);
+ $Unit = 360 / (2 ** $Zoom);
+ my $Long1 = -180 + $X * $Unit;
+ return ($Lat2, $Long1, $Lat1, $Long1 + $Unit); # S,W,N,E
+}
+sub ProjectMercToLat($){
+ my $MercY = shift;
+ return rad2deg(atan(sinh($MercY)));
+}
+sub ProjectF
+{
+ my $Lat = shift;
+ $Lat = deg2rad($Lat);
+ my $Y = log(tan($Lat) + sec($Lat));
+ return $Y;
+}
+