Advanced Windows PowerShell Scripting Video Training

Advanced Windows PowerShell Scripting Video Training
Advanced Windows PowerShell Scripting Video Training

Thursday, June 4, 2015

Use PowerShell to get BING Map Quadkeys

I spent part of my day trying to decipher how to ask BING for map tiles from its database. You can find a lot of useful information at Bing Maps Tile System. I’m plucking through the logic of how BING handles maps for a project that I am working on.  One of the mysteries is how to calculate a tile based on the zoom level and location.  I am not going to go through the specifics of how this works.  You can read the reference article for that.  My objective was to feed a function the X and Y location values and zoom level and get the Quadkey value back.  This is not going to be a stand alone function, but inside other code. Here it is.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

Function ConvertQuadKeyTo-String

{

Param (

    $ZoomLevel = 3,

    $TileX = "3",

    $TileY = "5"

)

    $XVaL = [Convert]::ToString("$TileX",2)

    $YVaL = [Convert]::ToString("$Tiley",2)

 

    # Pad the values based on the zoom level.

    $XVal = $XVal.Padleft($ZoomLevel,"0")

    $YVal = $YVal.Padleft($ZoomLevel,"0")

 

    # Joint the 2 values together.

    # To do this, take the first character of the YVal

    # and then append the first character of the XVal.  Repeat.

    $LoopControl = 0

    $Combined = ""

    $XVal = $XVal.ToCharArray()

    $YVal = $YVal.toCharArray()

    While ($LoopControl -lt $ZoomLevel)

    {

        $Combined = $Combined+ $YVal[$LoopControl] + $XVal[$LoopControl]

        $LoopControl++

    }

   

    # Convert the combined number to Base4.

   

    # Determine if there is an even or odd number of digits.

    # if odd, the prepend a zero.

    If ($Combined.Length % 2) {$Combined = "0"+$Combined}

 

    # Take each pair of digits and convert them from Base 2

    # to Base 10. 

    $QuadKey = ""

    $Combined = $Combined.ToCharArray()

    For($X=0;$X -lt $Combined.Length; $X+=2)

    {

        $String = $Combined[$X]+$Combined[$X+1]

        $Int = [Convert]::ToInt32("$String",2)

        $QuadKey = $QuadKey + $Int.ToString()

    }

 

 

    Write-Output $QuadKey

} # END: Function ConvertQuadKeyTo-String

 

The string that is returned in used in the request for the image. Here is the image from QuadKey “0”.  Yes, I have Sapien’s PowerShell Studio 2015 engaged on this project.

image

Zoom level 2 at QuadKey 02

image

No error handling for valid values is in this code.  That will be handled by another set of code.

No comments: