Map of Birds Eye Coverage in EMEA & APAC (Part 3)

Johannes Kebeck's Blog
09-15-2007, 03:25 PM
<p><strong>Step 2: Which tiles are covered by the shape at level 14?</strong> <p>First we use SQL Server 2008 to determine the minimum bounding rectangle, for example:<pre><span style="color:rgb(0,0,255)">SELECT</span> Shape<span style="color:rgb(128,128,128)">.</span>STEnvelope<span style="color:rgb(128,128,128)">().</span>STAsText<span style="color:rgb(128,128,128)">()</span> <span style="color:rgb(0,0,255)">FROM</span> FromBlom <span style="color:rgb(0,0,255)">WHERE</span> ID<span style="color:rgb(128,128,128)">=</span>24</pre><a href="http://11011.net/software/vspaste"></a>
<p>In this example STEnvelope() calculated the minimum bounding rectangle and STAsText() provides the result as so called Well Known Text (WKT) which is one of the OGC-specifications we support. Besides that we support also Well Known Binary (WKB) and the Geographic Markup Language (GML).
<p>The*WKT for such a polygon looks like this:
<p>POLYGON ((52.150335311889648 0.017314910888671875, 52.309449434280396 0.017314910888671875, 52.309449434280396 0.25343132019042969, 52.150335311889648 0.25343132019042969, 52.150335311889648 0.017314910888671875))
<p><a href="http://blufiles.storage.msn.com/y1pLfDzppuxasgsapM5mZgx_bB9m-SjQycZnw3n6y_Z3Su6O7WsXf_ZCr5cN3XneEbi1k-8I4rgbOY"><img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=292 alt=image src="http://blufiles.storage.msn.com/y1pLfDzppuxasgtlpHZJtPyptI-tQPSiJ1niDB4pog_p9hGzDIyWPuO1_6YjNPQBu-wqQdG9EaIl-o" width=400 border=0></a>
<p>Once we have the bounding rectangle we can start to determine the tiles in it:
<ol>
<li>We determine the locations of the nodes in the bounding rectangle<pre><span style="color:rgb(0,0,255)">SELECT</span> Shape<span style="color:rgb(128,128,128)">.</span>STEnvelope<span style="color:rgb(128,128,128)">().</span>STPointN<span style="color:rgb(128,128,128)">(</span>1<span style="color:rgb(128,128,128)">).</span>STAsText<span style="color:rgb(128,128,128)">()</span> <span style="color:rgb(0,0,255)">FROM</span> FromBlom <span style="color:rgb(0,0,255)">WHERE</span> ID<span style="color:rgb(128,128,128)">=</span>24</pre>
<p>STPointN(i) gives me a simple feature of type POINT like 'POINT (52.150335311889648 0.017314910888671875)'<br>for a point of my choice. We will only need point 2 and 4 for our calculations.<br><a href="http://blufiles.storage.msn.com/y1pLfDzppuxasjYBUEqn0_Q7wI40AGMtUtBvDQb-LvYpGG-ZhOKOGJRo1NxGaIYvqJPfDmoszGdPNQ"><img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=412 alt=image src="http://blufiles.storage.msn.com/y1pLfDzppuxasikT1KfnrufajVykPbB5_zPoWvUF5b6dQKCZWT 8SghGusSxG-HijcneIS5Myqf2EaI" width=400 border=0></a> <br>
<li>Now we determine the latitude and longitude with the functions <pre><span style="color:rgb(0,0,255)">SELECT</span> Shape<span style="color:rgb(128,128,128)">.</span>STEnvelope<span style="color:rgb(128,128,128)">().</span>STPointN<span style="color:rgb(128,128,128)">(</span>1<span style="color:rgb(128,128,128)">).</span>STX <span style="color:rgb(0,0,255)">FROM</span> FromBlom <span style="color:rgb(0,0,255)">WHERE</span> ID<span style="color:rgb(128,128,128)">=</span>24
<span style="color:rgb(0,0,255)">SELECT</span> Shape<span style="color:rgb(128,128,128)">.</span>STEnvelope<span style="color:rgb(128,128,128)">().</span>STPointN<span style="color:rgb(128,128,128)">(</span>1<span style="color:rgb(128,128,128)">).</span>STY <span style="color:rgb(0,0,255)">FROM</span> FromBlom <span style="color:rgb(0,0,255)">WHERE</span> ID<span style="color:rgb(128,128,128)">=</span>24<br></pre><pre><font face=verdana>The result is of data type float e.g. 52.1503353118896 and 0.0173149108886719</font></pre>
<li>
<p>Well and then we use some mathematical functions which are well described in Joe Schwarz's <a href="http://msdn2.microsoft.com/en-us/library/bb259689.aspx">article on MSDN</a> to determine the <br>quadkey of these tiles. I implemented these functions in the following T-SQL script:<pre><span style="color:rgb(0,0,255)">DECLARE</span> @ID <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @i <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @Lat <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @Lon <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @lvl <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @pixelX <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @pixelY <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @tileXdecMin <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @tileYdecMin <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @tileXdecMax <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @tileYdecMax <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @tileXdec <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @tileYdec <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @tileXdecDummy <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @tileYdecDummy <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @tileXbin <span style="color:rgb(0,0,255)">VARCHAR</span><span style="color:rgb(128,128,128)">(</span>38<span style="color:rgb(128,128,128)">);
</span><span style="color:rgb(0,0,255)">DECLARE</span> @tileYbin <span style="color:rgb(0,0,255)">VARCHAR</span><span style="color:rgb(128,128,128)">(</span>38<span style="color:rgb(128,128,128)">);
</span><span style="color:rgb(0,0,255)">DECLARE</span> @j <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @quadKey <span style="color:rgb(0,0,255)">VARCHAR</span><span style="color:rgb(128,128,128)">(</span>19<span style="color:rgb(128,128,128)">);

