From 14f29f88d3ce83c5c91b2684fc4b5b3beff71a8f Mon Sep 17 00:00:00 2001 From: Kyle Isom Date: Tue, 19 Dec 2023 10:14:00 -0800 Subject: [PATCH] initial import --- go.mod | 9 ++++++ go.sum | 6 ++++ main.go | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..3c0c1ad --- /dev/null +++ b/go.mod @@ -0,0 +1,9 @@ +module git.wntrmute.dev/kyle/gridsq + +go 1.21.3 + +require ( + git.wntrmute.dev/kyle/goutils v1.7.4 // indirect + github.com/logocomune/maidenhead v1.0.1 // indirect + gopkg.in/billups/golang-geo.v2 v2.0.0-20170124000346-c2931833be19 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..0124620 --- /dev/null +++ b/go.sum @@ -0,0 +1,6 @@ +git.wntrmute.dev/kyle/goutils v1.7.4 h1:kbvUoxRwAEemz4jL52AUKaOipuCX8F8PGTQHS5V3lRY= +git.wntrmute.dev/kyle/goutils v1.7.4/go.mod h1:1PGn83Ac98KWyI6yfpCVyP1Ji61PX6lFpROxY+IoTJg= +github.com/logocomune/maidenhead v1.0.1 h1:WnBpC/LIhc81QnwDdxEPKHwSAspMCWwsYMuM9vQMFgA= +github.com/logocomune/maidenhead v1.0.1/go.mod h1:FLkUKuGyo4uKESNlXG8jgQgaTSApyR2ZZfq7m2Btmjs= +gopkg.in/billups/golang-geo.v2 v2.0.0-20170124000346-c2931833be19 h1:vu0Y9rNRRTFG70fnQ/W/CG4N629vz9uaqaY7R7fXnVo= +gopkg.in/billups/golang-geo.v2 v2.0.0-20170124000346-c2931833be19/go.mod h1:Wo/E84lJTIKl9WdTGYGLAG+q9zRxnl9RnCZenHqASWk= diff --git a/main.go b/main.go new file mode 100644 index 0000000..ebc748f --- /dev/null +++ b/main.go @@ -0,0 +1,89 @@ +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) + } + +}