gridsq/main.go

90 lines
1.6 KiB
Go

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)
}
}