GoogleMapから地図をダウンロード(緯度経度を指定)
今後はてな記法やめてMarkdownで書きます。 GoogleMapを緯度経度で指定した範囲切り抜いて保存したいんですけど意外とかゆい所に手が届かないんですねー。 いろんな手法をまとめてみました。 (書いてて途中で飽きたのでいつか書き直します。) 関係ないけどGPSとか特定の緯度経度の点を地図と重ねたいならここを使うと良いでしょう。
GoogleMapから地図をダウンロードする方法
GoogleMapから画像をダウンロードしたくなる時ってありますよね。 調べた結果以下の3つの候補があります。 一番上が一番手軽な方法で徐々にめんどくさくなります。
スクリーンショット
Windowsの場合はPrintscreenを押して画像をクリップボードに保存した後,「ペイント」等のソフトで加工できます。
私がよく使うのは「Snippingtool」というやつで「Windows}+「R」で「ファイル名を指定して実行」の後に「snippingtool」と押して実行します。
同様に「Windows」+「Shift」+「S」でもクリックした範囲を保存できます。 121ware.com > サービス&サポート > Q&A > Q&A番号 017976
MacとかLinuxを使えるリテラシーがある人はこの辺は適当なソフト使うなりググるなりしてください。
GoogleのMymap機能を使う
Google公式で画像のダウンロード機能があります。 これはスクリーンショットより高精度な画像を取得できるのでとても便利です。 この項はここの和訳です。
- 次のMy Maps Google websiteのURLを開く。
- 新しい地図の作成 を選択する。Googleアカウントへのログインを要求されるでしょう。
- GoogleMapと同様に場所を調べて良い感じに調整
- レイヤーを追加を押した後に黄色く塗りつぶした3点リードのメニューを開き「地図の印刷」を選択。 最終的にPDFやPNGで吐き出せます。
フリーソフトを使う
調べきれてないのでなんかあったら教えてください。
GoogleMapDownloader
名前そのまんまです。 googlemapdownloader.weebly.com
わかりやすい解説(英語)もあり,安定して使うならこっちかなぁという感じです。 www.youtube.com
結局使ってないのですが感想あったらコメントでください。 多分結構使いやすそうです。
GoogleのAPIを叩いて画像を入手する
Google様の機能を使うとこの手のことは簡単にできます。 なるべく簡単な順に列挙していくつもりです。
Keyを入手しよう(要Googleアカウント)
大前提として「鍵(キー)」という個人認証手段的なものが必要です。 Googleにサインインしていれば例えば以下のページにいって「キー」の取得を押してぽちぽち進めれば鍵を入手できます。 Simple Map | Google Maps JavaScript API | Google Developers
なくすとアレなのできちんとメモしておきましょう。
URLを直に打って画像を入手
Google Static Mapsというのがあります。 Google Static Maps デベロッパー ガイド | Google Static Maps API | Google Developers 以下のコードをURL欄に打ち込むと該当する地域が表示され右クリックでダウンロードできます。
https://maps.googleapis.com/maps/api/staticmap?center=Brooklyn+Bridge,New+York,NY&zoom=13&size=600x300&maptype=roadmap&markers=color:blue%7Clabel:S%7C40.702147,-74.015794&markers=color:green%7Clabel:G%7C40.711614,-74.012318&markers=color:red%7Clabel:C%7C40.718217,-73.998284&key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk
またGoogle Maps Tile APIというものを見るに有望そうな関数が存在しました。JSで書くので僕もよくわかってないんですが… developers.google.com
ここでは次のようなリクエストを呼んで東西南北の範囲を指定できるのでこれは確実にCroppingできるでしょうね。
https://www.googleapis.com/tile/v1/viewport ?session=session token &zoom=zoom &north=north&south=south&east=east&west=west &key=YOUR_API_KEY
なおzoomというのはZoomレベルというやつでして0-23まであり,0が一番でかいです。(地球全体うつすレベル。) Zoomレベルと実際の値がどう対応しているのか計算方法をここの人がやってくれています。
Pythonスクリプトでダウンロード
とりあえず以下のスクリプが有効でした。(依存パッケージあり) A python script to download high resolution Google map images given a longitude, latitude and zoom level. (Works with Python 3) · GitHub
しかし,これはどうも中心の緯度経度を与えてそれが含まれているタイルを取得してきて統合というような動きのようです。 さっきのAPIの知識を使ってちょろっと書き換えれば境界クロッピングも行けそうなもんですが…
JavaScriptで書く
JS全く書けないのでコピペのつなぎ合わせで次のコードが有効であることを確認しました。 Xmin,Xmax,Ymin,Ymaxの所に経度と緯度の下限上限を入れておいてね。
var map; function initMap() { map = new google.maps.Map(document.getElementById('map'), { center: {lat: -34.397, lng: 150.644}, zoom: 8 }); var southWest = new google.maps.LatLng(Ymin,Xmin); var northEast = new google.maps.LatLng(Ymax,Xmax); var bounds = new google.maps.LatLngBounds(southWest,northEast); map.fitBounds(bounds); }
これで表示されることには表示されるんですが,,,ダウンロードの手法がまだわかりません笑 だれか実装してw
総括
2018年記事作成時にはとりあえずマーカを着けて手動で画像をトリミングをした後に調べましたが有望そうなのはフリーソフトくらいでしょうか。 座標を指定してダウンロードするにはJavaScriptやそのGoogleAPIの方に熟達したほうが良いかもしれません。
わかった?こと?
どうもGoogleMapは地図画像を0-23までの24種類のスケーリングで保持していてそれぞれの画像は256×256で保存されている?ようです。(←所感により間違っている可能性有) あとは緯度経度からメルカトル図法の地図に座標変換して,対応する画像をサーチして…とかやっているんでしょうかねぇ。 GoogleMapと戯れた食後でした。