package exif import ( "fmt" "time" "github.com/golang/geo/s1" "github.com/golang/geo/s2" ) type GpsDegrees struct { Orientation byte Degrees, Minutes, Seconds int } func (d GpsDegrees) String() string { return fmt.Sprintf("Degrees", string([]byte { d.Orientation }), d.Degrees, d.Minutes, d.Seconds) } func (d GpsDegrees) Decimal() float64 { decimal := float64(d.Degrees) + float64(d.Minutes) / 60.0 + float64(d.Seconds) / 3600.0 if d.Orientation == 'S' || d.Orientation == 'W' { return -decimal } else { return decimal } } type GpsInfo struct { Latitude, Longitude GpsDegrees Altitude int Timestamp time.Time } func (gi *GpsInfo) String() string { return fmt.Sprintf("GpsInfo", gi.Latitude.Decimal(), gi.Longitude.Decimal(), gi.Altitude, gi.Timestamp) } func (gi *GpsInfo) S2CellId() s2.CellID { latitude := gi.Latitude.Decimal() longitude := gi.Longitude.Decimal() ll := s2.LatLng{ s1.Angle(latitude), s1.Angle(longitude), } ll.Normalized() return s2.CellIDFromLatLng(ll) }