</span><span style="color:rgb(0,0,255)">SET</span> @lvl <span style="color:rgb(128,128,128)">=</span> 14<span style="color:rgb(128,128,128)">;

</span><span style="color:rgb(0,0,255)">DECLARE</span> IdCursor <span style="color:rgb(0,0,255)">CURSOR</span> <span style="color:rgb(0,0,255)">FOR</span> <span style="color:rgb(0,0,255)">SELECT</span> ID <span style="color:rgb(0,0,255)">FROM</span> FromBlom <span style="color:rgb(0,0,255)">WHERE</span> Country<span style="color:rgb(128,128,128)">=</span><span style="color:rgb(255,0,0)">'IE'</span> <span style="color:rgb(128,128,128)">ORDER</span> <span style="color:rgb(0,0,255)">BY</span> ID<span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">OPEN</span> IdCursor<span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">FETCH</span> <span style="color:rgb(0,0,255)">NEXT</span> <span style="color:rgb(0,0,255)">FROM</span> IdCursor <span style="color:rgb(0,0,255)">INTO</span> @ID<span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">WHILE</span> <span style="color:rgb(255,0,255)">@@FETCH_STATUS</span> <span style="color:rgb(128,128,128)">=</span> 0
<span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @i <span style="color:rgb(128,128,128)">=</span> 2<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">WHILE</span> @i <span style="color:rgb(128,128,128)"><=</span> 4 <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,128,0)">-- Get latitude and longitude of the bounding reactangle
</span> <span style="color:rgb(0,0,255)">SET</span> @Lat <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(128,128,128)">(</span><span style="color:rgb(0,0,255)">SELECT</span> Shape<span style="color:rgb(128,128,128)">.</span>STEnvelope<span style="color:rgb(128,128,128)">().</span>STPointN<span style="color:rgb(128,128,128)">(</span>@i<span style="color:rgb(128,128,128)">).</span>STX <span style="color:rgb(0,0,255)">FROM</span> FromBlom <span style="color:rgb(0,0,255)">WHERE</span> ID<span style="color:rgb(128,128,128)">=</span>@ID<span style="color:rgb(128,128,128)">);
</span> <span style="color:rgb(0,0,255)">SET</span> @Lon <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(128,128,128)">(</span><span style="color:rgb(0,0,255)">SELECT</span> Shape<span style="color:rgb(128,128,128)">.</span>STEnvelope<span style="color:rgb(128,128,128)">().</span>STPointN<span style="color:rgb(128,128,128)">(</span>@i<span style="color:rgb(128,128,128)">).</span>STY <span style="color:rgb(0,0,255)">FROM</span> FromBlom <span style="color:rgb(0,0,255)">WHERE</span> <a href="mailto:ID=@ID);">ID<span style="color:rgb(128,128,128)">=</span>@ID<span style="color:rgb(128,128,128)">);
</span></a> <span style="color:rgb(0,128,0)">-- Calculate pixel X and Y of the CP
</span> <span style="color:rgb(0,0,255)">SET</span> @pixelX <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(128,128,128)">(</span>@Lon <span style="color:rgb(128,128,128)">+</span> 180<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">/</span> 360 <span style="color:rgb(128,128,128)">*</span> 256 <span style="color:rgb(128,128,128)">*</span> <span style="color:rgb(255,0,255)">POWER</span><span style="color:rgb(128,128,128)">(</span>2<span style="color:rgb(128,128,128)">,</span> @lvl<span style="color:rgb(128,128,128)">);
</span> <span style="color:rgb(0,0,255)">SET</span> @pixelY <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(128,128,128)">(</span>0.5 <span style="color:rgb(128,128,128)">-</span> <span style="color:rgb(128,128,128)">(</span><span style="color:rgb(255,0,255)">LOG</span><span style="color:rgb(128,128,128)">((</span>1 <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,255)">SIN</span><span style="color:rgb(128,128,128)">(</span>@Lat <span style="color:rgb(128,128,128)">*</span> <span style="color:rgb(255,0,255)">PI</span><span style="color:rgb(128,128,128)">()</span> <span style="color:rgb(128,128,128)">/</span> 180<span style="color:rgb(128,128,128)">))</span> <span style="color:rgb(128,128,128)">/</span> <span style="color:rgb(128,128,128)">(</span>1 <span style="color:rgb(128,128,128)">-</span> <span style="color:rgb(255,0,255)">SIN</span><span style="color:rgb(128,128,128)">(</span>@Lat <span style="color:rgb(128,128,128)">*</span> <span style="color:rgb(255,0,255)">PI</span><span style="color:rgb(128,128,128)">()</span> <span style="color:rgb(128,128,128)">/</span> 180<span style="color:rgb(128,128,128)">)))</span> <br> <span style="color:rgb(128,128,128)">/</span> 4 <span style="color:rgb(128,128,128)">/</span> <span style="color:rgb(255,0,255)">PI</span><span style="color:rgb(128,128,128)">()))</span> <span style="color:rgb(128,128,128)">*</span> 256 <span style="color:rgb(128,128,128)">*</span> <span style="color:rgb(255,0,255)">POWER</span><span style="color:rgb(128,128,128)">(</span>2<span style="color:rgb(128,128,128)">,</span> @lvl<span style="color:rgb(128,128,128)">);
</span> <span style="color:rgb(0,128,0)">-- Calculate decimal tile X and Y
</span> <span style="color:rgb(0,0,255)">IF</span> <span style="color:rgb(128,128,128)">(</span>@i<span style="color:rgb(128,128,128)">=</span>2<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @tileXdecMin <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,255)">FLOOR</span><span style="color:rgb(128,128,128)">(</span>@pixelX <span style="color:rgb(128,128,128)">/</span> 256<span style="color:rgb(128,128,128)">);
</span> <span style="color:rgb(0,0,255)">SET</span> @tileYdecMin <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,255)">FLOOR</span><span style="color:rgb(128,128,128)">(</span>@pixelY <span style="color:rgb(128,128,128)">/</span> 256<span style="color:rgb(128,128,128)">);
</span> <span style="color:rgb(0,0,255)">END</span><span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">ELSE</span> <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @tileXdecMax <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,255)">FLOOR</span><span style="color:rgb(128,128,128)">(</span>@pixelX <span style="color:rgb(128,128,128)">/</span> 256<span style="color:rgb(128,128,128)">);
</span> <span style="color:rgb(0,0,255)">SET</span> @tileYdecMax <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,255)">FLOOR</span><span style="color:rgb(128,128,128)">(</span>@pixelY <span style="color:rgb(128,128,128)">/</span> 256<span style="color:rgb(128,128,128)">);
</span> <span style="color:rgb(0,0,255)">END</span><span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">SET</span> @i <span style="color:rgb(128,128,128)">=</span> @i<span style="color:rgb(128,128,128)">+</span>2<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">END</span><span style="color:rgb(128,128,128)">;
</span>
<span style="color:rgb(0,128,0)">-- Now we loop through the tiles in this rectangle
</span> <span style="color:rgb(0,0,255)">SET</span> @tileYdec <span style="color:rgb(128,128,128)">=</span> @tileYdecMin<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">WHILE</span> @tileYdec <span style="color:rgb(128,128,128)"><=</span> @tileYdecMax <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @tileXdec <span style="color:rgb(128,128,128)">=</span> @tileXdecMin<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">WHILE</span> @tileXdec <span style="color:rgb(128,128,128)"><=</span> @tileXdecMax <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @tileYdecDummy <span style="color:rgb(128,128,128)">=</span> @tileYdec<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">SET</span> @tileXdecDummy <span style="color:rgb(128,128,128)">=</span> @tileXdec<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,128,0)">-- Calculate binary tile X and Y
</span> <span style="color:rgb(0,0,255)">SET</span> @tileXbin <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,0)">''</span><span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">SET</span> @tileYbin <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,0)">''</span><span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">SET</span> @j <span style="color:rgb(128,128,128)">=</span> @lvl<span style="color:rgb(128,128,128)">-</span>1<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">WHILE</span> @j <span style="color:rgb(128,128,128)">>=</span> 0 <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @tileXdecDummy <span style="color:rgb(128,128,128)">=</span> @tileXdecDummy <span style="color:rgb(128,128,128)">-</span> <span style="color:rgb(255,0,255)">POWER</span><span style="color:rgb(128,128,128)">(</span>2<span style="color:rgb(128,128,128)">,</span> @j<span style="color:rgb(128,128,128)">);
</span> <span style="color:rgb(0,0,255)">IF</span> <span style="color:rgb(128,128,128)">(</span>@tileXdecDummy <span style="color:rgb(128,128,128)"><</span> 0<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @tileXbin <span style="color:rgb(128,128,128)">=</span> @tileXbin <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">'0'
</span> <span style="color:rgb(0,0,255)">SET</span> @tileXdecDummy <span style="color:rgb(128,128,128)">=</span> @tileXdecDummy <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,255)">POWER</span><span style="color:rgb(128,128,128)">(</span>2<span style="color:rgb(128,128,128)">,</span> @j<span style="color:rgb(128,128,128)">);
</span> <span style="color:rgb(0,0,255)">END
</span> <span style="color:rgb(0,0,255)">ELSE</span> <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @tileXbin <span style="color:rgb(128,128,128)">=</span> @tileXbin <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">'1'
</span> <span style="color:rgb(0,0,255)">END

