Gridsquare (gridsquare v0.2.0)
View SourceGridSquare calculator for encoding/decoding between latitude/longitude and Maidenhead Locator System grid references.
The Maidenhead Locator System is used by ham radio operators to exchange approximate locations. It uses a base conversion system with changing radix:
- First pair: base 18 (A-R) for 10° lat × 20° lon fields
- Second pair: base 10 (0-9) for 1° lat × 2° lon squares
- Third pair: base 24 (A-X) for 2.5' lat × 5' lon subsquares
- Fourth pair: base 10 (0-9) for extended subsquares
- Can be extended indefinitely with alternating base 10/base 24 pairs
Summary
Types
Base18 char (A-R)
Base24 char (A-X)
Internal coordinates for extended precision
Field index (0-17)
Height of grid square in degrees
Maidenhead grid reference string (uppercase/lowercase, 6-20 chars)
Width of grid square in degrees
Latitude in degrees (-90.0 to 90.0)
Longitude in degrees (-180.0 to 180.0)
Latitude normalized to -90.0 <= x < 90.0
Longitude normalized to -180.0 <= x < 180.0
Precision (number of characters in grid reference, 6 to 20)
Square index (0-9)
Subsquare string (lowercase, 6 chars)
Subsquare index (0-23)
Functions
Decodes a grid square reference to latitude and longitude.
Calculates the distance and direction between two grid squares.
Encodes latitude and longitude to a grid square reference.
Creates a new GridSquare struct from a grid reference.
Types
@type base18_char() :: String.t()
Base18 char (A-R)
@type base24_char() :: String.t()
Base24 char (A-X)
@type coordinates() :: %{ lon: longitude(), lat: latitude(), field_lon: field_index(), field_lat: field_index(), square_lon: square_index(), square_lat: square_index(), subsquare_lon: subsquare_index(), subsquare_lat: subsquare_index() }
Internal coordinates for extended precision
@type decode_result() :: Gridsquare.DecodeResult.t()
@type distance_result() :: Gridsquare.DistanceResult.t()
@type encode_result() :: Gridsquare.EncodeResult.t()
@type field_index() :: 0..17
Field index (0-17)
@type grid_height() :: float()
Height of grid square in degrees
@type grid_reference() :: <<_::48, _::_*8>>
Maidenhead grid reference string (uppercase/lowercase, 6-20 chars)
@type grid_square() :: Gridsquare.GridSquare.t()
@type grid_width() :: float()
Width of grid square in degrees
@type latitude() :: float()
Latitude in degrees (-90.0 to 90.0)
@type longitude() :: float()
Longitude in degrees (-180.0 to 180.0)
@type normalized_latitude() :: float()
Latitude normalized to -90.0 <= x < 90.0
@type normalized_longitude() :: float()
Longitude normalized to -180.0 <= x < 180.0
@type precision() :: 6..20
Precision (number of characters in grid reference, 6 to 20)
@type square_index() :: 0..9
Square index (0-9)
@type subsquare() :: <<_::48>>
Subsquare string (lowercase, 6 chars)
@type subsquare_index() :: 0..23
Subsquare index (0-23)
Functions
@spec decode(grid_reference()) :: decode_result()
Decodes a grid square reference to latitude and longitude.
Examples
iex> Gridsquare.decode("DN40bi")
%Gridsquare.DecodeResult{latitude: 40.35416666666667, longitude: -111.875, width: 0.08333333333333333, height: 0.041666666666666664}
@spec distance_between(grid_reference(), grid_reference()) :: distance_result()
Calculates the distance and direction between two grid squares.
Returns a struct with:
distance_km
: Distance in kilometersdistance_mi
: Distance in milesbearing_degrees
: Bearing in degrees (0-360)
Examples
iex> result = Gridsquare.distance_between("DN40bi", "DN40bj")
iex> %Gridsquare.DistanceResult{distance_km: distance_km, distance_mi: distance_mi, bearing_degrees: bearing_degrees} = result
iex> distance_km > 0
true
iex> distance_mi > 0
true
iex> bearing_degrees >= 0 and bearing_degrees <= 360
true
iex> result = Gridsquare.distance_between("DN40bi", "DN40ci")
iex> %Gridsquare.DistanceResult{distance_km: distance_km, distance_mi: distance_mi, bearing_degrees: bearing_degrees} = result
iex> distance_km > 0
true
iex> distance_mi > 0
true
iex> bearing_degrees >= 0 and bearing_degrees <= 360
true
iex> result = Gridsquare.distance_between("DN40bi", "DN40cj")
iex> %Gridsquare.DistanceResult{distance_km: distance_km, distance_mi: distance_mi, bearing_degrees: bearing_degrees} = result
iex> distance_km > 0
true
iex> distance_mi > 0
true
iex> bearing_degrees >= 0 and bearing_degrees <= 360
true
@spec encode(longitude(), latitude(), precision()) :: encode_result()
Encodes latitude and longitude to a grid square reference.
Examples
iex> Gridsquare.encode(-111.866785, 40.363840)
%Gridsquare.EncodeResult{grid_reference: "DN40bi", subsquare: "dn40bi"}
iex> Gridsquare.encode(-111.866785, 40.363840, 10)
%Gridsquare.EncodeResult{grid_reference: "DN40BI00OR", subsquare: "dn40bi"}
@spec new(grid_reference()) :: grid_square()
Creates a new GridSquare struct from a grid reference.
Examples
iex> grid = Gridsquare.new("DN40bi")
iex> grid.center
%{latitude: 40.35416666666667, longitude: -111.875}
iex> grid.width
0.08333333333333333
iex> grid.height
0.041666666666666664