MacFeeling Blog

マックな感じ …

紙の地図も必要なので、Google マップを見やすくカスタマイズ(追記あり)

公開 : | 0件のコメント

この記事は最終更新日から 約4年が経過しているので情報が古い可能性があります。

自転車でちょっと遠くまで出かける時、なるべく幹線道路を通らずに目的地まで行きたい
時間はかかるけど、新しい道を発見できるし、スピードが出ている車との並走が少ないので気分的にだいぶ楽

迷った時など細いところはiPhoneで確認しますが、大まかな感じは紙の地図があるとやはり便利です。

以前はMapFanの「ギュッ!と印刷」機能を使ってA4に印刷したものを使っていたのですが、いつからか利用できなく?なってしまったようで、Google マップに変えました。

しかしこのGoogle マップ、印刷すると道路が白すぎてよく見えません。
どうにかならないかとググってみたところ

Styled Maps Wizardを使って取得したコードを利用すればカスタマイズできるということで、

Google Maps API Styled Map Wizardのページにアクセスしたら、右上の「場所を入力」フィールドに、表示させたい場所を入力

今回は道路の色を変えるので

SelectorsのFeature type All » Road » Localを選択して
Colorチェックボックスにチェックを入れて、色を調整。
google_maps02

幹線道路も変更するので
Map Styleの右上の「Add」ボタンをクリック
Style 1が追加されるので、Style 1が選択されているのを確認
google_maps03

SelectorsのFeature type All » Road » Arterialを選択して
Colorチェックボックスにチェックを入れて、色を調整。
google_maps04

こんな感じになりました。
google_maps05

問題なければ、Map Styleウインドウ下の「Show JSON」ボタンをクリック
google_maps06

表示されたものをコピーしておく。

Google Maps API v3 Styled Maps JSON

[
  {
    "featureType": "road.local",
    "stylers": [
      { "color": "#808080" }
    ]
  },{
    "featureType": "road.arterial",
    "stylers": [
      { "color": "#8379c6" }
    ]
  }
]

APIキーの取得
Google Mapsの利用にはAPIキーが必要なので、まだの場合はAPIキーを取得する
JavaScript API のキーを取得する  |  Google Maps JavaScript API  |  Google Developersのページの手順に従ってAPI キーを取得
Google Maps の APIキー を簡単に取得する – ねんでぶろぐのページがわかりやすいです。

APIキーの準備が出来たら、ファイルの作成
スタイル化されたマップ  |  Google Maps JavaScript API  |  Google Developersのページの「StyledMapType を作成する」を参考に

function initialize() {

  // Create an array of styles.
  var styles = [
    {
      "featureType": "road.local",
      "stylers": [
        { "color": "#808080" }
      ]
    },{
      "featureType": "road.arterial",
      "stylers": [
        { "color": "#8379c6" }
      ]
    }
  ];

  // Create a new StyledMapType object, passing it the array of styles,
  // as well as the name to be displayed on the map type control.
  var styledMap = new google.maps.StyledMapType(styles,
    {name: "Styled Map"});

  // Create a map object, and include the MapTypeId to add
  // to the map type control.
  var mapOptions = {
    zoom: 16, // 拡大比率
    center: new google.maps.LatLng(35.703760, 139.579430), //中心座標
    mapTypeControlOptions: {
      mapTypeIds: [google.maps.MapTypeId.ROADMAP, 'map_style']
    }
  };
  var map = new google.maps.Map(document.getElementById('map'),
    mapOptions);

  //Associate the styled map with the MapTypeId and set it to display.
  map.mapTypes.set('map_style', styledMap);
  map.setMapTypeId('map_style');
}
var styles []内には、Styled Maps Wizardを使って生成したコードを挿入

center: new google.maps.LatLng();には、表示する中心座標を

表示する中心座標を取得するには
Google マップでデフォルトで表示させたい場所を検索したら、中心部分を右クリックして「この場所について」を選択
google_maps01

画面下部に詳細情報を記したカードが表示されます。

Google マップをライトモードで利用している場合は、表示されないので、ライトモードでマップを使う - パソコン - マップ ヘルプのページに「完全版のマップに切り替える」を参考に完全版に切り替えてください。

表示された座標をコピーしておく
google_maps07

var map = new google.maps.Map(document.getElementById('map'),
mapOptions);の、getElementByIdで設定した名前(ここでは map)は、htmlファイルのdiv id=で同じものを設定します。

出来上がったら、任意の名前(ここではgmap.js)で保存(UTF-8、改行LF)

htmlファイルの作成(A4で印刷するので高さと幅はこのくらいの大きさがいいかも)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
                <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=true&key=取得したAPIキー"></script>
