如何使用 unmarshal 解析 gpx

我想解析一个 GPX 文件。我想得到以下信息:

文件中的所有点 (trkpt) 及其值:

  • 经度

  • 纬度

  • 海拔

  • 时间

为此,我编写了结构:

type gpx file{

    filepointer *os.file

    points []xmlPoints

}


type gpx struct {

    XMLName xml.Name `xml:"gpx"`

    trks trk `xml:"trk"`

}


type trk struct {

    XMLName xml.Name `xml:"trk"`

    trksegs []trkseg `xml:"trkseg"`

}


type trkseg struct {

    XMLName xml.Name   `xml:"trkseg"`

    points  []XMLPoint `xml:"trkpt"`

}


type XMLPoint struct {

    XMLName   xml.Name  `xml:"trkpt"`

    longitude float64   `xml:"lon,attr"`

    latitude  float64   `xml:"lat,attr"`

    elevation float64   `xml:"ele"`

    time      time.Time `xml:"time"`

}

我使用以下方法尝试获取这些值:


func (f *GPXFile) setPoints() {

    //Reads the GPXfile to get a slice of all Points and set them to f.points

    //read GPXFile

    file, _ := os.Open(f.filePointer.Name())

    fileByte, _ := ioutil.ReadAll(file)

    //get points

    var g gpx

    //should read points and puts them to &points, result empty

    err :=xml.Unmarshal(fileByte, &g)

    fmt.Print(err)

    //set points

    f.points = g.trks.trksegs[1].points

}

我的 GPX 文件如下所示:


<?xml version="1.0" encoding="UTF-8"?>

<gpx version="1.1" ...>

 <metadata>

  <time>2019-09-14T13:14:17.094Z</time>

 </metadata>


 <trk>

  <name>Cube – Sa., 14. Sep. 2019, 15:14</name>

  <trkseg>

  </trkseg>

  <trkseg>

   <trkpt lat="49.3547198000" lon="9.1508659200"><time>2019-09-14T13:14:00.000Z</time><extensions><gpxpx:PowerInWatts>120</gpxpx:PowerInWatts></extensions></trkpt>

   <trkpt lat="49.3546998700" lon="9.1509324100"><time>2019-09-14T13:14:10.003Z</time><extensions><gpxtpx:TrackPointExtension><gpxtpx:atemp>22.9</gpxtpx:atemp></gpxtpx:TrackPointExtension><gpxpx:PowerInWatts>120</gpxpx:PowerInWatts></extensions></trkpt>

  </trkseg>

 </trk>

</gpx>

问题是,从 unmarshal 函数中我得到了一个with ,gpx但是trk它是trkseqnil ... 所以我想知道如何解析. 从那里我可以使用相同的方法来获取点数组。trkseqtrktrkseqtrkseq


德玛西亚99
浏览 135回答 1
1回答

鸿蒙传说

在 golang 中编组/解组任何类型的编码/序列化数据时,您解组的interface{}类型在某个时候作为类型传递。(未)编组代码将不得不依赖reflect包来查找可用于将数据映射到的标签和字段。此代码可以使用(和写入)的唯一字段是导出字段(以大写字母开头的字段)。您的类型都有未导出的字段和类型(如果您愿意,可以使用私有)。只需更改如下内容:type gpx struct {&nbsp; &nbsp; XMLName xml.Name `xml:"gpx"`&nbsp; &nbsp; trks&nbsp; &nbsp; trk&nbsp; &nbsp; &nbsp; `xml:"trk"`}到type Gpx struct {&nbsp; &nbsp; XMLName xml.Name `xml:"gpx"`&nbsp; &nbsp; Trks&nbsp; &nbsp; Trk&nbsp; &nbsp; &nbsp; `xml:"trk"`}此外,在 Golang 中,约定是对首字母缩写词使用全部大写(例如URL,not urlor Url),因此可以说,您会想要:type GPX struct {&nbsp; &nbsp; XMLName xml.Name `xml:"gpx"`&nbsp; &nbsp; TRKS&nbsp; &nbsp; TRK&nbsp; &nbsp; &nbsp; `xml:"trk"`}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go