Exemplo n.º 1
0
def parse_track(track_element, gpxns=None):
    gpxns = gpxns if gpxns is not None else determine_gpx_namespace(track_element)

    get_text = lambda tag: optional_text(track_element, gpxns+tag)

    name = get_text('name')
    comment = get_text('comment')
    description = get_text('desc')
    source = get_text('src')

    link_elements = track_element.findall(gpxns+'link')
    links = [parse_link(link_element, gpxns) for link_element in link_elements]

    number = get_text('number')
    classification = get_text('type')

    segment_elements = track_element.findall(gpxns+'trkseg')
    segments = [parse_segment(segment_element, gpxns) for segment_element in segment_elements]

    extensions_element = track_element.find(gpxns+'extensions')
    extensions = nullable(parse_track_extensions)(extensions_element, gpxns)

    track = Track(name, comment, description, source, links, number,
                  classification, extensions, segments)
    return track
Exemplo n.º 2
0
def parse_metadata(metadata_element, gpxns=None):
    gpxns = gpxns if gpxns is not None else determine_gpx_namespace(metadata_element)

    get_text = lambda tag: optional_text(metadata_element, gpxns+tag)

    name = get_text('name')
    description = get_text('desc')

    author_element = metadata_element.find(gpxns+'author')
    author = nullable(parse_person)(author_element, gpxns)

    copyright_element = metadata_element.find(gpxns+'copyright')
    copyright = nullable(parse_copyright)(copyright_element, gpxns)

    link_elements = metadata_element.findall(gpxns+'link')
    links = [parse_link(link_element, gpxns) for link_element in link_elements]

    time = get_text('time')
    keywords = get_text('keywords')

    bounds_element = metadata_element.find(gpxns+'bounds')
    bounds = nullable(parse_bounds)(bounds_element)

    extensions_element = metadata_element.find(gpxns+'extensions')
    extensions = nullable(parse_metadata_extensions)(extensions_element, gpxns)

    return Metadata(name, description, author, copyright, links, time,
                    keywords, bounds, extensions)
Exemplo n.º 3
0
def parse_route(route_element, gpxns=None):
    gpxns = gpxns if gpxns is not None else determine_gpx_namespace(route_element)

    get_text = lambda tag: optional_text(route_element, gpxns+tag)

    name = get_text('name')
    comment = get_text('cmt')
    description = get_text('desc')
    source = get_text('src')

    link_elements = route_element.findall(gpxns+'link')
    links = [parse_link(link_element, gpxns) for link_element in link_elements]

    number = get_text('number')
    classification = get_text('type')

    extensions_element = route_element.find(gpxns+'extensions')
    extensions = nullable(parse_route_extensions)(extensions_element, gpxns)

    routepoint_elements = route_element.findall(gpxns+'rtept')
    routepoints = [parse_waypoint(routepoint_element, gpxns) for routepoint_element in routepoint_elements]

    route = Route(name, comment, description, source, links, number, classification, extensions, routepoints)

    return route
Exemplo n.º 4
0
def parse_email(email_element, gpxns=None):
    gpxns = gpxns if gpxns is not None else determine_gpx_namespace(email_element)

    get_text = lambda tag: optional_text(email_element, gpxns+tag)

    id = get_text('id')
    domain = get_text('domain')
    return id +  '@' + domain
Exemplo n.º 5
0
def parse_link(link_element, gpxns=None):
    gpxns = gpxns if gpxns is not None else determine_gpx_namespace(link_element)

    get_text = lambda tag: optional_text(link_element, gpxns+tag)

    href = link_element.attrib['href']
    text = get_text('text')
    mime = get_text('type')

    link = Link(href, text, mime)
    return link
Exemplo n.º 6
0
def parse_copyright(copyright_element, gpxns=None):
    gpxns = gpxns if gpxns is not None else determine_gpx_namespace(copyright_element)

    get_text = lambda tag: optional_text(copyright_element, gpxns+tag)

    author = copyright_element.attrib['author']

    year_element = copyright_element.find(gpxns+'year')
    year = nullable(parse_year)(year_element)

    license = get_text('license')

    return Copyright(author, year, license)
Exemplo n.º 7
0
def parse_person(person_element, gpxns=None):
    gpxns = gpxns if gpxns is not None else determine_gpx_namespace(person_element)

    get_text = lambda tag: optional_text(person_element, gpxns+tag)

    name = get_text('name')

    email_element = person_element.find(gpxns+'email')
    email = nullable(parse_email)(email_element, gpxns)

    link_element = person_element.find(gpxns+'link')
    link = nullable(parse_link)(link_element, gpxns)

    return Person(name, email, link)
Exemplo n.º 8
0
def parse_waypoint(waypoint_element, gpxns=None):
    gpxns = gpxns if gpxns is not None else determine_gpx_namespace(waypoint_element)
    get_text = lambda tag: optional_text(waypoint_element, gpxns+tag)

    longitude = waypoint_element.attrib['lon']

    elevation = get_text('ele')
    course = get_text('course')
    speed = get_text('speed')
    latitude = waypoint_element.attrib['lat']
    time = get_text('time')
    magvar = get_text('magvar')
    geoid_height = get_text('geoidheight')
    name = get_text('name')
    comment = get_text('cmt')
    description = get_text('desc')
    source = get_text('src')

    url = get_text('url')
    urlname = get_text('urlname')
    links = make_links(url, urlname)

    symbol = get_text('sym')
    classification = get_text('type')
    fix = get_text('fix')
    num_satellites = get_text('sat')
    hdop = get_text('hdop')
    vdop = get_text('vdop')
    pdop = get_text('pdop')
    seconds_since_dgps_update = get_text('ageofdgpsdata')
    dgps_station_type = get_text('dgpsid')

    # TODO: Private elements - consider passing private element parser in
    #       to cope with differences between waypoints, routes, etc.

    waypoint = Waypoint(latitude, longitude, elevation, time, magvar,
        geoid_height, name, comment, description, source,
        links, symbol, classification, fix, num_satellites,
        hdop, vdop, pdop, seconds_since_dgps_update,
        dgps_station_type, course, speed)

    return waypoint
