Functions/Get-GeoCode.ps1

function Get-GeoCode {
<#
.SYNOPSIS
    To get the geocode (latitude, longitude) of a particular address
.DESCRIPTION
    To get the geocode (latitude, longitude) of a particular address. Defaults output as an object, can specify a switch to output as a string
.PARAMETER Address
    Mandatory string which is the address to lookup
.PARAMETER AsString
    Switch to make the output appear as a string
.EXAMPLE
    Get-GeoCode -Address '1600 Pennsylvania Ave NW, Washington DC'
 
    Latitude Longitude
    -------- ---------
    38.89767 -77.03655
.EXAMPLE
    Get-GeoCode -Address '1600 Pennsylvania Ave NW, Washington DC' -AsString
 
    38.89767,-77.03655
.EXAMPLE
    Get-GeoCode -Address '10 Downing St, London UK'
 
    Latitude Longitude
    -------- ---------
    51.51288 0.06600
.NOTES
    There is a throttle limit on the number of requests that you can submit in a given time period. Wait at least 30 seconds between each request
 
    Inspired by: https://community.idera.com/database-tools/powershell/powertips/b/tips/posts/geocoding-converting-addresses-to-lat-long-part-2?CommentId=767cd85b-6f1b-475a-a419-d894f487ca87
#>


    #region parameter
    [CmdletBinding(ConfirmImpact = 'None')]
    [OutputType('psobject')]
    Param (

        [Parameter(Mandatory, HelpMessage='Please enter an address')]
        [string] $Address,

        [switch] $AsString
    )
    #endregion parameter

    begin {
        Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]"
    }

    process {
        $AddressEncoded = [System.Net.WebUtility]::UrlEncode($Address)
        $null = Invoke-RestMethod -SessionVariable session -Uri "https://geocode.xyz"
        $data = Invoke-RestMethod -WebSession $session -Uri "https://geocode.xyz/${AddressEncoded}?json=1"
        if ($null -ne $data.error) {
             throw "Address not found. $($data.Error.Description)"
        }
        if (-not $AsString) {
            [PSCustomObject] ([ordered] @{
                 Latitude = $data.latt
                 Longitude = $data.longt
            })
        } else {
            Write-Output -InputObject (@($data.latt,$data.longt) -join ',')
        }
    }

    end {
        Write-Verbose -Message "Ending [$($MyInvocation.Mycommand)]"
    }
}