summaryrefslogtreecommitdiff
path: root/vendor/github.com/dsoprea/go-exif/gps.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/dsoprea/go-exif/gps.go')
-rw-r--r--vendor/github.com/dsoprea/go-exif/gps.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/vendor/github.com/dsoprea/go-exif/gps.go b/vendor/github.com/dsoprea/go-exif/gps.go
new file mode 100644
index 000000000..7d74f22d3
--- /dev/null
+++ b/vendor/github.com/dsoprea/go-exif/gps.go
@@ -0,0 +1,56 @@
+package exif
+
+import (
+ "errors"
+ "fmt"
+ "time"
+
+ "github.com/golang/geo/s2"
+)
+
+var (
+ ErrGpsCoordinatesNotValid = errors.New("GPS coordinates not valid")
+)
+
+type GpsDegrees struct {
+ Orientation byte
+ Degrees, Minutes, Seconds float64
+}
+
+func (d GpsDegrees) String() string {
+ return fmt.Sprintf("Degrees<O=[%s] D=(%g) M=(%g) S=(%g)>", 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<LAT=(%.05f) LON=(%.05f) ALT=(%d) TIME=[%s]>", 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.LatLngFromDegrees(latitude, longitude)
+ cellId := s2.CellIDFromLatLng(ll)
+
+ if cellId.IsValid() == false {
+ panic(ErrGpsCoordinatesNotValid)
+ }
+
+ return cellId
+}