'Create and return a Point instance from a string containing latitude
and longitude, and optionally, altitude.
Latitude and longitude must be in degrees and may be in decimal form
or indicate arcminutes and arcseconds (labeled with Unicode prime and
double prime, ASCII quote and double quote or \'m\' and \'s\'). The degree
symbol is optional and may be included after the decimal places (in
decimal form) and before the arcminutes and arcseconds otherwise.
Coordinates given from south and west (indicated by S and W suffixes)
will be converted to north and east by switching their signs. If no
(or partial) cardinal directions are given, north and east are the
assumed directions. Latitude and longitude must be separated by at
least whitespace, a comma, or a semicolon (each with optional
surrounding whitespace).
Altitude, if supplied, must be a decimal number with given units.
The following unit abbrevations (case-insensitive) are supported:
km (kilometers)
m (meters)
mi (miles)
ft (feet)
nm, nmi (nautical miles)
Some example strings the will work include:
41.5;-81.0
41.5,-81.0
41.5 -81.0
41.5 N -81.0 W
-41.5 S;81.0 E
23 26m 22s N 23 27m 30s E
23 26\' 22" N 23 27\' 30" E'

@classmethod
def from_string(cls, string):

    match = re.match(cls.POINT_PATTERN, string)
    if match:
        latitude = cls.parse_degrees(match.group('latitude_degrees'), match.group('latitude_arcminutes'), match.group('latitude_arcseconds'), match.group('latitude_direction'))
        longitude = cls.parse_degrees(match.group('longitude_degrees'), match.group('longitude_arcminutes'), match.group('longitude_arcseconds'), match.group('longitude_direction'))
        altitude = cls.parse_altitude(match.group('altitude_distance'), match.group('altitude_units'))
        return cls(latitude, longitude, altitude)
    else:
        raise ValueError('Failed    to    create    Point    instance    from    string:    unknown    format.')
