diff options
Diffstat (limited to 'vendor/github.com/tkrajina/gpxgo/gpx/converters.go')
| -rw-r--r-- | vendor/github.com/tkrajina/gpxgo/gpx/converters.go | 616 |
1 files changed, 616 insertions, 0 deletions
diff --git a/vendor/github.com/tkrajina/gpxgo/gpx/converters.go b/vendor/github.com/tkrajina/gpxgo/gpx/converters.go new file mode 100644 index 0000000..c3031ea --- /dev/null +++ b/vendor/github.com/tkrajina/gpxgo/gpx/converters.go @@ -0,0 +1,616 @@ +// Copyright 2013, 2014 Peter Vasil, Tomo Krajina. All +// rights reserved. Use of this source code is governed +// by a BSD-style license that can be found in the +// LICENSE file. + +package gpx + +import ( + "strings" +) + +const DEFAULT_CREATOR = "https://github.com/tkrajina/gpxgo" + +// ---------------------------------------------------------------------------------------------------- +// Gpx 1.0 Stuff +// ---------------------------------------------------------------------------------------------------- + +func convertToGpx10Models(gpxDoc *GPX) *gpx10Gpx { + gpx10Doc := &gpx10Gpx{} + + //gpx10Doc.XMLNs = gpxDoc.XMLNs + gpx10Doc.XMLNs = "http://www.topografix.com/GPX/1/0" + gpx10Doc.XmlNsXsi = gpxDoc.XmlNsXsi + gpx10Doc.XmlSchemaLoc = gpxDoc.XmlSchemaLoc + + gpx10Doc.Version = "1.0" + if len(gpxDoc.Creator) == 0 { + gpx10Doc.Creator = DEFAULT_CREATOR + } else { + gpx10Doc.Creator = gpxDoc.Creator + } + gpx10Doc.Name = gpxDoc.Name + gpx10Doc.Desc = gpxDoc.Description + gpx10Doc.Author = gpxDoc.AuthorName + gpx10Doc.Email = gpxDoc.AuthorEmail + + if len(gpxDoc.AuthorLink) > 0 || len(gpxDoc.AuthorLinkText) > 0 { + // TODO + } + + if len(gpxDoc.Link) > 0 || len(gpxDoc.LinkText) > 0 { + gpx10Doc.Url = gpxDoc.Link + gpx10Doc.UrlName = gpxDoc.LinkText + } + + if gpxDoc.Time != nil { + gpx10Doc.Time = formatGPXTime(gpxDoc.Time) + } + + gpx10Doc.Keywords = gpxDoc.Keywords + + if gpxDoc.Waypoints != nil { + gpx10Doc.Waypoints = make([]*gpx10GpxPoint, len(gpxDoc.Waypoints)) + for waypointNo, waypoint := range gpxDoc.Waypoints { + gpx10Doc.Waypoints[waypointNo] = convertPointToGpx10(&waypoint) + } + } + + if gpxDoc.Routes != nil { + gpx10Doc.Routes = make([]*gpx10GpxRte, len(gpxDoc.Routes)) + for routeNo, route := range gpxDoc.Routes { + r := new(gpx10GpxRte) + r.Name = route.Name + r.Cmt = route.Comment + r.Desc = route.Description + r.Src = route.Source + // TODO + //r.Links = route.Links + r.Number = route.Number + r.Type = route.Type + // TODO + //r.RoutePoints = route.RoutePoints + + gpx10Doc.Routes[routeNo] = r + + if route.Points != nil { + r.Points = make([]*gpx10GpxPoint, len(route.Points)) + for pointNo, point := range route.Points { + r.Points[pointNo] = convertPointToGpx10(&point) + } + } + } + } + + if gpxDoc.Tracks != nil { + gpx10Doc.Tracks = make([]*gpx10GpxTrk, len(gpxDoc.Tracks)) + for trackNo, track := range gpxDoc.Tracks { + gpx10Track := new(gpx10GpxTrk) + gpx10Track.Name = track.Name + gpx10Track.Cmt = track.Comment + gpx10Track.Desc = track.Description + gpx10Track.Src = track.Source + gpx10Track.Number = track.Number + gpx10Track.Type = track.Type + + if track.Segments != nil { + gpx10Track.Segments = make([]*gpx10GpxTrkSeg, len(track.Segments)) + for segmentNo, segment := range track.Segments { + gpx10Segment := new(gpx10GpxTrkSeg) + if segment.Points != nil { + gpx10Segment.Points = make([]*gpx10GpxPoint, len(segment.Points)) + for pointNo, point := range segment.Points { + gpx10Point := convertPointToGpx10(&point) + // TODO + //gpx10Point.Speed = point.Speed + //gpx10Point.Speed = point.Speed + gpx10Segment.Points[pointNo] = gpx10Point + } + } + gpx10Track.Segments[segmentNo] = gpx10Segment + } + } + gpx10Doc.Tracks[trackNo] = gpx10Track + } + } + + return gpx10Doc +} + +func convertFromGpx10Models(gpx10Doc *gpx10Gpx) *GPX { + gpxDoc := new(GPX) + + gpxDoc.XMLNs = gpx10Doc.XMLNs + gpxDoc.XmlNsXsi = gpx10Doc.XmlNsXsi + gpxDoc.XmlSchemaLoc = gpx10Doc.XmlSchemaLoc + + gpxDoc.Creator = gpx10Doc.Creator + gpxDoc.Version = gpx10Doc.Version + gpxDoc.Name = gpx10Doc.Name + gpxDoc.Description = gpx10Doc.Desc + gpxDoc.AuthorName = gpx10Doc.Author + gpxDoc.AuthorEmail = gpx10Doc.Email + + if len(gpx10Doc.Url) > 0 || len(gpx10Doc.UrlName) > 0 { + gpxDoc.Link = gpx10Doc.Url + gpxDoc.LinkText = gpx10Doc.UrlName + } + + if len(gpx10Doc.Time) > 0 { + gpxDoc.Time, _ = parseGPXTime(gpx10Doc.Time) + } + + gpxDoc.Keywords = gpx10Doc.Keywords + + if gpx10Doc.Waypoints != nil { + waypoints := make([]GPXPoint, len(gpx10Doc.Waypoints)) + for waypointNo, waypoint := range gpx10Doc.Waypoints { + waypoints[waypointNo] = *convertPointFromGpx10(waypoint) + } + gpxDoc.Waypoints = waypoints + } + + if gpx10Doc.Routes != nil { + gpxDoc.Routes = make([]GPXRoute, len(gpx10Doc.Routes)) + for routeNo, route := range gpx10Doc.Routes { + r := new(GPXRoute) + + r.Name = route.Name + r.Comment = route.Cmt + r.Description = route.Desc + r.Source = route.Src + // TODO + //r.Links = route.Links + r.Number = route.Number + r.Type = route.Type + // TODO + //r.RoutePoints = route.RoutePoints + + if route.Points != nil { + r.Points = make([]GPXPoint, len(route.Points)) + for pointNo, point := range route.Points { + r.Points[pointNo] = *convertPointFromGpx10(point) + } + } + + gpxDoc.Routes[routeNo] = *r + } + } + + if gpx10Doc.Tracks != nil { + gpxDoc.Tracks = make([]GPXTrack, len(gpx10Doc.Tracks)) + for trackNo, track := range gpx10Doc.Tracks { + gpxTrack := new(GPXTrack) + gpxTrack.Name = track.Name + gpxTrack.Comment = track.Cmt + gpxTrack.Description = track.Desc + gpxTrack.Source = track.Src + gpxTrack.Number = track.Number + gpxTrack.Type = track.Type + + if track.Segments != nil { + gpxTrack.Segments = make([]GPXTrackSegment, len(track.Segments)) + for segmentNo, segment := range track.Segments { + gpxSegment := GPXTrackSegment{} + if segment.Points != nil { + gpxSegment.Points = make([]GPXPoint, len(segment.Points)) + for pointNo, point := range segment.Points { + gpxSegment.Points[pointNo] = *convertPointFromGpx10(point) + } + } + gpxTrack.Segments[segmentNo] = gpxSegment + } + } + gpxDoc.Tracks[trackNo] = *gpxTrack + } + } + + return gpxDoc +} + +func convertPointToGpx10(original *GPXPoint) *gpx10GpxPoint { + result := new(gpx10GpxPoint) + result.Lat = original.Latitude + result.Lon = original.Longitude + result.Ele = original.Elevation + result.Timestamp = formatGPXTime(&original.Timestamp) + result.MagVar = original.MagneticVariation + result.GeoIdHeight = original.GeoidHeight + result.Name = original.Name + result.Cmt = original.Comment + result.Desc = original.Description + result.Src = original.Source + // TODO + //w.Links = original.Links + result.Sym = original.Symbol + result.Type = original.Type + result.Fix = original.TypeOfGpsFix + if original.Satellites.NotNull() { + value := original.Satellites.Value() + result.Sat = &value + } + if original.HorizontalDilution.NotNull() { + value := original.HorizontalDilution.Value() + result.Hdop = &value + } + if original.VerticalDilution.NotNull() { + value := original.VerticalDilution.Value() + result.Vdop = &value + } + if original.PositionalDilution.NotNull() { + value := original.PositionalDilution.Value() + result.Pdop = &value + } + if original.AgeOfDGpsData.NotNull() { + value := original.AgeOfDGpsData.Value() + result.AgeOfDGpsData = &value + } + if original.DGpsId.NotNull() { + value := original.DGpsId.Value() + result.DGpsId = &value + } + return result +} + +func convertPointFromGpx10(original *gpx10GpxPoint) *GPXPoint { + result := new(GPXPoint) + result.Latitude = original.Lat + result.Longitude = original.Lon + result.Elevation = original.Ele + time, _ := parseGPXTime(original.Timestamp) + if time != nil { + result.Timestamp = *time + } + result.MagneticVariation = original.MagVar + result.GeoidHeight = original.GeoIdHeight + result.Name = original.Name + result.Comment = original.Cmt + result.Description = original.Desc + result.Source = original.Src + // TODO + //w.Links = original.Links + result.Symbol = original.Sym + result.Type = original.Type + result.TypeOfGpsFix = original.Fix + if original.Sat != nil { + result.Satellites = *NewNullableInt(*original.Sat) + } + if original.Hdop != nil { + result.HorizontalDilution = *NewNullableFloat64(*original.Hdop) + } + if original.Vdop != nil { + result.VerticalDilution = *NewNullableFloat64(*original.Vdop) + } + if original.Pdop != nil { + result.PositionalDilution = *NewNullableFloat64(*original.Pdop) + } + if original.AgeOfDGpsData != nil { + result.AgeOfDGpsData = *NewNullableFloat64(*original.AgeOfDGpsData) + } + if original.DGpsId != nil { + result.DGpsId = *NewNullableInt(*original.DGpsId) + } + return result +} + +// ---------------------------------------------------------------------------------------------------- +// Gpx 1.1 Stuff +// ---------------------------------------------------------------------------------------------------- + +func convertToGpx11Models(gpxDoc *GPX) *gpx11Gpx { + gpx11Doc := &gpx11Gpx{} + + gpx11Doc.Version = "1.1" + + gpx11Doc.XMLNs = "http://www.topografix.com/GPX/1/1" + gpx11Doc.XmlNsXsi = gpxDoc.XmlNsXsi + gpx11Doc.XmlSchemaLoc = gpxDoc.XmlSchemaLoc + + if len(gpxDoc.Creator) == 0 { + gpx11Doc.Creator = DEFAULT_CREATOR + } else { + gpx11Doc.Creator = gpxDoc.Creator + } + gpx11Doc.Name = gpxDoc.Name + gpx11Doc.Desc = gpxDoc.Description + gpx11Doc.AuthorName = gpxDoc.AuthorName + + if len(gpxDoc.AuthorEmail) > 0 { + parts := strings.Split(gpxDoc.AuthorEmail, "@") + if len(parts) == 1 { + gpx11Doc.AuthorEmail = new(gpx11GpxEmail) + gpx11Doc.AuthorEmail.Id = parts[0] + } else if len(parts) > 1 { + gpx11Doc.AuthorEmail = new(gpx11GpxEmail) + gpx11Doc.AuthorEmail.Id = parts[0] + gpx11Doc.AuthorEmail.Domain = parts[1] + } + } + + if len(gpxDoc.AuthorLink) > 0 || len(gpxDoc.AuthorLinkText) > 0 || len(gpxDoc.AuthorLinkType) > 0 { + gpx11Doc.AuthorLink = new(gpx11GpxLink) + gpx11Doc.AuthorLink.Href = gpxDoc.AuthorLink + gpx11Doc.AuthorLink.Text = gpxDoc.AuthorLinkText + gpx11Doc.AuthorLink.Type = gpxDoc.AuthorLinkType + } + + if len(gpxDoc.Copyright) > 0 || len(gpxDoc.CopyrightYear) > 0 || len(gpxDoc.CopyrightLicense) > 0 { + gpx11Doc.Copyright = new(gpx11GpxCopyright) + gpx11Doc.Copyright.Author = gpxDoc.Copyright + gpx11Doc.Copyright.Year = gpxDoc.CopyrightYear + gpx11Doc.Copyright.License = gpxDoc.CopyrightLicense + } + + if len(gpxDoc.Link) > 0 || len(gpxDoc.LinkText) > 0 || len(gpxDoc.LinkType) > 0 { + gpx11Doc.Link = new(gpx11GpxLink) + gpx11Doc.Link.Href = gpxDoc.Link + gpx11Doc.Link.Text = gpxDoc.LinkText + gpx11Doc.Link.Type = gpxDoc.LinkType + } + + if gpxDoc.Time != nil { + gpx11Doc.Timestamp = formatGPXTime(gpxDoc.Time) + } + + gpx11Doc.Keywords = gpxDoc.Keywords + + if gpxDoc.Waypoints != nil { + gpx11Doc.Waypoints = make([]*gpx11GpxPoint, len(gpxDoc.Waypoints)) + for waypointNo, waypoint := range gpxDoc.Waypoints { + gpx11Doc.Waypoints[waypointNo] = convertPointToGpx11(&waypoint) + } + } + + if gpxDoc.Routes != nil { + gpx11Doc.Routes = make([]*gpx11GpxRte, len(gpxDoc.Routes)) + for routeNo, route := range gpxDoc.Routes { + r := new(gpx11GpxRte) + r.Name = route.Name + r.Cmt = route.Comment + r.Desc = route.Description + r.Src = route.Source + // TODO + //r.Links = route.Links + r.Number = route.Number + r.Type = route.Type + // TODO + //r.RoutePoints = route.RoutePoints + + gpx11Doc.Routes[routeNo] = r + + if route.Points != nil { + r.Points = make([]*gpx11GpxPoint, len(route.Points)) + for pointNo, point := range route.Points { + r.Points[pointNo] = convertPointToGpx11(&point) + } + } + } + } + + if gpxDoc.Tracks != nil { + gpx11Doc.Tracks = make([]*gpx11GpxTrk, len(gpxDoc.Tracks)) + for trackNo, track := range gpxDoc.Tracks { + gpx11Track := new(gpx11GpxTrk) + gpx11Track.Name = track.Name + gpx11Track.Cmt = track.Comment + gpx11Track.Desc = track.Description + gpx11Track.Src = track.Source + gpx11Track.Number = track.Number + gpx11Track.Type = track.Type + + if track.Segments != nil { + gpx11Track.Segments = make([]*gpx11GpxTrkSeg, len(track.Segments)) + for segmentNo, segment := range track.Segments { + gpx11Segment := new(gpx11GpxTrkSeg) + if segment.Points != nil { + gpx11Segment.Points = make([]*gpx11GpxPoint, len(segment.Points)) + for pointNo, point := range segment.Points { + gpx11Segment.Points[pointNo] = convertPointToGpx11(&point) + } + } + gpx11Track.Segments[segmentNo] = gpx11Segment + } + } + gpx11Doc.Tracks[trackNo] = gpx11Track + } + } + + return gpx11Doc +} + +func convertFromGpx11Models(gpx11Doc *gpx11Gpx) *GPX { + gpxDoc := new(GPX) + + gpxDoc.XMLNs = gpxDoc.XMLNs + gpxDoc.XmlNsXsi = gpxDoc.XmlNsXsi + gpxDoc.XmlSchemaLoc = gpxDoc.XmlSchemaLoc + + gpxDoc.Creator = gpx11Doc.Creator + gpxDoc.Version = gpx11Doc.Version + gpxDoc.Name = gpx11Doc.Name + gpxDoc.Description = gpx11Doc.Desc + gpxDoc.AuthorName = gpx11Doc.AuthorName + + if gpx11Doc.AuthorEmail != nil { + gpxDoc.AuthorEmail = gpx11Doc.AuthorEmail.Id + "@" + gpx11Doc.AuthorEmail.Domain + } + if gpx11Doc.AuthorLink != nil { + gpxDoc.AuthorLink = gpx11Doc.AuthorLink.Href + gpxDoc.AuthorLinkText = gpx11Doc.AuthorLink.Text + gpxDoc.AuthorLinkType = gpx11Doc.AuthorLink.Type + } + + /* TODO + if gpx11Doc.Extensions != nil { + gpxDoc.Extensions = &gpx11Doc.Extensions.Bytes + } + */ + + if len(gpx11Doc.Timestamp) > 0 { + gpxDoc.Time, _ = parseGPXTime(gpx11Doc.Timestamp) + } + + if gpx11Doc.Copyright != nil { + gpxDoc.Copyright = gpx11Doc.Copyright.Author + gpxDoc.CopyrightYear = gpx11Doc.Copyright.Year + gpxDoc.CopyrightLicense = gpx11Doc.Copyright.License + } + + if gpx11Doc.Link != nil { + gpxDoc.Link = gpx11Doc.Link.Href + gpxDoc.LinkText = gpx11Doc.Link.Text + gpxDoc.LinkType = gpx11Doc.Link.Type + } + + gpxDoc.Keywords = gpx11Doc.Keywords + + if gpx11Doc.Waypoints != nil { + waypoints := make([]GPXPoint, len(gpx11Doc.Waypoints)) + for waypointNo, waypoint := range gpx11Doc.Waypoints { + waypoints[waypointNo] = *convertPointFromGpx11(waypoint) + } + gpxDoc.Waypoints = waypoints + } + + if gpx11Doc.Routes != nil { + gpxDoc.Routes = make([]GPXRoute, len(gpx11Doc.Routes)) + for routeNo, route := range gpx11Doc.Routes { + r := new(GPXRoute) + + r.Name = route.Name + r.Comment = route.Cmt + r.Description = route.Desc + r.Source = route.Src + // TODO + //r.Links = route.Links + r.Number = route.Number + r.Type = route.Type + // TODO + //r.RoutePoints = route.RoutePoints + + if route.Points != nil { + r.Points = make([]GPXPoint, len(route.Points)) + for pointNo, point := range route.Points { + r.Points[pointNo] = *convertPointFromGpx11(point) + } + } + + gpxDoc.Routes[routeNo] = *r + } + } + + if gpx11Doc.Tracks != nil { + gpxDoc.Tracks = make([]GPXTrack, len(gpx11Doc.Tracks)) + for trackNo, track := range gpx11Doc.Tracks { + gpxTrack := new(GPXTrack) + gpxTrack.Name = track.Name + gpxTrack.Comment = track.Cmt + gpxTrack.Description = track.Desc + gpxTrack.Source = track.Src + gpxTrack.Number = track.Number + gpxTrack.Type = track.Type + + if track.Segments != nil { + gpxTrack.Segments = make([]GPXTrackSegment, len(track.Segments)) + for segmentNo, segment := range track.Segments { + gpxSegment := GPXTrackSegment{} + if segment.Points != nil { + gpxSegment.Points = make([]GPXPoint, len(segment.Points)) + for pointNo, point := range segment.Points { + gpxSegment.Points[pointNo] = *convertPointFromGpx11(point) + } + } + gpxTrack.Segments[segmentNo] = gpxSegment + } + } + gpxDoc.Tracks[trackNo] = *gpxTrack + } + } + + return gpxDoc +} + +func convertPointToGpx11(original *GPXPoint) *gpx11GpxPoint { + result := new(gpx11GpxPoint) + result.Lat = original.Latitude + result.Lon = original.Longitude + result.Ele = original.Elevation + result.Timestamp = formatGPXTime(&original.Timestamp) + result.MagVar = original.MagneticVariation + result.GeoIdHeight = original.GeoidHeight + result.Name = original.Name + result.Cmt = original.Comment + result.Desc = original.Description + result.Src = original.Source + // TODO + //w.Links = original.Links + result.Sym = original.Symbol + result.Type = original.Type + result.Fix = original.TypeOfGpsFix + if original.Satellites.NotNull() { + value := original.Satellites.Value() + result.Sat = &value + } + if original.HorizontalDilution.NotNull() { + value := original.HorizontalDilution.Value() + result.Hdop = &value + } + if original.VerticalDilution.NotNull() { + value := original.VerticalDilution.Value() + result.Vdop = &value + } + if original.PositionalDilution.NotNull() { + value := original.PositionalDilution.Value() + result.Pdop = &value + } + if original.AgeOfDGpsData.NotNull() { + value := original.AgeOfDGpsData.Value() + result.AgeOfDGpsData = &value + } + if original.DGpsId.NotNull() { + value := original.DGpsId.Value() + result.DGpsId = &value + } + return result +} + +func convertPointFromGpx11(original *gpx11GpxPoint) *GPXPoint { + result := new(GPXPoint) + result.Latitude = original.Lat + result.Longitude = original.Lon + result.Elevation = original.Ele + time, _ := parseGPXTime(original.Timestamp) + if time != nil { + result.Timestamp = *time + } + result.MagneticVariation = original.MagVar + result.GeoidHeight = original.GeoIdHeight + result.Name = original.Name + result.Comment = original.Cmt + result.Description = original.Desc + result.Source = original.Src + // TODO + //w.Links = original.Links + result.Symbol = original.Sym + result.Type = original.Type + result.TypeOfGpsFix = original.Fix + if original.Sat != nil { + result.Satellites = *NewNullableInt(*original.Sat) + } + if original.Hdop != nil { + result.HorizontalDilution = *NewNullableFloat64(*original.Hdop) + } + if original.Vdop != nil { + result.VerticalDilution = *NewNullableFloat64(*original.Vdop) + } + if original.Pdop != nil { + result.PositionalDilution = *NewNullableFloat64(*original.Pdop) + } + if original.AgeOfDGpsData != nil { + result.AgeOfDGpsData = *NewNullableFloat64(*original.AgeOfDGpsData) + } + if original.DGpsId != nil { + result.DGpsId = *NewNullableInt(*original.DGpsId) + } + return result +} |
