Functions/Get-Address.ps1

function Get-Address {
<#
.SYNOPSIS
    To get the geocode (latitude, longitude) of a particular address
.DESCRIPTION
    To get the geocode (latitude, longitude) of a particular address.
.PARAMETER Coordinate
    String representing the latitude and longitude coordinates of a location. ValueFromPipeline
.PARAMETER Latitude
    Latitude north or south of the equator. Valid range -90 to 90. Aliased to 'Lat'. ValueFromPipeLineByPropertyName
.PARAMETER Longitude
    Longitude east or west of the prime meridian. Valid range -180 to 180. Aliased to 'Long'. ValueFromPipeLineByPropertyName
.EXAMPLE
    '38.89767,-77.03655' | Get-Address | Select-Object StNumber, StAddress, City, State, Prov, Postal
 
    stnumber staddress city state prov postal
    -------- --------- ---- ----- ---- ------
    1600 PENNSYLVANIA AVE NW WASHINGTON DC US 20500
.EXAMPLE
    $Coordinate = New-Object psobject -Prop ([ordered] @{Latitude=51.51288;Longitude=0.06600})
    $PrimeMinister = $Coordinate | Get-Address
    $PrimeMinister | Select-Object StNumber, StAddress, City, State, Prov, Postal
 
    stnumber staddress city state prov postal
    -------- --------- ---- ----- ---- ------
    10 DOWNINGS LONDON UK E66WP
.EXAMPLE
    Get-Address -Latitude 51.51288 -Longitude 0.06600 | Select-Object StNumber, StAddress, City, State, Prov, Postal
 
    stnumber staddress city state prov postal
    -------- --------- ---- ----- ---- ------
    10 DOWNINGS LONDON UK E66WP
.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-lat-long-to-addresses-part-3
#>


    #region parameter
    [CmdletBinding(DefaultParameterSetName='String', ConfirmImpact = 'None')]
    [OutputType('psobject')]
    Param (
        [Parameter(Mandatory, HelpMessage="Please enter a coordinate string in the form 'latitude,longitude'", Position = 0, ParameterSetName = 'String', ValueFromPipeline)]
        [string[]] $Coordinate,


        [Parameter(Mandatory, HelpMessage='Please enter a latitude (min -90, max +90)', Position = 0, ParameterSetName = 'Coordinates', ValueFromPipeLineByPropertyName)]
        [ValidateRange(-90,90)]
        [Alias('Lat')]
        [double] $Latitude,

        [Parameter(Mandatory, HelpMessage='Please enter a longitude (min -180, max +190)', Position = 1, ParameterSetName = 'Coordinates', ValueFromPipeLineByPropertyName)]
        [ValidateRange(-180,180)]
        [Alias('Long')]
        [double] $Longitude
    )
    #endregion parameter

    begin {
        Write-Verbose -Message "Starting [$($MyInvocation.Mycommand)]"
        $url='https://geocode.xyz'
        $null = Invoke-RestMethod -Uri $url -SessionVariable session
    }

    process {
        if ($PsCmdlet.ParameterSetName -eq 'String') {
            foreach ($currentCoordinate in $Coordinate) {
                Invoke-RestMethod -Uri "$url/$currentCoordinate?geoit=json" -WebSession $session
            }
        } else {
            $currentCoordinate = "$Latitude,$Longitude"
            Invoke-RestMethod -Uri "$url/$currentCoordinate?geoit=json" -WebSession $session
        }
    }

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