世界を動かす技術を、日本語で。

MapSCII – ターミナルでの世界地図

概要

MapSCII は、 Node.jsベース のターミナル用地図表示ツール。 ASCII/Braille で世界地図を表示し、 マウスやキーボード で直感的に操作可能。 カスタマイズ性 が高く、 オフライン動作 や独自タイルサーバー接続も対応。 Linux/OSX の多くのターミナルで動作し、 完全JavaScript製インストール・実行方法操作方法 もシンプル。

MapSCIIとは

  • Node.js ベースの ベクタタイル→ASCII/Braille レンダラー
  • xterm互換ターミナル で世界地図表示
  • オンライン/オフライン 両対応
  • 100%純粋JavaScript 実装

主な特徴

  • マウス操作 による地図のドラッグ・ズーム
  • 任意地点周辺の Point-of-Interest(POI) 表示
  • Mapbox Styles によるレイヤースタイルのカスタマイズ
  • 任意のベクタタイルサーバー への接続
  • OSM2VectorTiles ベースの最適化済みタイルも利用可能
  • ローカルVectorTile/MBTiles 対応でオフライン利用
  • Linux/OSXターミナル との高い互換性
  • 滑らかな操作感 を実現する最適化アルゴリズム

すぐに試す方法

  • ターミナルで telnet mapscii.me 実行
  • Windows 利用者は PuTTY 等のtelnetクライアントを利用

ローカルでの起動方法

  • Node.js 最新版が必要
  • npxで一発起動:npx mapscii

ローカルインストール方法

  • npm 利用時
    • Node.js v10以上を用意
    • npm install -g mapscii
    • OSXや権限エラー時はsudo npm install -g mapscii
  • snap 利用時(Linuxのみ)
    • sudo snap install mapscii
    • snapパッケージは@nathanhainesがメンテナンス

実行方法

  • インストール後、コマンドラインで mapscii 実行

操作方法

  • キーボードショートカット
    • 矢印キー:スクロール移動
    • a/z:ズームイン・アウト
    • c:ブロック文字モード切替
    • q:終了
  • マウス操作
    • 対応ターミナルならドラッグで移動、ホイールでズーム

背景技術・利用ライブラリ

  • コンソール制御
    • x256:RGB→xterm-256色変換
    • term-mouse:マウスイベント処理
    • keypress:入力処理
    • string-width:文字列幅計算
  • 地図データ処理
    • vector-tile:VectorTileパース
    • pbf:Protobufデコード
    • mbtiles:MBTilesパース
  • ベクトル・数値処理
    • earcut:ポリゴン三角形分割
    • rbush:2D空間インデックス
    • bresenham:線分点計算
    • simplify-js:ポリライン簡略化
  • データフロー管理
    • node-fetch:HTTPリクエスト
    • env-paths:タイル保存先パス管理

今後の課題(TODO)

  • GeoJSON 対応(geojson-vt経由)
  • CLI起動パラメータ 対応
    • タイルソース・スタイル・中心座標・ズーム・デモモード等
  • マウス操作の拡張
    • POI/ラベル・ポリゴン等へのホバー対応
  • スタイラー
    • ズームレベルごとのスタイル対応
  • レンダラー
    • 別スレッドでのタイル処理
    • 広域描画時の最適化
    • 複数行ラベル描画
  • タイルソース
    • 単一VectorTile対応

特別謝辞

  • lukasmartinelli & manuelroth (OSM2VectorTiles開発)
  • mourner (earcut, rbush, simplify-js等のGISアルゴリズム開発)

ライセンス・著作権

  • 地図データ
    • OpenStreetMap:Open Database License(ODbL)準拠
    • クレジット必須、改変後も同ライセンスで配布
    • 地図タイル・ドキュメント:CC BY-SA 2.0
  • MapSCII本体
    • 詳細はリポジトリ内ライセンスファイル参照

Hackerたちの意見

NESのGoogleマップを思い出すなぁ : https://www.youtube.com/watch?v=rznYifPHxDg

これ、スタークラフトのことかと思った。

わかる、俺もそうだよ。SCII = スタークラフト2で、「マップ」って言葉はスタークラフトではめっちゃ普通だった。大好きだったな。20年前にすごく楽しんだ。

C-base!いつか行ってみたいな、チェックしに。

GitHubのユーザー名に関してだけど、これ、俺の好きなレストランの一番好きな料理の名前だったんだ。そこのダイナーは、なんかほっこりする雰囲気だったよ : https://honeypot.net/2008/02/09/you-want-how.html(今でも家ではガーリックブレッドを「6BR」って呼んでるんだ。「おい、パパ、6BR取ってくれる?」って感じで。)

SSHじゃなくてTelnetでアクセスできるのがいいね。これで一番必要なビンテージコンピュータでも使えるようになる。俺のサーバーはHTTP/SかTelnetでコンテンツを配信してるから、Telnetで接続する人たちにマップを見せるのにいい方法だね。

毎日「FoodGuessr」ってゲームをやってるんだけど、食べ物がどの国から来たかを当てるやつ。それと一緒に使ったら楽しそうだな、ありがとう!

すごくクール!もっと原始的なマップだと思ってたけど、実際にはOpenStreetMapを使ってるから、ストリートレベルまでズームできるんだね。

すごくいい感じ!でも、俺の場合、ターミナルエミュレーターでしかちゃんと動かないんだ。GNU/Linuxのターミナル(Ctrl+Shift+F1)だと、使われてる記号のほとんどが表示できなくて、ASCIIしかサポートしてないんだよね。

  • https://news.ycombinator.com/item?id=27388589 もう4年以上経ってるのに、リダイレクトはまだ残ってるね。この賭けは負けてたな。(-:

ありがとう!前のスレッドをマクロ展開したよ:Telnet Mapscii.me - https://news.ycombinator.com/item?id=44572328 - 2025年7月(コメント1件) MapSCII – コンソール用の点字とASCIIの世界地図レンダラー - https://news.ycombinator.com/item?id=39975887 - 2024年4月(コメント23件) MapSCII – あなたのコンソールに広がる世界 - https://news.ycombinator.com/item?id=27042629 - 2021年5月(コメント43件) MapSCII: あなたのコンソール用の世界地図レンダラー - https://news.ycombinator.com/item?id=20375881 - 2019年7月(コメント24件) MapSCII – コンソール用の点字とASCIIの地図レンダラー - https://news.ycombinator.com/item?id=14254165 - 2017年5月(コメント65件)

俺がオフラインになるまで、オフラインにならないよ ;)

いいね!フルスクリーンターミナル(2560x1440のalacritty)でtelnetを開くとクラッシュするみたいだけど、ターミナルを半分の幅にすると動くんだ。telnetでマウス操作を渡せるなんて気づかなかったよ。今、コードを読まなきゃ!いいハックだね。

telnetバージョンにはちょっと変なところがあって、XTermとPuTTYを混同したり、空のTERM環境変数があると奇妙なタイムアウトメッセージを表示したりするんだ。NVTが256列以上持てないと思ってるんじゃないかって気がする。残念ながら、その部分はソースが公開されてないんだ。(TELNETサーバークラスライブラリはソースを公開してるけど、2019年のクローズドイシューのコメント内のハイパーリンクに埋もれてるし、実際にそのライブラリを使って作られたプログラムは公開されてないんだ。)

マウスの動きは、ANSIエスケープシーケンスを通じてターミナルに信号が送られるんだ。これは、ターミナルが表示しないように賢くできてるインバンドの文字列だから、Telnet自体は実際には何も関係ないんだよ。Telnetが知ってる限りでは、他の文字と違いはないんだ。