mercator icon indicating copy to clipboard operation
mercator copied to clipboard

OpenStreetMap but as terminal user interface (TUI) program

Mercator

mercator

OpenStreetMap but as terminal user interface (TUI) program and Bubble Tea Bubble.

Build

$ go get
$ go build .

The binary is called mercator

Usage

mercator accepts latitude and longitude as arguments, e.g.:

$ mercator 25.0782266 -77.3383438

It also accepts a location name or address, e.g.:

$ mercator miami

Style

mercator accepts the -style flag with an integer value representing one of the options listed as Style, e.g.:

$ mercator -style 4 new york

Navigation

  • arrow up/k: Move north
  • arrow right/l: Move east
  • arrow down/j: Move south
  • arrow left/h: Move west
  • -/_: Zoom out
  • +/=: Zoom in

Bubble

You can embed the mapview into your Bubble Tea application:

package main

import (
  tea "github.com/charmbracelet/bubbletea"
  "github.com/mrusme/mercator/mapview"
)

type model struct {
  mv mapview.Model
}

func main() {
  m := NewModel()
  m.mv.SetLocation("jamaica", 15)

  p := tea.NewProgram(m, tea.WithAltScreen())
  if _, err := p.Run(); err != nil {
    panic(err)
  }
}

func NewModel() model {
  m := model{}
  m.mv = mapview.New(80, 24)
  return m
}

func (m model) Init() tea.Cmd {
  return tea.Batch(tea.EnterAltScreen)
}

func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
  switch mt := msg.(type) {
  case tea.KeyMsg:
    switch mt.String() {
    case "q", "esc", "ctrl+c":
      return m, tea.Quit
    }

  case tea.WindowSizeMsg:
    m.mv.Width = mt.Width
    m.mv.Height = mt.Height
    return m, nil

  }

  var cmd tea.Cmd
  m.mv, cmd = m.mv.Update(msg)
  return m, cmd
}

func (m model) View() string {
  return m.mv.View()
}