ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Python/gpxpy, GPX file parser
    코딩/Python 2024. 7. 23. 13:41
    728x90

     

    This is a simple Python library for parsing and manipulating GPX files. GPX is an XML based format for GPS tracks.

    You can see it in action on my online GPS track editor and organizer.

    There is also a Golang port of gpxpy: gpxgo.

    See also srtm.py if your track lacks elevation data.

    이것은 GPX 파일을 구문 분석하고 조작하기 위한 간단한 Python 라이브러리이다. GPX는 GPS 트랙을 위한 XML 기반 형식이다.

    온라인 GPS 트랙 편집기 및 구성 도구에서 실제로 작동하는 것을 볼 수 있다.

    gpxpy의 Golang 포트인 gpxgo도 있다.

    트랙에 고도 데이터가 부족한 경우 srtm.py도 참조하라.

    Usage

    import gpxpy
    import gpxpy.gpx
    
    # Parsing an existing file:
    # -------------------------
    
    gpx_file = open('test_files/cerknicko-jezero.gpx', 'r')
    
    gpx = gpxpy.parse(gpx_file)
    
    for track in gpx.tracks:
        for segment in track.segments:
            for point in segment.points:
                print(f'Point at ({point.latitude},{point.longitude}) -> {point.elevation}')
    
    for waypoint in gpx.waypoints:
        print(f'waypoint {waypoint.name} -> ({waypoint.latitude},{waypoint.longitude})')
    
    for route in gpx.routes:
        print('Route:')
        for point in route.points:
            print(f'Point at ({point.latitude},{point.longitude}) -> {point.elevtion}')
    
    # There are many more utility methods and functions:
    # You can manipulate/add/remove tracks, segments, points, waypoints and routes and
    # get the GPX XML file from the resulting object:
    
    # 더 많은 유틸리티 메소드와 함수가 있다:
    # 트랙, 구간, 지점, 경유지 및 경로를 조작/추가/제거할 수 있으며
    # 결과 객체에서 GPX XML 파일을 가져온다.
    
    print('GPX:', gpx.to_xml())
    
    # Creating a new file:
    # --------------------
    
    gpx = gpxpy.gpx.GPX()
    
    # Create first track in our GPX:
    gpx_track = gpxpy.gpx.GPXTrack()
    gpx.tracks.append(gpx_track)
    
    # Create first segment in our GPX track:
    gpx_segment = gpxpy.gpx.GPXTrackSegment()
    gpx_track.segments.append(gpx_segment)
    
    # Create points:
    gpx_segment.points.append(gpxpy.gpx.GPXTrackPoint(2.1234, 5.1234, elevation=1234))
    gpx_segment.points.append(gpxpy.gpx.GPXTrackPoint(2.1235, 5.1235, elevation=1235))
    gpx_segment.points.append(gpxpy.gpx.GPXTrackPoint(2.1236, 5.1236, elevation=1236))
    
    # You can add routes and waypoints, too...
    
    print('Created GPX:', gpx.to_xml())

    GPX version

    gpx.py can parse and generate GPX 1.0 and 1.1 files. The generated file will always be a valid XML document, but it may not be (strictly speaking) a valid GPX document. For example, if you set gpx.email to "my.email AT mail.com" the generated GPX tag won't confirm to the regex pattern. And the file won't be valid. Most applications will ignore such errors, but... Be aware of this!

    Be aware that the gpxpy object model is not 100% equivalent with the underlying GPX XML file schema. That's because the library object model works with both GPX 1.0 and 1.1.

    For example, GPX 1.0 specified a speed attribute for every track point, but that was removed in GPX 1.1. If you parse GPX 1.0 and serialize back with gpx.to_xml() everything will work fine. But if you have a GPX 1.1 object, changes in the speed attribute will be lost after gpx.to_xml(). If you want to force using 1.0, you can gpx.to_xml(version="1.0"). Another possibility is to use extensions to save the speed in GPX 1.1.

    gpx.py는 GPX 1.0 및 1.1 파일을 구문 분석하고 생성할 수 있다. 생성된 파일은 항상 유효한 XML 문서이지만 (엄격히 말하면) 유효한 GPX 문서가 아닐 수도 있다. 예를 들어 gpx.email을 "my.email AT mail.com"으로 설정하면 생성된 GPX 태그가 정규식 패턴을 확인하지 않는다. 그리고 파일은 유효하지 않다. 대부분의 응용 프로그램은 이러한 오류를 무시하지만... 이 점에 유의하라!

    gpxpy 개체 모델은 기본 GPX XML 파일 스키마와 100% 동일하지 않다. 그 이유는 라이브러리 개체 모델이 GPX 1.0과 1.1 모두에서 작동하기 때문이다.

    예를 들어, GPX 1.0은 모든 트랙 포인트에 대해 속도 속성을 지정했지만 GPX 1.1에서는 제거되었다. GPX 1.0을 구문 분석하고 gpx.to_xml()을 사용하여 다시 직렬화하면 모든 것이 잘 작동한다. 그러나 GPX 1.1 개체가 있는 경우 gpx.to_xml() 이후 속도 속성의 변경 사항이 손실된다. 1.0을 강제로 사용하려면 gpx.to_xml(version="1.0")을 사용하면 된다. 또 다른 가능성은 확장을 사용하여 GPX 1.1의 속도를 저장하는 것이다.

    GPX extensions

    gpx.py preserves GPX extensions. They are stored as ElementTree DOM objects. Extensions are part of GPX 1.1, and will be ignored when serializing a GPX object in a GPX 1.0 file.

    gpx.py는 GPX 확장을 유지한다. ElementTree DOM 객체로 저장된다. 확장은 GPX 1.1의 일부이며 GPX 1.0 파일에서 GPX 개체를 직렬화할 때 무시된다.

    XML parsing

    If lxml is available, then it will be used for XML parsing, otherwise minidom is used. Lxml is 2-3 times faster so, if you can choose -- use it.

    The GPX version is automatically determined when parsing by reading the version attribute in the gpx node. If this attribute is not present then the version is assumed to be 1.0. A specific version can be forced by setting the version parameter in the parse function. Possible values for the 'version' parameter are 1.0, 1.1 and None.

    lxml을 사용할 수 있으면 XML 구문 분석에 사용되고, 그렇지 않으면 minidom이 사용된다. Lxml은 2~3배 빠르므로 선택할 수 있으면 사용하라.

    GPX 버전은 gpx 노드의 버전 속성을 읽어 구문 분석할 때 자동으로 결정된다. 이 속성이 없으면 버전은 1.0으로 간주된다. 구문 분석 기능에서 버전 매개변수를 설정하여 특정 버전을 강제로 적용할 수 있다. 'version' 매개변수에 가능한 값은 1.0, 1.1 및 None이다.

    GPX max speed

    Gpxpy is a GPX parser and by using it you have access to all the data from the original GPX file. The additional methods to calculate stats have some additional heuristics to remove common GPS errors. For example, to calculate max_speed it removes the top 5% of speeds and points with nonstandard distance (those are usually GPS errors).

    "Raw" max speed can be calculated with:

    Gpxpy는 GPX 파서이며 이를 사용하면 원본 GPX 파일의 모든 데이터에 액세스할 수 있다. 통계를 계산하는 추가 방법에는 일반적인 GPS 오류를 제거하기 위한 몇 가지 추가적인 경험적 방법이 있다. 예를 들어 max_speed를 계산하기 위해 속도와 비표준 거리가 있는 지점(일반적으로 GPS 오류)의 상위 5%를 제거한다.

    "원시" 최대 속도는 다음을 사용하여 계산할 수 있다.

    moving_data = gpx.get_moving_data(raw=True)

    GPX tools

    Additional command-line tools for GPX files can be downloaded here https://github.com/tkrajina/gpx-cmd-tools or installed with:

    GPX 파일용 추가 명령줄 도구는 에서 다운로드하거나 다음을 통해 설치할 수 있다.

    pip install gpx-cmd-tools
    728x90

    댓글

Designed by Tistory.