<script type="text/javascript" src="gmap.js"></script>
</head>
<body onload="initialize();">
        <div id="map" style="width: 100%; height: 842px; margin: 10px 0;"></div>
</body>
</html>

src="http://maps.googleapis.com/maps/api/js?sensor=true&key=取得したAPIキー"

<script type="text/javascript" src="gmap.js"></script>のgmap.jsは作成したStyledMapTypeのファイル名

出来上がったら、任意の名前(ここではgmap.html)で保存(UTF-8、改行LF)

作成した2つのファイル(gmap.html、gmap.js)をFTPソフトなどを使って、ホームページにアップしてブラウザで確認

あとは移動させたり大きさを変更したりして、印刷する部分が確定したら、ブラウザのプリントメニューからそのまま印刷をするか、「Shift + Command + 4」で選択保存して、プレビュー等で開いて印刷を(もっとスマートな方法があるような)

あとは、曲がるところや迷いそうなところに印や注釈をつけておけばOK :wink_wp:

追記
デフォルトのサイズからのズームアウトは問題ありませんが、ズームインすると色が消えてしまうようです。

さらに追記
左上の地図というマップタイプコントールを消して、検索ボックスを表示してみました。(だいぶ適当ですが)

Places search box  |  Google Maps JavaScript API  |  Google Developers

gmap.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
                <script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=true&key=取得したAPIキー&libraries=places"></script>
<script type="text/javascript" src="gmap.js"></script>
<style>
.controls {
  margin-top: 10px;
  border: 1px solid transparent;
  border-radius: 2px 0 0 2px;
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  height: 32px;
  outline: none;
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
}

#pac-input {
  background-color: #fff;
  font-family: Roboto;
  font-size: 15px;
  font-weight: 300;
  margin-left: 12px;
  padding: 0 11px 0 13px;
  text-overflow: ellipsis;
  width: 300px;
}
</style>
</head>
<body onload="initialize();">
        <input id="pac-input" class="controls" type="text" placeholder="Search Box">
        <div id="map" style="width: 100%; height: 842px; margin: 10px 0;"></div>
</body>
</html>

gmap.js

function initialize() {

  // Create an array of styles.
  var styles = [
    {
      "featureType": "road.local",
      "stylers": [
        { "color": "#808080" }
      ]
    },{
      "featureType": "road.arterial",
      "stylers": [
        { "color": "#8379c6" }
      ]
    }
  ];

  // Create a new StyledMapType object, passing it the array of styles,
  // as well as the name to be displayed on the map type control.
  var styledMap = new google.maps.StyledMapType(styles,
    {name: "Styled Map"});

  // Create a map object, and include the MapTypeId to add
  // to the map type control.
  var mapOptions = {
    zoom: 16, // 拡大比率
    center: new google.maps.LatLng(35.703760, 139.579430), // 中心座標
    mapTypeControl: false,
    mapTypeControlOptions: {
      mapTypeIds: [google.maps.MapTypeId.ROADMAP, 'map_style']
    }
  };
  var map = new google.maps.Map(document.getElementById('map'),
    mapOptions);

  //Associate the styled map with the MapTypeId and set it to display.
  map.mapTypes.set('map_style', styledMap);
  map.setMapTypeId('map_style');

  // Create the search box and link it to the UI element.
  var input = document.getElementById('pac-input');
  var searchBox = new google.maps.places.SearchBox(input);
  map.controls[google.maps.ControlPosition.TOP_LEFT].push(input);

  // Bias the SearchBox results towards current map's viewport.
  map.addListener('bounds_changed', function() {
    searchBox.setBounds(map.getBounds());
  });

  var markers = [];
  // Listen for the event fired when the user selects a prediction and retrieve
  // more details for that place.
  searchBox.addListener('places_changed', function() {
    var places = searchBox.getPlaces();

    if (places.length == 0) {
      return;
    }

    // Clear out the old markers.
    markers.forEach(function(marker) {
      marker.setMap(null);
    });
    markers = [];

    // For each place, get the icon, name and location.
    var bounds = new google.maps.LatLngBounds();
    places.forEach(function(place) {
      var icon = {
        url: place.icon,
        size: new google.maps.Size(71, 71),
        origin: new google.maps.Point(0, 0),
        anchor: new google.maps.Point(17, 34),
        scaledSize: new google.maps.Size(25, 25)
      };

      // Create a marker for each place.
      markers.push(new google.maps.Marker({
        map: map,
        icon: icon,
        title: place.name,
        position: place.geometry.location
      }));

      if (place.geometry.viewport) {
        // Only geocodes have viewport.
        bounds.union(place.geometry.viewport);
      } else {
        bounds.extend(place.geometry.location);
      }
    });
    map.fitBounds(bounds);
  });

 }

こんな感じで表示されます。
google_maps08

コメントを残す

必須欄は * がついています




日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)