package main import ( "flag" "fmt" "git.wntrmute.dev/kyle/goutils/die" "github.com/logocomune/maidenhead" geo "gopkg.in/billups/golang-geo.v2" ) var qths = map[int]string{ 4: "CM97", 6: "CM97cq", 8: "CM97cq53", 10: "CM97cq53CI", } var kmToMile = 0.621371 func cToP(c maidenhead.Coordinate) *geo.Point { return geo.NewPoint(c.Lat, c.Lng) } func distBearing(qth, qsl string) (err error) { var cqth, cqsl maidenhead.Coordinate cqth.Lat, cqth.Lng, err = maidenhead.GridCenter(qth) if err != nil { return err } cqsl.Lat, cqsl.Lng, err = maidenhead.GridCenter(qsl) if err != nil { return err } pqth := cToP(cqth) pqsl := cToP(cqsl) dist := pqth.GreatCircleDistance(pqsl) bearing := pqth.BearingTo(pqsl) fmt.Printf("%s => %s: distance %0.2f miles, bearing %0.1f°\n", qth, qsl, dist*kmToMile, bearing) return nil } func main() { var lat, lon float64 var precision int64 flag.Float64Var(&lat, "lat", 0.0, "latitude of grid") flag.Float64Var(&lon, "lon", 0.0, "longitude of grid") flag.Int64Var(&precision, "d", 6, "number of digits") flag.Parse() if flag.NArg() == 0 { fmt.Println("nothing") return } cmd := flag.Arg(0) switch cmd { case "geo": grid, err := maidenhead.Locator(lat, lon, int(precision)) die.If(err) fmt.Printf("%0.6f %0.6f: ", lat, lon) fmt.Println(grid) case "qth": grid, ok := qths[int(precision)] if !ok { fmt.Println(qths[6]) } else { fmt.Println(grid) } case "db": var qth, qsl string if flag.NArg() == 2 { qsl = flag.Arg(1) qth = qths[len(qsl)] } else { qsl = flag.Arg(2) qth = flag.Arg(1) } err := distBearing(qth, qsl) die.If(err) } }