<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.barros.ws &#187; gmap</title>
	<atom:link href="http://blog.barros.ws/tag/gmap/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.barros.ws</link>
	<description>web development tips</description>
	<lastBuildDate>Sun, 06 Jun 2010 00:34:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Convert lat, lng and zoom values to pixel (x,y) on a map</title>
		<link>http://blog.barros.ws/2009/03/06/convert-lat-lng-and-zoom-values-to-pixel-xy-on-a-map/</link>
		<comments>http://blog.barros.ws/2009/03/06/convert-lat-lng-and-zoom-values-to-pixel-xy-on-a-map/#comments</comments>
		<pubDate>Fri, 06 Mar 2009 12:33:14 +0000</pubDate>
		<dc:creator>Carlos Barros</dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[gmap]]></category>
		<category><![CDATA[mercator]]></category>
		<category><![CDATA[projection]]></category>

		<guid isPermaLink="false">http://blog.barros.ws/?p=156</guid>
		<description><![CDATA[Working on a project this week, that involves Google Maps, I needed to, given a latitude, a longitude and a zoom level, calculate the pixel position (x,y) within the map. If you need to do this using javascript, it&#8217;s pretty easy, as GMap API provides a handy method to do this:

var pixel = map.getCurrentMapType&#40;&#41;.getProjection&#40;&#41;.fromLatLngToPixel&#40;new GLatLng&#40;10,20&#41;,map.getZoom&#40;&#41;&#41;;

Unfortunately, [...]]]></description>
			<content:encoded><![CDATA[<p>Working on a project this week, that involves Google Maps, I needed to, given a latitude, a longitude and a zoom level, calculate the pixel position (x,y) within the map. If you need to do this using javascript, it&#8217;s pretty easy, as GMap API provides a handy method to do this:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> pixel <span style="color: #339933;">=</span> map.<span style="color: #660066;">getCurrentMapType</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">getProjection</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">fromLatLngToPixel</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">new</span> GLatLng<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">10</span><span style="color: #339933;">,</span><span style="color: #CC0000;">20</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>map.<span style="color: #660066;">getZoom</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Unfortunately, my need was to convert lat, lng and zoom into pixel position from PHP. I &#8220;googled&#8221; about this subject for a while, and it&#8217;s incredible how frequent this need is, and how this information lacks. I saw a lot of people asking for similar things, and also some people that claim that got it working, but without providing any code for this. Googling a bit more I figured out that google uses one thing called <a href="http://en.wikipedia.org/wiki/Mercator_projection" target="_blank">Mercator Projection</a>, but even this being a standard, I didn&#8217;t find anything that does what I needed. After a lot of time searching about this, I finally stumbled upon a perl script with a set of methods that accomplishes the task. Actually, this perl script is more focused on working with map &#8220;tiles&#8221;, but there are two methods that does exactly what I needed. It was just a matter of converting these perl methods into php and we&#8217;re done. </p>
<p><span id="more-156"></span></p>
<p>Here&#8217;s the &#8220;magic&#8221; perl script:</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># Calculate tile characteristics given a bounding box of coordinates and a zoom...</span>
<span style="color: #666666; font-style: italic;"># Author. John D. Coryat 01/2008...</span>
<span style="color: #666666; font-style: italic;"># USNaviguide LLC.</span>
<span style="color: #666666; font-style: italic;"># Published under Apache 2.0 license.</span>
<span style="color: #666666; font-style: italic;"># Adapted from: Google Maps API Javascript...</span>
<span style="color: #666666; font-style: italic;">##</span>
<span style="color: #666666; font-style: italic;"># In order to correctly locate objects of interest on a Custom Map Overlay Google Maps, </span>
<span style="color: #666666; font-style: italic;"># the characteristics of each tile to build are required.</span>
<span style="color: #666666; font-style: italic;">##</span>
<span style="color: #666666; font-style: italic;"># Google_Tiles					# Calculate all tiles for a bounding box and zoom</span>
<span style="color: #666666; font-style: italic;"># Google_Tile_Factors				# Calculate the factors needed ( Zoom, Tilesize )</span>
<span style="color: #666666; font-style: italic;"># Google_Tile_Calc				# Calculate a single tile features from a tile name and zoom</span>
<span style="color: #666666; font-style: italic;"># Google_Tile_to_Pix				# Calculate tile name to pixel</span>
<span style="color: #666666; font-style: italic;"># Google_Coord_to_Pix				# Calculate coordinate to Pixel</span>
<span style="color: #666666; font-style: italic;"># Google_Pix_to_Tile				# Calculate a tile name from a pixel location and zoom</span>
&nbsp;
<span style="color: #000066;">require</span> <span style="color: #cc66cc;">5.003</span> <span style="color: #339933;">;</span>
<span style="color: #000066;">package</span> USNaviguide_Google_Tiles <span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> strict <span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Math<span style="color: #339933;">::</span><span style="color: #006600;">Trig</span> <span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">BEGIN</span> <span style="color: #009900;">&#123;</span>
 <span style="color: #000000; font-weight: bold;">use</span> Exporter <span style="color: #339933;">;</span>
 <span style="color: #000000; font-weight: bold;">use</span> vars <span style="color: #000066;">qw</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$VERSION</span> <span style="color: #0000ff;">@ISA</span> <span style="color: #0000ff;">@EXPORT</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
 <span style="color: #0000ff;">$VERSION</span>	<span style="color: #339933;">=</span> <span style="color: #cc66cc;">1.0</span> <span style="color: #339933;">;</span>
 <span style="color: #0000ff;">@ISA</span>		<span style="color: #339933;">=</span> <span style="color: #000066;">qw</span> <span style="color: #009900;">&#40;</span> Exporter <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
 <span style="color: #0000ff;">@EXPORT</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">qw</span> <span style="color: #009900;">&#40;</span> 
 Google_Tiles
 Google_Tile_Factors
 Google_Tile_Calc
 Google_Tile_to_Pix
 Google_Coord_to_Pix
 Google_Pix_to_Tile
 <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># Call as: &lt;array of Hashes&gt; = &amp;Google_Tiles(&lt;LatitudeS&gt;, &lt;LongitudeW&gt;, &lt;LatitudeN&gt;, &lt;LongitudeE&gt;, &lt;Zoom&gt;, [&lt;option: tileSize&gt;], [&lt;option: Partial/Whole&gt;]) ;</span>
<span style="color: #666666; font-style: italic;"># Partial/Whole option: (Default: Partial)</span>
<span style="color: #666666; font-style: italic;">#	Partial: Include the edge to create partial tiles</span>
<span style="color: #666666; font-style: italic;">#       Whole: Include only tiles that are contained by the bounds</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;">#          Returned Array Specifications:</span>
<span style="color: #666666; font-style: italic;">#            Each element is a reference to a Hash:</span>
<span style="color: #666666; font-style: italic;">#              NAMEY - Tile Name y</span>
<span style="color: #666666; font-style: italic;">#              NAMEX - Tile Name x</span>
<span style="color: #666666; font-style: italic;">#              PYS - Pixel South</span>
<span style="color: #666666; font-style: italic;">#              PXW - Pixel West</span>
<span style="color: #666666; font-style: italic;">#              PYN - Pixel North</span>
<span style="color: #666666; font-style: italic;">#              PXE - Pixel East</span>
<span style="color: #666666; font-style: italic;">#              LATS - South Latitude</span>
<span style="color: #666666; font-style: italic;">#              LNGW - West Longitude</span>
<span style="color: #666666; font-style: italic;">#              LATN - North Latitude</span>
<span style="color: #666666; font-style: italic;">#              LNGE - East Longitude</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;">#          Note: X is width, Y is height...</span>
<span style="color: #666666; font-style: italic;">#</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> Google_Tiles
<span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$latS</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$lngW</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$latN</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$lngE</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$zoom</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$tileSize</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$parwho</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$ty</span>		<span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$tx</span>		<span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@ret</span>	<span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">%first</span>	<span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>				<span style="color: #666666; font-style: italic;"># First Results Hash</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">%last</span>	<span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>				<span style="color: #666666; font-style: italic;"># Last Results Hash</span>
&nbsp;
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$value</span>	<span style="color: #339933;">=</span> <span style="color: #0000ff;">&amp;Google_Tile_Factors</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$zoom</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$tileSize</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;"># Calculate Tile Factors</span>
&nbsp;
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000066;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$parwho</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">or</span> <span style="color: #339933;">!</span><span style="color: #0000ff;">$parwho</span><span style="color: #009900;">&#41;</span>
 <span style="color: #009900;">&#123;</span>
  <span style="color: #0000ff;">$parwho</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'Partial'</span> <span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
 <span style="color: #666666; font-style: italic;"># NW: Convert Coordinates to Pixels...</span>
&nbsp;
 <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$first</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NORTH'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$first</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'WEST'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&amp;Google_Coord_to_Pix</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$value</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$latN</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$lngW</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #666666; font-style: italic;"># Convert Pixels to Tile Name...</span>
&nbsp;
 <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$first</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEY'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$first</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEX'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&amp;PixtoTileName</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$value</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$first</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NORTH'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$first</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'WEST'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'N'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'W'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$parwho</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #666666; font-style: italic;"># SE: Convert Coordinates to Pixels...</span>
&nbsp;
 <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$last</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'SOUTH'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$last</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'EAST'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&amp;Google_Coord_to_Pix</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$value</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$latS</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$lngE</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #666666; font-style: italic;"># Convert Pixels to Tile Name...</span>
&nbsp;
 <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$last</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEY'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$last</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEX'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&amp;PixtoTileName</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$value</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$last</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'SOUTH'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$last</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'EAST'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'S'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'E'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$parwho</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #666666; font-style: italic;"># Calculate tile values for all tiles...</span>
&nbsp;
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$first</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEX'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">&gt;</span> <span style="color: #0000ff;">$last</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEX'</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span>			<span style="color: #666666; font-style: italic;"># Across the date line</span>
 <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$ty</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$first</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEY'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span> <span style="color: #0000ff;">$ty</span> <span style="color: #339933;">&lt;=</span> <span style="color: #0000ff;">$last</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEY'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span> <span style="color: #0000ff;">$ty</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
   <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$tx</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$first</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEX'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span> <span style="color: #0000ff;">$tx</span> <span style="color: #339933;">&lt;=</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'max'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span> <span style="color: #0000ff;">$tx</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span>
   <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">push</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">@ret</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span><span style="color: #0000ff;">&amp;Google_Tile_Calc</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$value</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$ty</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$tx</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
   <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$tx</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">;</span> <span style="color: #0000ff;">$tx</span> <span style="color: #339933;">&lt;=</span> <span style="color: #0000ff;">$last</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEX'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span> <span style="color: #0000ff;">$tx</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span>
   <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">push</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">@ret</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span><span style="color: #0000ff;">&amp;Google_Tile_Calc</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$value</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$ty</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$tx</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
 <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span>
 <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$ty</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$first</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEY'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span> <span style="color: #0000ff;">$ty</span> <span style="color: #339933;">&lt;=</span> <span style="color: #0000ff;">$last</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEY'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span> <span style="color: #0000ff;">$ty</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
   <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$tx</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$first</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEX'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span> <span style="color: #0000ff;">$tx</span> <span style="color: #339933;">&lt;=</span> <span style="color: #0000ff;">$last</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEX'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span> <span style="color: #0000ff;">$tx</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span>
   <span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">push</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">@ret</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#123;</span><span style="color: #0000ff;">&amp;Google_Tile_Calc</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$value</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$ty</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$tx</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
   <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
 <span style="color: #0000ff;">$ret</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NORTH'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$first</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NORTH'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span>
 <span style="color: #0000ff;">$ret</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'WEST'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$first</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'WEST'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #0000ff;">$ret</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$#ret</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'SOUTH'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$last</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'SOUTH'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span>
 <span style="color: #0000ff;">$ret</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$#ret</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'EAST'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$last</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'EAST'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #000066;">return</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">@ret</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Calculate Tile Factors...</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> Google_Tile_Factors
<span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$zoom</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$tileSize</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">%value</span>	<span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #666666; font-style: italic;"># Validate and correct input parameters...</span>
&nbsp;
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000066;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$zoom</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">or</span> <span style="color: #0000ff;">$zoom</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #009900;">&#123;</span>
  <span style="color: #0000ff;">$zoom</span>	<span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #000066;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$tileSize</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">or</span> <span style="color: #339933;">!</span><span style="color: #0000ff;">$tileSize</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #009900;">&#123;</span>
  <span style="color: #0000ff;">$tileSize</span>	<span style="color: #339933;">=</span> <span style="color: #cc66cc;">256</span> <span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
 <span style="color: #666666; font-style: italic;"># Calculate Values...</span>
&nbsp;
 <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'zoom'</span><span style="color: #009900;">&#125;</span>	<span style="color: #339933;">=</span> <span style="color: #0000ff;">$zoom</span> <span style="color: #339933;">;</span>
 <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'PI'</span><span style="color: #009900;">&#125;</span>	<span style="color: #339933;">=</span> <span style="color: #cc66cc;">3.1415926536</span> <span style="color: #339933;">;</span>
 <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'bc'</span><span style="color: #009900;">&#125;</span>	<span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">*</span> <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'PI'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span>
 <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'Wa'</span><span style="color: #009900;">&#125;</span>	<span style="color: #339933;">=</span> <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'PI'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">/</span> <span style="color: #cc66cc;">180</span> <span style="color: #339933;">;</span>
 <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'cp'</span><span style="color: #009900;">&#125;</span>	<span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">**</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'zoom'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">8</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
 <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'max'</span><span style="color: #009900;">&#125;</span>	<span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span> <span style="color: #339933;">**</span> <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'zoom'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span> <span style="color: #339933;">;</span>		<span style="color: #666666; font-style: italic;"># Maximum Tile Number</span>
 <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'pixLngDeg'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">=</span> <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'cp'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">/</span> <span style="color: #cc66cc;">360</span><span style="color: #339933;">;</span>
 <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'pixLngRad'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">=</span> <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'cp'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">/</span> <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'bc'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span>
 <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'bmO'</span><span style="color: #009900;">&#125;</span>	<span style="color: #339933;">=</span> <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'cp'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">/</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">;</span>
 <span style="color: #0000ff;">$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'tileSize'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$tileSize</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #000066;">return</span> <span style="color: #0000ff;">\%value</span> <span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Calculate tile values from Name...</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> Google_Tile_Calc
<span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">%result</span>	<span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$value</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEY'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEX'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #666666; font-style: italic;"># Convert Tile Name to Pixels...</span>
&nbsp;
 <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'PYN'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'PXW'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&amp;Google_Tile_to_Pix</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$value</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEY'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'NAMEX'</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #666666; font-style: italic;"># Convert Pixels to Coordinates (Upper Left Corner)...</span>
&nbsp;
 <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'LATN'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'LNGW'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&amp;PixtoCoordinate</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$value</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'PYN'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'PXW'</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'PYS'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'PYN'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">255</span> <span style="color: #339933;">;</span>
 <span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'PXE'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'PXW'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">255</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #666666; font-style: italic;"># Convert Pixels to Coordinates (Lower Right Corner)...</span>
&nbsp;
 <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'LATS'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'LNGE'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&amp;PixtoCoordinate</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$value</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'PYS'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$result</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'PXE'</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #000066;">return</span> <span style="color: #0000ff;">%result</span> <span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Calculate a tile name from a pixel location and zoom...</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> Google_Pix_to_Tile
<span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$value</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$ty</span>		<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$tx</span>		<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #666666; font-style: italic;"># Convert Pixels to Tile Name...</span>
&nbsp;
 <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$ty</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$tx</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&amp;PixtoTileName</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$value</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$ty</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$tx</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'N'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'W'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'Partial'</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #000066;">return</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$ty</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$tx</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Translate a coordinate to a pixel location...</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> Google_Coord_to_Pix
<span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$value</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$lat</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$lng</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@d</span>		<span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span> 
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$e</span>		<span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #0000ff;">$d</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%0.0f&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'bmO'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">$lng</span> <span style="color: #339933;">*</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'pixLngDeg'</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #0000ff;">$e</span> <span style="color: #339933;">=</span> <span style="color: #000066;">sin</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$lat</span> <span style="color: #339933;">*</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'Wa'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$e</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0.99999</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #009900;">&#123;</span>
  <span style="color: #0000ff;">$e</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0.99999</span> <span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
 <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$e</span> <span style="color: #339933;">&lt;</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">0.99999</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #009900;">&#123;</span>
  <span style="color: #0000ff;">$e</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">0.99999</span> <span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
 <span style="color: #0000ff;">$d</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000066;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%0.0f&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'bmO'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">+</span> <span style="color: #cc66cc;">0.5</span> <span style="color: #339933;">*</span> <span style="color: #000066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">$e</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span> <span style="color: #339933;">-</span> <span style="color: #0000ff;">$e</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'pixLngRad'</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #000066;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@d</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Translate a pixel location to a tile name...</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> PixtoTileName
<span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$value</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$y</span>		<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$x</span>		<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$yd</span>		<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>				<span style="color: #666666; font-style: italic;"># Y Direction: N or S</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$xd</span>		<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>				<span style="color: #666666; font-style: italic;"># X Direction: W or E</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$parwho</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>				<span style="color: #666666; font-style: italic;"># Partial / Whole</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$yn</span>		<span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">;</span>					<span style="color: #666666; font-style: italic;"># Y Name</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$xn</span>		<span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">;</span>					<span style="color: #666666; font-style: italic;"># X Name</span>
&nbsp;
 <span style="color: #0000ff;">$yn</span> <span style="color: #339933;">=</span> <span style="color: #000066;">int</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$y</span> <span style="color: #339933;">/</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'tileSize'</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>		<span style="color: #666666; font-style: italic;"># Round Down</span>
 <span style="color: #0000ff;">$xn</span> <span style="color: #339933;">=</span> <span style="color: #000066;">int</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$x</span> <span style="color: #339933;">/</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'tileSize'</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>		<span style="color: #666666; font-style: italic;"># Round Down</span>
&nbsp;
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$parwho</span> <span style="color: #b1b100;">ne</span> <span style="color: #ff0000;">'Partial'</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$yd</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'N'</span> <span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
   <span style="color: #0000ff;">$yn</span><span style="color: #339933;">++</span> <span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span>
  <span style="color: #009900;">&#123;</span>
   <span style="color: #0000ff;">$yn</span><span style="color: #339933;">--</span> <span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$xd</span> <span style="color: #b1b100;">eq</span> <span style="color: #ff0000;">'W'</span> <span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
   <span style="color: #0000ff;">$xn</span><span style="color: #339933;">++</span> <span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span>
  <span style="color: #009900;">&#123;</span>
   <span style="color: #0000ff;">$xn</span><span style="color: #339933;">--</span> <span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
 <span style="color: #666666; font-style: italic;"># Make sure tile numbers are sane...</span>
&nbsp;
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$yn</span> <span style="color: #339933;">&gt;</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'max'</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #009900;">&#123;</span>
  <span style="color: #0000ff;">$yn</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'max'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">elsif</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$yn</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #009900;">&#123;</span>
  <span style="color: #0000ff;">$yn</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
 <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$xn</span> <span style="color: #339933;">&gt;</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'max'</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #009900;">&#123;</span>
  <span style="color: #0000ff;">$xn</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'max'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">elsif</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$xn</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span>
 <span style="color: #009900;">&#123;</span>
  <span style="color: #0000ff;">$xn</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">;</span>
 <span style="color: #009900;">&#125;</span>
&nbsp;
 <span style="color: #000066;">return</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$yn</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$xn</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Translate a tile name to a pixel location...</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> Google_Tile_to_Pix
<span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$value</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$y</span>		<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$x</span>		<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #000066;">return</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span><span style="color: #000066;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%0.0f&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$y</span> <span style="color: #339933;">*</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'tileSize'</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000066;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%0.0f&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$x</span> <span style="color: #339933;">*</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'tileSize'</span><span style="color: #009900;">&#125;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Translate a pixel location to a coordinate...</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> PixtoCoordinate
<span style="color: #009900;">&#123;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$value</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$y</span>		<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$x</span>		<span style="color: #339933;">=</span> <span style="color: #000066;">shift</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@d</span>		<span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
 <span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$e</span>		<span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$y</span> <span style="color: #339933;">-</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'bmO'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'pixLngRad'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #0000ff;">$d</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%0.6f&quot;</span><span style="color: #339933;">,</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$x</span> <span style="color: #339933;">-</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'bmO'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">/</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'pixLngDeg'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
&nbsp;
 <span style="color: #0000ff;">$d</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span>	<span style="color: #339933;">=</span> <span style="color: #000066;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%0.6f&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span> <span style="color: #339933;">*</span> atan<span style="color: #009900;">&#40;</span><span style="color: #000066;">exp</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$e</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'PI'</span><span style="color: #009900;">&#125;</span> <span style="color: #009966; font-style: italic;">/ 2) /</span> <span style="color: #0000ff;">$$value</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'Wa'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">;</span>
 <span style="color: #000066;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">@d</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">__END__</span>
&nbsp;
<span style="color: #666666; font-style: italic;">=head1 SYNOPSIS
&nbsp;
#!/usr/bin/perl -w
# Test Program:
&nbsp;
# Google Tile Calculator Test Program...
# Author. John D. Coryat 01/2008 USNaviguide LLC
&nbsp;
use strict;
use USNaviguide_Google_Tiles ;
&nbsp;
my $latS        = 34.177442 ;
my $lngW        = -91.318359 ;
my $latN        = 35.797300 ;
my $lngE        = -88.681641 ;
my $zoom        = 8 ;
my $x           = '' ;
my %tile        = ( ) ;
my $i           = 0 ;
&nbsp;
my @d = &amp;Google_Tiles($latS, $lngW, $latN, $lngE, $zoom,0,'Whole');
&nbsp;
print &quot;Total: &quot; . scalar(@d) . &quot;\n&quot; ;
&nbsp;
for ( $i = 0; $i &lt;= $#d; $i++ )
{
 print &quot;Tile # $i Y: $d[$i]{'NAMEY'} X: $d[$i]{'NAMEX'}\n&quot; ;
&nbsp;
 %tile = %{$d[$i]} ;
&nbsp;
 foreach $x (sort keys %tile)
 {
  print &quot;\t$x: $tile{$x}\n&quot; ;
 }
}
&nbsp;
=cut</span></pre></div></div>

<p>Original link to this code is: <a href="http://www.usnaviguide.com/google-tiles.htm">http://www.usnaviguide.com/google-tiles.htm</a></p>
<p>The interesting methods in the script are:</p>
<ul>
<li><strong>Google_Tile_Factors:</strong> This method receives a zoom level and the tile size (256 in google maps) and return an array with some values that are used in next method.</li>
<li><strong>Google_Coord_to_Pix:</strong> This method receives the array returned by the previous method, a latitude and a longitude, and will return an array with a (x,y) pair that correspond to the pixel position in the map. Note that it won&#8217;t return a pixel position relative to the current view, but relative to the entire map.</li>
</ul>
<p>What about the PHP version?? Well, unfortunately my code is part of a project and I can&#8217;t post it here, but it&#8217;s pretty easy to convert these perl methods into PHP (I don&#8217;t have ANY experience with perl, and did it in a few minutes).</p>
<p>That&#8217;s it, I hope this helps you as it helped me.</p>
<p>Carlos</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.barros.ws/2009/03/06/convert-lat-lng-and-zoom-values-to-pixel-xy-on-a-map/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