Exemplo n.º 9
0
def parse_route(route_element, gpxns=None):
    gpxns = gpxns if gpxns is not None else determine_gpx_namespace(route_element)
    get_text = lambda tag: optional_text(route_element, gpxns+tag)

    name = get_text('name')
    comment = get_text('cmt')
    description = get_text('desc')
    source = get_text('src')

    url = get_text('url')
    urlname = get_text('urlname')
    links = make_links(url, urlname)

    number = get_text('number')

    routepoint_elements = route_element.findall(gpxns+'rtept')
    routepoints = [parse_waypoint(routepoint_element, gpxns) for routepoint_element in routepoint_elements]

    route = Route(name=name, comment=comment, description=description,
                  source=source, links=links, number=number, points=routepoints)

    return route
Exemplo n.º 10
0
def parse_waypoint(waypoint_element, gpxns=None):
    gpxns = gpxns if gpxns is not None else determine_gpx_namespace(waypoint_element)

    get_text = lambda tag: optional_text(waypoint_element, gpxns+tag)

    latitude = waypoint_element.attrib['lat']
    longitude = waypoint_element.attrib['lon']

    elevation = get_text('ele')
    time = get_text('time')
    magvar = get_text('magvar')
    geoid_height = get_text('geoidheight')
    name = get_text('name')
    comment = get_text('cmt')
    description = get_text('desc')
    source = get_text('src')

    link_elements = waypoint_element.findall(gpxns+'link')
    links = [parse_link(link_element, gpxns) for link_element in link_elements]

    symbol = get_text('sym')
    classification = get_text('type')
    fix = get_text('fix')
    num_satellites = get_text('sat')
    hdop = get_text('hdop')
    vdop = get_text('vdop')
    pdop = get_text('pdop')
    seconds_since_dgps_update = get_text('ageofdgpsdata')
    dgps_station_type = get_text('dgpsid')

    extensions_element = waypoint_element.find(gpxns+'extensions')
    extensions = nullable(parse_waypoint_extensions)(extensions_element, gpxns)

    waypoint = Waypoint(latitude, longitude, elevation, time, magvar,
                        geoid_height, name, comment, description, source,
                        links, symbol, classification, fix, num_satellites,
                        hdop, vdop, pdop, seconds_since_dgps_update,
                        dgps_station_type, extensions)
    return waypoint
Exemplo n.º 11
0
def parse_track(track_element, gpxns=None):
    gpxns = gpxns if gpxns is not None else determine_gpx_namespace(track_element)
    get_text = lambda tag: optional_text(track_element, gpxns+tag)

    name = get_text('name')
    comment = get_text('comment')
    description = get_text('desc')
    source = get_text('src')

    url = get_text('url')
    urlname = get_text('urlname')
    links = make_links(url, urlname)

    number = get_text('number')

    # TODO: Private elements

    segment_elements = track_element.findall(gpxns+'trkseg')
    segments = [parse_segment(segment_element, gpxns) for segment_element in segment_elements]

    track = Track(name=name, comment=comment, description=description,
                  source=source, links=links, number=number, segments=segments)
    return track
Exemplo n.º 12
0
def parse_gpx(gpx_element, gpxns=None):
    """Parse a GPX file into a GpxModel.

    Args:
        xml: A file-like-object opened in binary mode - that is containing
             bytes rather than characters. The root element of the XML should
             be a <gpx> element containing a version attribute. GPX versions
             1.0 is supported.

    Returns:
        A GpxModel representing the data from the supplies xml.

    Raises:
        ValueError: The supplied XML could not be parsed as GPX.
    """
    gpxns = gpxns if gpxns is not None else determine_gpx_namespace(gpx_element)

    if gpx_element.tag != gpxns+'gpx':
        raise ValueError("No gpx root element")

    get_text = lambda tag: optional_text(gpx_element, gpxns+tag)

    version = gpx_element.attrib['version']

    if not version.startswith('1.0'):
        raise ValueError("Not a GPX 1.0 file")

    creator = gpx_element.attrib['creator']

    name = get_text('name')
    description = get_text('desc')

    author_name = get_text('author')
    email = get_text('email')
    author = Person(author_name, email)

    url = get_text('url')
    urlname = get_text('urlname')
    links = make_links(url, urlname)

    time = get_text('time')
    keywords = get_text('keywords')

    bounds_element = gpx_element.find(gpxns+'bounds')
    bounds = nullable(parse_bounds)(bounds_element)

    metadata = Metadata(name=name, description=description, author=author,
               links=links, time=time, keywords=keywords, bounds=bounds)

    waypoint_elements = gpx_element.findall(gpxns+'wpt')
    waypoints = [parse_waypoint(waypoint_element, gpxns) for waypoint_element in waypoint_elements]

    route_elements = gpx_element.findall(gpxns+'rte')
    routes = [parse_route(route_element, gpxns) for route_element in route_elements]

    track_elements = gpx_element.findall(gpxns+'trk')
    tracks = [parse_track(track_element, gpxns) for track_element in track_elements]

    # TODO : Private elements

    gpx_model  = GpxModel(creator, metadata, waypoints, routes, tracks)

    return gpx_model