</span> <span style="color:rgb(0,0,255)">SET</span> @tileYdecDummy <span style="color:rgb(128,128,128)">=</span> @tileYdecDummy <span style="color:rgb(128,128,128)">-</span> <span style="color:rgb(255,0,255)">POWER</span><span style="color:rgb(128,128,128)">(</span>2<span style="color:rgb(128,128,128)">,</span> @j<span style="color:rgb(128,128,128)">);
</span> <span style="color:rgb(0,0,255)">IF</span> <span style="color:rgb(128,128,128)">(</span>@tileYdecDummy <span style="color:rgb(128,128,128)"><</span> 0<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @tileYbin <span style="color:rgb(128,128,128)">=</span> @tileYbin <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">'0'
</span> <span style="color:rgb(0,0,255)">SET</span> @tileYdecDummy <span style="color:rgb(128,128,128)">=</span> @tileYdecDummy <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,255)">POWER</span><span style="color:rgb(128,128,128)">(</span>2<span style="color:rgb(128,128,128)">,</span> @j<span style="color:rgb(128,128,128)">);
</span> <span style="color:rgb(0,0,255)">END
</span> <span style="color:rgb(0,0,255)">ELSE</span> <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @tileYbin <span style="color:rgb(128,128,128)">=</span> @tileYbin <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">'1'
</span> <span style="color:rgb(0,0,255)">END
</span> <span style="color:rgb(0,0,255)">SET</span> @j <span style="color:rgb(128,128,128)">=</span> @j<span style="color:rgb(128,128,128)">-</span>1<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">END</span><span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,128,0)">-- Calculate Quadkey
</span> <span style="color:rgb(0,0,255)">SET</span> @j <span style="color:rgb(128,128,128)">=</span> 1<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">SET</span> @quadKey <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,0)">''</span><span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">WHILE</span> @j <span style="color:rgb(128,128,128)"><=</span> @lvl <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @quadKey <span style="color:rgb(128,128,128)">=</span> @quadKey <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,255)">CAST</span><span style="color:rgb(128,128,128)">(</span>2 <span style="color:rgb(128,128,128)">*</span> <span style="color:rgb(255,0,255)">CAST</span><span style="color:rgb(128,128,128)">(</span><span style="color:rgb(255,0,255)">SUBSTRING</span><span style="color:rgb(128,128,128)">(</span>@tileYbin<span style="color:rgb(128,128,128)">,</span> @j<span style="color:rgb(128,128,128)">,</span> 1<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(0,0,255)">AS</span> <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">+</span> 1 <span style="color:rgb(128,128,128)">*</span> <br> <span style="color:rgb(255,0,255)">CAST</span><span style="color:rgb(128,128,128)">(</span><span style="color:rgb(255,0,255)">SUBSTRING</span><span style="color:rgb(128,128,128)">(</span>@tileXbin<span style="color:rgb(128,128,128)">,</span> @j<span style="color:rgb(128,128,128)">,</span> 1<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(0,0,255)">AS</span> <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(0,0,255)">AS</span> <span style="color:rgb(0,0,255)">VARCHAR</span><span style="color:rgb(128,128,128)">(</span>1<span style="color:rgb(128,128,128)">));
</span> <span style="color:rgb(0,0,255)">SET</span> @j <span style="color:rgb(128,128,128)">=</span> @j<span style="color:rgb(128,128,128)">+</span>1<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">END</span><span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">INSERT</span> <span style="color:rgb(0,0,255)">INTO</span> [VE-Tiles] <span style="color:rgb(128,128,128)">(</span>ID<span style="color:rgb(128,128,128)">,</span> LVL<span style="color:rgb(128,128,128)">,</span> Quadkey<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(0,0,255)">VALUES</span> <span style="color:rgb(128,128,128)">(</span>@ID<span style="color:rgb(128,128,128)">,</span> @lvl<span style="color:rgb(128,128,128)">,</span> @quadKey<span style="color:rgb(128,128,128)">)
</span> <span style="color:rgb(0,0,255)">SET</span> @tileXdec <span style="color:rgb(128,128,128)">=</span> @tileXdec<span style="color:rgb(128,128,128)">+</span>1<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">END</span><span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">SET</span> @tileYdec <span style="color:rgb(128,128,128)">=</span> @tileYdec<span style="color:rgb(128,128,128)">+</span>1<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">END</span><span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">PRINT</span> <span style="color:rgb(255,0,0)">''</span><span style="color:rgb(128,128,128)">;</span>
<span style="color:rgb(0,0,255)">FETCH</span> <span style="color:rgb(0,0,255)">NEXT</span> <span style="color:rgb(0,0,255)">FROM</span> IdCursor <span style="color:rgb(0,0,255)">INTO</span> @ID<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">END</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">CLOSE</span> IdCursor<span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DEALLOCATE</span> IdCursor<span style="color:rgb(128,128,128)">;
<a href="http://blufiles.storage.msn.com/y1pLfDzppuxasjrQHjIC0LWIrc49iiCXKAC4EEgTT4T514o7U7 Uo2WPNr13A0mBVUZO2xbiODXkReU"><img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=340 alt=image src="http://blufiles.storage.msn.com/y1pLfDzppuxasiIgOg4RjvUKH0f0ewUMlmKEM36X4AxANGkV2K C-cjoW8djwmOx7FmhJzd1KhVHkrM" width=400 border=0></a> </span></pre>
<p>If you had a closer look at my script you noticed that I inserted the quadkeys in a new table and in the next step I will create a <br>shape which represents the bounding box of each tile:<pre><span style="color:rgb(0,0,255)">DECLARE</span> @myQuadkey <span style="color:rgb(0,0,255)">VARCHAR</span><span style="color:rgb(128,128,128)">(</span>19<span style="color:rgb(128,128,128)">);
</span><span style="color:rgb(0,0,255)">DECLARE</span> @myDummy <span style="color:rgb(0,0,255)">VARCHAR</span><span style="color:rgb(128,128,128)">(</span>38<span style="color:rgb(128,128,128)">);
</span><span style="color:rgb(0,0,255)">DECLARE</span> @myLevel <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @myQuadKeyBin <span style="color:rgb(0,0,255)">VARCHAR</span><span style="color:rgb(128,128,128)">(</span>38<span style="color:rgb(128,128,128)">);
</span><span style="color:rgb(0,0,255)">DECLARE</span> @i <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @TileXBin <span style="color:rgb(0,0,255)">VARCHAR</span><span style="color:rgb(128,128,128)">(</span>19<span style="color:rgb(128,128,128)">);
</span><span style="color:rgb(0,0,255)">DECLARE</span> @TileYBin <span style="color:rgb(0,0,255)">VARCHAR</span><span style="color:rgb(128,128,128)">(</span>19<span style="color:rgb(128,128,128)">);</span>
<span style="color:rgb(0,0,255)">DECLARE</span> @TileX <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @TileY <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @PixelXMin <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @PixelXMax <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @PixelYMin <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @PixelYMax <span style="color:rgb(0,0,255)">INT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @LatMin <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @LatMax <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @LongMin <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> @LongMax <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DECLARE</span> Tile_Cursor <span style="color:rgb(0,0,255)">CURSOR</span> <span style="color:rgb(0,0,255)">FOR</span> <span style="color:rgb(0,0,255)">SELECT</span> Quadkey <span style="color:rgb(0,0,255)">FROM</span> [VE-Tiles] <span style="color:rgb(0,0,255)">WITH</span> <span style="color:rgb(128,128,128)">(</span><span style="color:rgb(0,0,255)">NOLOCK</span><span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(0,0,255)">WHERE</span> BBox <span style="color:rgb(0,0,255)">IS</span> <span style="color:rgb(0,0,255)">NULL</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">OPEN</span> Tile_Cursor<span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">FETCH</span> <span style="color:rgb(0,0,255)">NEXT</span> <span style="color:rgb(0,0,255)">FROM</span> Tile_Cursor <span style="color:rgb(0,0,255)">INTO</span> @myQuadkey<span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">WHILE</span> <span style="color:rgb(255,0,255)">@@FETCH_STATUS</span> <span style="color:rgb(128,128,128)">=</span> 0
<span style="color:rgb(0,0,255)">BEGIN
</span><span style="color:rgb(0,128,0)">-------------------------------------------------------------------
-- Convert Quadkey in binary Quadkey
-------------------------------------------------------------------
</span> <span style="color:rgb(0,0,255)">SET</span> @myLevel <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,255)">LEN</span><span style="color:rgb(128,128,128)">(</span>@myQuadkey<span style="color:rgb(128,128,128)">);
</span> <span style="color:rgb(0,0,255)">SET</span> @myQuadKeyBin <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,0)">''</span><span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">SET</span> @i <span style="color:rgb(128,128,128)">=</span> 0<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">WHILE</span> @i <span style="color:rgb(128,128,128)"><</span> @myLevel <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @myDummy <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,255)">SUBSTRING</span><span style="color:rgb(128,128,128)">(</span>@myQuadkey<span style="color:rgb(128,128,128)">,</span> @myLevel<span style="color:rgb(128,128,128)">-</span>@i<span style="color:rgb(128,128,128)">,</span> 1<span style="color:rgb(128,128,128)">);
</span> <span style="color:rgb(0,0,255)">IF</span> @myDummy <span style="color:rgb(128,128,128)">=</span> 3 <span style="color:rgb(0,0,255)">SET</span> @myQuadKeyBin <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,0)">'11'</span> <span style="color:rgb(128,128,128)">+</span> @myQuadKeyBin<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">IF</span> @myDummy <span style="color:rgb(128,128,128)">=</span> 2 <span style="color:rgb(0,0,255)">SET</span> @myQuadKeyBin <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,0)">'10'</span> <span style="color:rgb(128,128,128)">+</span> @myQuadKeyBin<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">IF</span> @myDummy <span style="color:rgb(128,128,128)">=</span> 1 <span style="color:rgb(0,0,255)">SET</span> @myQuadKeyBin <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,0)">'01'</span> <span style="color:rgb(128,128,128)">+</span> @myQuadKeyBin<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">IF</span> @myDummy <span style="color:rgb(128,128,128)">=</span> 0 <span style="color:rgb(0,0,255)">SET</span> @myQuadKeyBin <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,0)">'00'</span> <span style="color:rgb(128,128,128)">+</span> @myQuadKeyBin<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">SET</span> @i <span style="color:rgb(128,128,128)">=</span> @i<span style="color:rgb(128,128,128)">+</span>1
<span style="color:rgb(0,0,255)">END
</span><span style="color:rgb(0,128,0)">-------------------------------------------------------------------
-- Break binary Quadtree in binary tileX and tileY
-------------------------------------------------------------------
</span> <span style="color:rgb(0,0,255)">SET</span> @myDummy <span style="color:rgb(128,128,128)">=</span> @myQuadKeyBin<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">SET</span> @TileXBin <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,0)">''</span><span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">SET</span> @TileYBin <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,0)">''</span><span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">SET</span> @i <span style="color:rgb(128,128,128)">=</span> 0<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">WHILE</span> @i <span style="color:rgb(128,128,128)"><</span> <span style="color:rgb(255,0,255)">LEN</span><span style="color:rgb(128,128,128)">(</span>@myQuadKeyBin<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @myDummy <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,255)">SUBSTRING</span><span style="color:rgb(128,128,128)">(</span>@myQuadKeyBin<span style="color:rgb(128,128,128)">,</span> <span style="color:rgb(255,0,255)">LEN</span><span style="color:rgb(128,128,128)">(</span>@myQuadKeyBin<span style="color:rgb(128,128,128)">)-</span>@i<span style="color:rgb(128,128,128)">,</span> 1<span style="color:rgb(128,128,128)">)
</span> <span style="color:rgb(0,0,255)">IF</span> <span style="color:rgb(128,128,128)">(</span><span style="color:rgb(255,0,255)">CAST</span><span style="color:rgb(128,128,128)">(</span>@i <span style="color:rgb(0,0,255)">AS</span> <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">)/</span>2 <span style="color:rgb(128,128,128)">-</span> <span style="color:rgb(255,0,255)">FLOOR</span><span style="color:rgb(128,128,128)">(</span>@i<span style="color:rgb(128,128,128)">/</span>2<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">=</span> 0<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @TileXBin <span style="color:rgb(128,128,128)">=</span> @myDummy <span style="color:rgb(128,128,128)">+</span> @TileXBin<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">END
</span> <span style="color:rgb(0,0,255)">ELSE</span> <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @TileYBin <span style="color:rgb(128,128,128)">=</span> @myDummy <span style="color:rgb(128,128,128)">+</span> @TileYBin<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">END
</span> <span style="color:rgb(0,0,255)">SET</span> @i <span style="color:rgb(128,128,128)">=</span> @i<span style="color:rgb(128,128,128)">+</span>1
<span style="color:rgb(0,0,255)">END
</span><span style="color:rgb(0,128,0)">-------------------------------------------------------------------
-- Convert binary tileX and tileY to decimal tileX and tileY
-------------------------------------------------------------------
</span> <span style="color:rgb(0,0,255)">SET</span> @TileX <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,0)">''</span><span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">SET</span> @TileY <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,0)">''</span><span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">SET</span> @i <span style="color:rgb(128,128,128)">=</span> 0<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">WHILE</span> @i <span style="color:rgb(128,128,128)"><</span> @myLevel <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @myDummy <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,255)">SUBSTRING</span><span style="color:rgb(128,128,128)">(</span>@TileXBin<span style="color:rgb(128,128,128)">,</span> <span style="color:rgb(255,0,255)">LEN</span><span style="color:rgb(128,128,128)">(</span>@TileXBin<span style="color:rgb(128,128,128)">)-</span>@i<span style="color:rgb(128,128,128)">,</span> 1<span style="color:rgb(128,128,128)">)
</span> <span style="color:rgb(0,0,255)">SET</span> @TileX <span style="color:rgb(128,128,128)">=</span> @TileX <span style="color:rgb(128,128,128)">+</span> @myDummy <span style="color:rgb(128,128,128)">*</span> <span style="color:rgb(255,0,255)">POWER</span><span style="color:rgb(128,128,128)">(</span>2<span style="color:rgb(128,128,128)">,</span> @i<span style="color:rgb(128,128,128)">)
</span> <span style="color:rgb(0,0,255)">SET</span> @i <span style="color:rgb(128,128,128)">=</span> @i<span style="color:rgb(128,128,128)">+</span>1
<span style="color:rgb(0,0,255)">END</span>
<span style="color:rgb(0,0,255)">SET</span> @i <span style="color:rgb(128,128,128)">=</span> 0<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">WHILE</span> @i <span style="color:rgb(128,128,128)"><</span> @myLevel <span style="color:rgb(0,0,255)">BEGIN
</span> <span style="color:rgb(0,0,255)">SET</span> @myDummy <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,255)">SUBSTRING</span><span style="color:rgb(128,128,128)">(</span>@TileYBin<span style="color:rgb(128,128,128)">,</span> <span style="color:rgb(255,0,255)">LEN</span><span style="color:rgb(128,128,128)">(</span>@TileYBin<span style="color:rgb(128,128,128)">)-</span>@i<span style="color:rgb(128,128,128)">,</span> 1<span style="color:rgb(128,128,128)">)
</span> <span style="color:rgb(0,0,255)">SET</span> @TileY <span style="color:rgb(128,128,128)">=</span> @TileY <span style="color:rgb(128,128,128)">+</span> @myDummy <span style="color:rgb(128,128,128)">*</span> <span style="color:rgb(255,0,255)">POWER</span><span style="color:rgb(128,128,128)">(</span>2<span style="color:rgb(128,128,128)">,</span> @i<span style="color:rgb(128,128,128)">)
</span> <span style="color:rgb(0,0,255)">SET</span> @i <span style="color:rgb(128,128,128)">=</span> @i<span style="color:rgb(128,128,128)">+</span>1
<span style="color:rgb(0,0,255)">END
</span><span style="color:rgb(0,128,0)">-------------------------------------------------------------------
-- Determine PixelX and PixelY-Ranges
-------------------------------------------------------------------
</span> <span style="color:rgb(0,0,255)">SET</span> @PixelXMin <span style="color:rgb(128,128,128)">=</span> @TileX <span style="color:rgb(128,128,128)">*</span> 256
<span style="color:rgb(0,0,255)">SET</span> @PixelXMax <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(128,128,128)">((</span>@TileX <span style="color:rgb(128,128,128)">+</span> 1<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">*</span> 256<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">-</span> 1
<span style="color:rgb(0,0,255)">SET</span> @PixelYMin <span style="color:rgb(128,128,128)">=</span> @TileY <span style="color:rgb(128,128,128)">*</span> 256
<span style="color:rgb(0,0,255)">SET</span> @PixelYMax <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(128,128,128)">((</span>@TileY <span style="color:rgb(128,128,128)">+</span> 1<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">*</span> 256<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">-</span> 1
<span style="color:rgb(0,128,0)">-------------------------------------------------------------------
-- Calculate Bounding-Box
-------------------------------------------------------------------
</span> <span style="color:rgb(0,0,255)">SET</span> @LongMin <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(128,128,128)">(</span><span style="color:rgb(255,0,255)">CAST</span><span style="color:rgb(128,128,128)">(</span>@PixelXMin <span style="color:rgb(0,0,255)">AS</span> <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">/</span> 256 <span style="color:rgb(128,128,128)">/</span> <span style="color:rgb(255,0,255)">POWER</span><span style="color:rgb(128,128,128)">(</span>2<span style="color:rgb(128,128,128)">,</span> <span style="color:rgb(255,0,255)">CAST</span><span style="color:rgb(128,128,128)">(</span>@myLevel <span style="color:rgb(0,0,255)">AS</span> <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">))</span> <span style="color:rgb(128,128,128)">*</span> 360<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">-</span> 180
<span style="color:rgb(0,0,255)">SET</span> @LongMax <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(128,128,128)">(</span><span style="color:rgb(255,0,255)">CAST</span><span style="color:rgb(128,128,128)">(</span>@PixelXMax <span style="color:rgb(0,0,255)">AS</span> <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">/</span> 256 <span style="color:rgb(128,128,128)">/</span> <span style="color:rgb(255,0,255)">POWER</span><span style="color:rgb(128,128,128)">(</span>2<span style="color:rgb(128,128,128)">,</span> <span style="color:rgb(255,0,255)">CAST</span><span style="color:rgb(128,128,128)">(</span>@myLevel <span style="color:rgb(0,0,255)">AS</span> <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">))</span> <span style="color:rgb(128,128,128)">*</span> 360<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">-</span> 180
<span style="color:rgb(0,0,255)">SET</span> @LatMin <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,255)">ASIN</span><span style="color:rgb(128,128,128)">((</span><span style="color:rgb(255,0,255)">EXP</span><span style="color:rgb(128,128,128)">((</span>0.5 <span style="color:rgb(128,128,128)">-</span> <span style="color:rgb(255,0,255)">CAST</span><span style="color:rgb(128,128,128)">(</span>@PixelYMin <span style="color:rgb(0,0,255)">AS</span> <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">/</span> 256 <span style="color:rgb(128,128,128)">/</span> <span style="color:rgb(255,0,255)">POWER</span><span style="color:rgb(128,128,128)">(</span>2<span style="color:rgb(128,128,128)">,</span> <span style="color:rgb(255,0,255)">CAST</span><span style="color:rgb(128,128,128)">(</span>@myLevel <span style="color:rgb(0,0,255)">AS</span> <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">)))</span> <br> <span style="color:rgb(128,128,128)">*</span> 4 <span style="color:rgb(128,128,128)">*</span> <span style="color:rgb(255,0,255)">PI</span><span style="color:rgb(128,128,128)">())</span> <span style="color:rgb(128,128,128)">-</span> 1<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">/</span> <span style="color:rgb(128,128,128)">(</span><span style="color:rgb(255,0,255)">EXP</span><span style="color:rgb(128,128,128)">((</span>0.5 <span style="color:rgb(128,128,128)">-</span> <span style="color:rgb(255,0,255)">CAST</span><span style="color:rgb(128,128,128)">(</span>@PixelYMin <span style="color:rgb(0,0,255)">AS</span> <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">/</span> 256 <br> <span style="color:rgb(128,128,128)">/</span> <span style="color:rgb(255,0,255)">POWER</span><span style="color:rgb(128,128,128)">(</span>2<span style="color:rgb(128,128,128)">,</span> <span style="color:rgb(255,0,255)">CAST</span><span style="color:rgb(128,128,128)">(</span>@myLevel <span style="color:rgb(0,0,255)">AS</span> <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">)))</span> <span style="color:rgb(128,128,128)">*</span> 4 <span style="color:rgb(128,128,128)">*</span> <span style="color:rgb(255,0,255)">PI</span><span style="color:rgb(128,128,128)">())</span> <span style="color:rgb(128,128,128)">+</span> 1<span style="color:rgb(128,128,128)">))</span> <span style="color:rgb(128,128,128)">*</span> 180 <span style="color:rgb(128,128,128)">/</span> <span style="color:rgb(255,0,255)">PI</span><span style="color:rgb(128,128,128)">()
</span> <span style="color:rgb(0,0,255)">SET</span> @LatMax <span style="color:rgb(128,128,128)">=</span> <span style="color:rgb(255,0,255)">ASIN</span><span style="color:rgb(128,128,128)">((</span><span style="color:rgb(255,0,255)">EXP</span><span style="color:rgb(128,128,128)">((</span>0.5 <span style="color:rgb(128,128,128)">-</span> <span style="color:rgb(255,0,255)">CAST</span><span style="color:rgb(128,128,128)">(</span>@PixelYMax <span style="color:rgb(0,0,255)">AS</span> <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">/</span> 256 <span style="color:rgb(128,128,128)">/</span> <span style="color:rgb(255,0,255)">POWER</span><span style="color:rgb(128,128,128)">(</span>2<span style="color:rgb(128,128,128)">,</span> <span style="color:rgb(255,0,255)">CAST</span><span style="color:rgb(128,128,128)">(</span>@myLevel <span style="color:rgb(0,0,255)">AS</span> <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">)))</span> <br> <span style="color:rgb(128,128,128)">*</span> 4 <span style="color:rgb(128,128,128)">*</span> <span style="color:rgb(255,0,255)">PI</span><span style="color:rgb(128,128,128)">())</span> <span style="color:rgb(128,128,128)">-</span> 1<span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">/</span> <span style="color:rgb(128,128,128)">(</span><span style="color:rgb(255,0,255)">EXP</span><span style="color:rgb(128,128,128)">((</span>0.5 <span style="color:rgb(128,128,128)">-</span> <span style="color:rgb(255,0,255)">CAST</span><span style="color:rgb(128,128,128)">(</span>@PixelYMax <span style="color:rgb(0,0,255)">AS</span> <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">)</span> <span style="color:rgb(128,128,128)">/</span> 256 <br> <span style="color:rgb(128,128,128)">/</span> <span style="color:rgb(255,0,255)">POWER</span><span style="color:rgb(128,128,128)">(</span>2<span style="color:rgb(128,128,128)">,</span> <span style="color:rgb(255,0,255)">CAST</span><span style="color:rgb(128,128,128)">(</span>@myLevel <span style="color:rgb(0,0,255)">AS</span> <span style="color:rgb(0,0,255)">FLOAT</span><span style="color:rgb(128,128,128)">)))</span> <span style="color:rgb(128,128,128)">*</span> 4 <span style="color:rgb(128,128,128)">*</span> <span style="color:rgb(255,0,255)">PI</span><span style="color:rgb(128,128,128)">())</span> <span style="color:rgb(128,128,128)">+</span> 1<span style="color:rgb(128,128,128)">))</span> <span style="color:rgb(128,128,128)">*</span> 180 <span style="color:rgb(128,128,128)">/</span> <span style="color:rgb(255,0,255)">PI</span><span style="color:rgb(128,128,128)">()
</span><span style="color:rgb(0,128,0)">-------------------------------------------------------------------
-- Update Geometry
-------------------------------------------------------------------
</span> <span style="color:rgb(0,0,255)">EXEC</span><span style="color:rgb(128,128,128)">(</span><span style="color:rgb(255,0,0)">'UPDATE [VE-Tiles] SET BBox=geometry::STGeomFromText('</span> <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">''''</span> <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">'POLYGON(('</span> <span style="color:rgb(128,128,128)">+</span> @LatMin <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">' '</span> <br> <span style="color:rgb(128,128,128)">+</span> @LongMin <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">', '</span> <span style="color:rgb(128,128,128)">+</span> @LatMin <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">' '</span> <span style="color:rgb(128,128,128)">+</span> @LongMax <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">', '</span> <span style="color:rgb(128,128,128)">+</span> @LatMax <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">' '</span> <span style="color:rgb(128,128,128)">+</span> @LongMax <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">', '</span> <br> <span style="color:rgb(128,128,128)">+</span> @LatMax <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">' '</span> <span style="color:rgb(128,128,128)">+</span> @LongMin <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">', '</span> <span style="color:rgb(128,128,128)">+</span> @LatMin <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">' '</span> <span style="color:rgb(128,128,128)">+</span> @LongMin <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">'))'</span> <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">''''</span> <br> <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">', 4326) WHERE QuadKey='</span> <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">''''</span> <span style="color:rgb(128,128,128)">+</span> @myQuadkey <span style="color:rgb(128,128,128)">+</span> <span style="color:rgb(255,0,0)">''''</span><span style="color:rgb(128,128,128)">);
</span> <span style="color:rgb(0,0,255)">FETCH</span> <span style="color:rgb(0,0,255)">NEXT</span> <span style="color:rgb(0,0,255)">FROM</span> Tile_Cursor <span style="color:rgb(0,0,255)">INTO</span> @myQuadkey<span style="color:rgb(128,128,128)">;
</span> <span style="color:rgb(0,0,255)">END</span><span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">CLOSE</span> Tile_Cursor<span style="color:rgb(128,128,128)">;
</span><span style="color:rgb(0,0,255)">DEALLOCATE</span> Tile_Cursor<span style="color:rgb(128,128,128)">;</span></pre><a href="http://11011.net/software/vspaste"></a><pre><font face=verdana>With a call like the one shown below we can retrieve the result for one shape</font></pre><pre><span style="color:rgb(0,0,255)">SELECT</span> BBox<span style="color:rgb(128,128,128)">.</span>STAsText<span style="color:rgb(128,128,128)">()</span> <span style="color:rgb(0,0,255)">FROM</span> [VE-Tiles] <span style="color:rgb(0,0,255)">WHERE</span> ID<span style="color:rgb(128,128,128)">=</span>24</pre><pre><font face=verdana>and here is how it looks like in Virtual Earth:</font></pre><pre><a href="http://blufiles.storage.msn.com/y1pLfDzppuxasg2J8I4a7W9Lb5nZCdYNoH3uH2arMiWr7ZgQD-kw1OMTYFQIlQ6Cy-AEnYpDpTmg8I"><img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=291 alt=image src="http://blufiles.storage.msn.com/y1pLfDzppuxasiOHgKJg79GJ-ErGxoo8X7Cz6n7JLA82jGOVkr68UDOv5B9de2dnNiKmGulChro hmI" width=400 border=0></a> </pre></ol><img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=4819404664324524694&page=RSS%3a+Map+of+Birds+Eye+Coverage+in+EMEA+%26+ APAC+(Part+3)&referrer=" width="1px" height="1px" border="0" alt=""><img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&NA=1149&PI=88469&RF=&DI=3919&PS=85545&TP=johanneskebeck.spaces.live.com&GT1=JohannesKebeck">

Click here to view the article. (http://JohannesKebeck.spaces.live.com/Blog/cns!42E1F70205EC8A96!1736.entry)

 
Web mp2kmag.com
mapforums.com