require
5.003 ;
BEGIN {
use
vars
qw (
$VERSION
@ISA
@EXPORT
) ;
$VERSION
= 1.0 ;
@ISA
=
qw (
Exporter ) ;
@EXPORT
=
qw (
Google_Tiles
Google_Tile_Factors
Google_Tile_Calc
Google_Tile_to_Pix
Google_Coord_to_Pix
Google_Pix_to_Tile
) ;
}
sub
Google_Tiles
{
my
$latS
=
shift
;
my
$lngW
=
shift
;
my
$latN
=
shift
;
my
$lngE
=
shift
;
my
$zoom
=
shift
;
my
$tileSize
=
shift
;
my
$parwho
=
shift
;
my
$ty
= 0 ;
my
$tx
= 0 ;
my
@ret
= ( ) ;
my
%first
= ( ) ;
my
%last
= ( ) ;
my
$value
=
&Google_Tile_Factors
(
$zoom
,
$tileSize
) ;
if
(!
defined
(
$parwho
) or !
$parwho
)
{
$parwho
=
'Partial'
;
}
(
$first
{
'NORTH'
},
$first
{
'WEST'
}) =
&Google_Coord_to_Pix
(
$value
,
$latN
,
$lngW
) ;
(
$first
{
'NAMEY'
},
$first
{
'NAMEX'
}) =
&PixtoTileName
(
$value
,
$first
{
'NORTH'
},
$first
{
'WEST'
},
'N'
,
'W'
,
$parwho
) ;
(
$last
{
'SOUTH'
},
$last
{
'EAST'
}) =
&Google_Coord_to_Pix
(
$value
,
$latS
,
$lngE
) ;
(
$last
{
'NAMEY'
},
$last
{
'NAMEX'
}) =
&PixtoTileName
(
$value
,
$last
{
'SOUTH'
},
$last
{
'EAST'
},
'S'
,
'E'
,
$parwho
) ;
if
(
$first
{
'NAMEX'
} >
$last
{
'NAMEX'
} )
{
for
(
$ty
=
$first
{
'NAMEY'
} ;
$ty
<=
$last
{
'NAMEY'
} ;
$ty
++ )
{
for
(
$tx
=
$first
{
'NAMEX'
} ;
$tx
<=
$$value
{
'max'
} ;
$tx
++ )
{
push
(
@ret
, {
&Google_Tile_Calc
(
$value
,
$ty
,
$tx
)} ) ;
}
for
(
$tx
= 0 ;
$tx
<=
$last
{
'NAMEX'
} ;
$tx
++ )
{
push
(
@ret
, {
&Google_Tile_Calc
(
$value
,
$ty
,
$tx
)} ) ;
}
}
}
else
{
for
(
$ty
=
$first
{
'NAMEY'
} ;
$ty
<=
$last
{
'NAMEY'
} ;
$ty
++ )
{
for
(
$tx
=
$first
{
'NAMEX'
} ;
$tx
<=
$last
{
'NAMEX'
} ;
$tx
++ )
{
push
(
@ret
, {
&Google_Tile_Calc
(
$value
,
$ty
,
$tx
)} ) ;
}
}
}
$ret
[0]{
'NORTH'
} =
$first
{
'NORTH'
} ;
$ret
[0]{
'WEST'
} =
$first
{
'WEST'
} ;
$ret
[
$#ret
]{
'SOUTH'
} =
$last
{
'SOUTH'
} ;
$ret
[
$#ret
]{
'EAST'
} =
$last
{
'EAST'
} ;
return
(
@ret
) ;
}
sub
Google_Tile_Factors
{
my
$zoom
=
shift
;
my
$tileSize
=
shift
;
my
%value
= ( ) ;
if
( !
defined
(
$zoom
) or
$zoom
< 0 )
{
$zoom
= 0 ;
}
if
( !
defined
(
$tileSize
) or !
$tileSize
)
{
$tileSize
= 256 ;
}
$value
{
'zoom'
} =
$zoom
;
$value
{
'PI'
} = 3.1415926536 ;
$value
{
'bc'
} = 2 *
$value
{
'PI'
} ;
$value
{
'Wa'
} =
$value
{
'PI'
} / 180 ;
$value
{
'cp'
} = 2 ** (
$value
{
'zoom'
} + 8) ;
$value
{
'max'
} = (2 **
$value
{
'zoom'
}) - 1 ;
$value
{
'pixLngDeg'
}=
$value
{
'cp'
} / 360;
$value
{
'pixLngRad'
}=
$value
{
'cp'
} /
$value
{
'bc'
} ;
$value
{
'bmO'
} =
$value
{
'cp'
} / 2 ;
$value
{
'tileSize'
} =
$tileSize
;
return
\
%value
;
}
sub
Google_Tile_Calc
{
my
%result
= ( ) ;
my
$value
=
shift
;
$result
{
'NAMEY'
} =
shift
;
$result
{
'NAMEX'
} =
shift
;
(
$result
{
'PYN'
},
$result
{
'PXW'
}) =
&Google_Tile_to_Pix
(
$value
,
$result
{
'NAMEY'
},
$result
{
'NAMEX'
} ) ;
(
$result
{
'LATN'
},
$result
{
'LNGW'
}) =
&PixtoCoordinate
(
$value
,
$result
{
'PYN'
},
$result
{
'PXW'
} ) ;
$result
{
'PYS'
} =
$result
{
'PYN'
} + 255 ;
$result
{
'PXE'
} =
$result
{
'PXW'
} + 255 ;
(
$result
{
'LATS'
},
$result
{
'LNGE'
}) =
&PixtoCoordinate
(
$value
,
$result
{
'PYS'
},
$result
{
'PXE'
} ) ;
return
%result
;
}
sub
Google_Pix_to_Tile
{
my
$value
=
shift
;
my
$ty
=
shift
;
my
$tx
=
shift
;
(
$ty
,
$tx
) =
&PixtoTileName
(
$value
,
$ty
,
$tx
,
'N'
,
'W'
,
'Partial'
) ;
return
(
$ty
,
$tx
) ;
}
sub
Google_Coord_to_Pix
{
my
$value
=
shift
;
my
$lat
=
shift
;
my
$lng
=
shift
;
my
@d
= ( ) ;
my
$e
= 0 ;
$d
[1] =
sprintf
(
"%0.0f"
,
$$value
{
'bmO'
} +
$lng
*
$$value
{
'pixLngDeg'
} ) ;
$e
=
sin
(
$lat
*
$$value
{
'Wa'
}) ;
if
(
$e
> 0.99999 )
{
$e
= 0.99999 ;
}
if
(
$e
< -0.99999 )
{
$e
= -0.99999 ;
}
$d
[0] =
sprintf
(
"%0.0f"
,
$$value
{
'bmO'
} + 0.5 *
log
((1 +
$e
) / (1 -
$e
)) * (-1) *
$$value
{
'pixLngRad'
} ) ;
return
(
@d
) ;
}
sub
PixtoTileName
{
my
$value
=
shift
;
my
$y
=
shift
;
my
$x
=
shift
;
my
$yd
=
shift
;
my
$xd
=
shift
;
my
$parwho
=
shift
;
my
$yn
= 0 ;
my
$xn
= 0 ;
$yn
=
int
(
$y
/
$$value
{
'tileSize'
} ) ;
$xn
=
int
(
$x
/
$$value
{
'tileSize'
} ) ;
if
(
$parwho
ne
'Partial'
)
{
if
(
$yd
eq
'N'
)
{
$yn
++ ;
}
else
{
$yn
-- ;
}
if
(
$xd
eq
'W'
)
{
$xn
++ ;
}
else
{
$xn
-- ;
}
}
if
(
$yn
>
$$value
{
'max'
} )
{
$yn
=
$$value
{
'max'
} ;
}
elsif
(
$yn
< 0 )
{
$yn
= 0 ;
}
if
(
$xn
>
$$value
{
'max'
} )
{
$xn
=
$$value
{
'max'
} ;
}
elsif
(
$xn
< 0 )
{
$xn
= 0 ;
}
return
(
$yn
,
$xn
) ;
}
sub
Google_Tile_to_Pix
{
my
$value
=
shift
;
my
$y
=
shift
;
my
$x
=
shift
;
return
( (
sprintf
(
"%0.0f"
,
$y
*
$$value
{
'tileSize'
} ),
sprintf
(
"%0.0f"
,
$x
*
$$value
{
'tileSize'
} )) ) ;
}
sub
PixtoCoordinate
{
my
$value
=
shift
;
my
$y
=
shift
;
my
$x
=
shift
;
my
@d
= ( ) ;
my
$e
= ((
$y
-
$$value
{
'bmO'
}) /
$$value
{
'pixLngRad'
}) * (-1) ;
$d
[1] =
sprintf
(
"%0.6f"
,(
$x
-
$$value
{
'bmO'
}) /
$$value
{
'pixLngDeg'
}) ;
$d
[0] =
sprintf
(
"%0.6f"
, (2 * atan(
exp
(
$e
)) -
$$value
{
'PI'
} / 2) /
$$value
{
'Wa'
}) ;
return
(
@d
);
}
1;