Calculate Maidenhead locator from latitude and longitude.

    Args:
        latitude (float): Position's latitude
        longitude (float): Position's longitude
        precision (str): Precision with which generate locator string

    Returns:
        str: Maidenhead locator for latitude and longitude

    Raise:
        ValueError: Invalid precision identifier
        ValueError: Invalid latitude or longitude value

def to_grid_locator(latitude, longitude, precision='square'):
    """Calculate Maidenhead locator from latitude and longitude.

    Args:
        latitude (float): Position's latitude
        longitude (float): Position's longitude
        precision (str): Precision with which generate locator string

    Returns:
        str: Maidenhead locator for latitude and longitude

    Raise:
        ValueError: Invalid precision identifier
        ValueError: Invalid latitude or longitude value
    """
    if precision not in ('square', 'subsquare', 'extsquare'):
        raise ValueError('Unsupported precision value %r' % precision)

    if not -90 <= latitude <= 90:
        raise ValueError('Invalid latitude value %r' % latitude)
    if not -180 <= longitude <= 180:
        raise ValueError('Invalid longitude value %r' % longitude)

    latitude += 90.0
    longitude += 180.0

    locator = []

    field = int(longitude / LONGITUDE_FIELD)
    locator.append(chr(field + 65))
    longitude -= field * LONGITUDE_FIELD

    field = int(latitude / LATITUDE_FIELD)
    locator.append(chr(field + 65))
    latitude -= field * LATITUDE_FIELD

    square = int(longitude / LONGITUDE_SQUARE)
    locator.append(str(square))
    longitude -= square * LONGITUDE_SQUARE

    square = int(latitude / LATITUDE_SQUARE)
    locator.append(str(square))
    latitude -= square * LATITUDE_SQUARE

    if precision in ('subsquare', 'extsquare'):
        subsquare = int(longitude / LONGITUDE_SUBSQUARE)
        locator.append(chr(subsquare + 97))
        longitude -= subsquare * LONGITUDE_SUBSQUARE

        subsquare = int(latitude / LATITUDE_SUBSQUARE)
        locator.append(chr(subsquare + 97))
        latitude -= subsquare * LATITUDE_SUBSQUARE

    if precision == 'extsquare':
        extsquare = int(longitude / LONGITUDE_EXTSQUARE)
        locator.append(str(extsquare))

        extsquare = int(latitude / LATITUDE_EXTSQUARE)
        locator.append(str(extsquare))

    return ''.join(locator)