Skip to main content

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.

Comments

Popular posts from this blog

Adding a Comment to a GPO with PowerShell

As I'm writing this article, I'm also writing a customization for a PowerShell course I'm teaching next week in Phoenix.  This customization deals with Group Policy and PowerShell.  For those of you who attend my classes may already know this, but I sit their and try to ask the questions to myself that others may ask as I present the material.  I finished up my customization a few hours ago and then I realized that I did not add in how to put a comment on a GPO.  This is a feature that many Group Policy Administrators may not be aware of. This past summer I attended a presentation at TechEd on Group Policy.  One organization in the crowd had over 5,000 Group Policies.  In an environment like that, the comment section can be priceless.  I always like to write in the comment section why I created the policy so I know its purpose next week after I've completed 50 other tasks and can't remember what I did 5 minutes ago. In the Group Policy module for PowerShell V3, th

Return duplicate values from a collection with PowerShell

If you have a collection of objects and you want to remove any duplicate items, it is fairly simple. # Create a collection with duplicate values $Set1 = 1 , 1 , 2 , 2 , 3 , 4 , 5 , 6 , 7 , 1 , 2   # Remove the duplicate values. $Set1 | Select-Object -Unique 1 2 3 4 5 6 7 What if you want only the duplicate values and nothing else? # Create a collection with duplicate values $Set1 = 1 , 1 , 2 , 2 , 3 , 4 , 5 , 6 , 7 , 1 , 2   #Create a second collection with duplicate values removed. $Set2 = $Set1 | Select-Object -Unique   # Return only the duplicate values. ( Compare-Object -ReferenceObject $Set2 -DifferenceObject $Set1 ) . InputObject | Select-Object – Unique 1 2 This works with objects as well as numbers.  The first command creates a collection with 2 duplicates of both 1 and 2.   The second command creates another collection with the duplicates filtered out.  The Compare-Object cmdlet will first find items that are diffe

How to list all the AD LDS instances on a server

AD LDS allows you to provide directory services to applications that are free of the confines of Active Directory.  To list all the AD LDS instances on a server, follow this procedure: Log into the server in question Open a command prompt. Type dsdbutil and press Enter Type List Instances and press Enter . You will receive a list of the instance name, both the LDAP and SSL port numbers, the location of the database, and its status.