粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

GoogleMapから地図をダウンロード(緯度経度を指定)

今後はてな記法やめてMarkdownで書きます。 GoogleMapを緯度経度で指定した範囲切り抜いて保存したいんですけど意外とかゆい所に手が届かないんですねー。 いろんな手法をまとめてみました。 (書いてて途中で飽きたのでいつか書き直します。) 関係ないけどGPSとか特定の緯度経度の点を地図と重ねたいならここを使うと良いでしょう。

GoogleMapから地図をダウンロードする方法

GoogleMapから画像をダウンロードしたくなる時ってありますよね。 調べた結果以下の3つの候補があります。 一番上が一番手軽な方法で徐々にめんどくさくなります。

スクリーンショット

これはなにかとよく使う基本技能ですね。 http://121ware.com/qasearch/1007/doc/answer/image/017/017976/017976h.png

MacとかLinuxを使えるリテラシーがある人はこの辺は適当なソフト使うなりググるなりしてください。

GoogleのMymap機能を使う

Google公式で画像のダウンロード機能があります。 これはスクリーンショットより高精度な画像を取得できるのでとても便利です。 この項はここの和訳です。

  1. 次のMy Maps Google websiteのURLを開く。
  2. 新しい地図の作成 を選択する。Googleアカウントへのログインを要求されるでしょう。
  3. GoogleMapと同様に場所を調べて良い感じに調整
  4. レイヤーを追加を押した後に黄色く塗りつぶした3点リードのメニューを開き「地図の印刷」を選択。 f:id:ossyaritoori:20180425212009p:plain 最終的にPDFやPNGで吐き出せます。

フリーソフトを使う

調べきれてないのでなんかあったら教えてください。

GoogleMapDownloader

名前そのまんまです。 googlemapdownloader.weebly.com

わかりやすい解説(英語)もあり,安定して使うならこっちかなぁという感じです。 www.youtube.com

結局使ってないのですが感想あったらコメントでください。 多分結構使いやすそうです。

GoogleAPIを叩いて画像を入手する

Google様の機能を使うとこの手のことは簡単にできます。 なるべく簡単な順に列挙していくつもりです。

Keyを入手しよう(要Googleアカウント)

大前提として「鍵(キー)」という個人認証手段的なものが必要です。 Googleにサインインしていれば例えば以下のページにいって「キー」の取得を押してぽちぽち進めれば鍵を入手できます。 Simple Map  |  Google Maps JavaScript API  |  Google Developers

なくすとアレなのできちんとメモしておきましょう。 f:id:ossyaritoori:20180425205536p:plain

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と戯れた食後でした。