LoginSignup
20
29

More than 5 years have passed since last update.

GoogleMapのAPIについてまとめてみた

Last updated at Posted at 2017-04-30

GoogleMapのAPIを使ってWEBアプリを作りたいのでその仕様についてまとめてみました。

準備

  • GoogleMapAPIのライブラリを読み込む
  • APIのKEY
  • callback関数
HTML
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>GoogleMapsのAPI</title>
  <script async defer
    src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=googleMap.init">
    </script>
  <style>
    #map {
      width: 100%;
      height: 400px;
    }
  </style>
</head>
<body>
  <div id="map"></div>
  <script>
    var googleMap = {
      init: function() {
        /* ここに書いていきます */
      }
    }
  </script>
</body>
</html>

指定した経度緯度にマーカー

javascript
var googleMap = {
  init: function() {
    var self = this;
    var latlng = new google.maps.LatLng(35.66, 139.69);
    var options = {
      zoom: 15,
      center: latlng,
      mapTypeId: 'roadmap'
    };
    var map = new google.maps.Map(document.getElementById('map'), options);
    self.marker(map);
  },
  marker: function(map) {
    var marker = new google.maps.Marker({
      position: map.getCenter(),
      map: map
    });
  }
}

クリックした箇所にマーカー

javascript
var googleMap = {
  init: function() {
    var self = this;
    var latlng = new google.maps.LatLng(35.66, 139.69);
    var options = {
      zoom: 15,
      center: latlng,
      mapTypeId: 'roadmap' // https://developers.google.com/maps/documentation/javascript/maptypes?hl=ja
    };
    var map = new google.maps.Map(document.getElementById('map'), options);
    self.clickPositionMarker(map);
  },
  clickPositionMarker: function(map) {
    google.maps.event.addListener(map, 'click', function(event) {
      var marker = new google.maps.Marker({
        position: event.latLng,
        map: map
      });
    });
  }
}

情報ウィンドウを表示

javascript
var googleMap = {
  init: function() {
    var self = this;
    var latlng = new google.maps.LatLng(35.66, 139.69);
    var options = {
      zoom: 15,
      center: latlng,
      mapTypeId: 'roadmap'
    };
    var map = new google.maps.Map(document.getElementById('map'), options);
    self.infoWindow(map)
  },
  infoWindow: function(map) {
    var infoWindow = new google.maps.InfoWindow({
      content: '<strong>渋谷のあたり</strong>だよ!',
      position: map.getCenter()
    });
    infoWindow.open(map);
  }
}

マーカーをクリックしたら情報ウィンドウを表示

javascript
var googleMap = {
  init: function() {
    var self = this;
    var latlng = new google.maps.LatLng(35.66, 139.69);
    var options = {
      zoom: 15,
      center: latlng,
      mapTypeId: 'roadmap'
    };
    var map = new google.maps.Map(document.getElementById('map'), options);
    self.marker(map)
  },
  infoWindow: function(map, marker) {
    var infoWindow = new google.maps.InfoWindow({
      content: '<strong>渋谷のあたり</strong>だよ!',
    });
    infoWindow.open(map, marker)
  },
  marker: function(map) {
    var self = this;
    var marker = new google.maps.Marker({
      position: map.getCenter(),
      map: map
    });
    google.maps.event.addListener(marker, 'click', function() {
      self.infoWindow(map, marker);
    });
  }
}

ジオコーディングでMAP表示

ジオコーディングとは、住所(たとえば「東京都港区六本木 6-10-1」)を地理的座標(たとえば、緯度 35.6604282、経度 139.7269877)に変換するプロセスです。

javascript
var googleMap = {
  init: function() {
    var self = this;
    var geocoder = new google.maps.Geocoder();
    var address = '東京都世田谷区';
    self.geocode(geocoder, address);
  },
  geocode: function(geocoder, address) {
    var self = this;
    geocoder.geocode({
      'address': address
    }, function(result, status) {
      self.geocodeCallback(result, status)
    });
  },
  geocodeCallback: function(result, status) {
    if (status === google.maps.GeocoderStatus.OK) {
      var latlng = result[0].geometry.location;
      var options = {
        zoom: 15,
        center: latlng,
        mapTypeId: 'roadmap'
      };
      var map = new google.maps.Map(document.getElementById('map'), options);
    } else {
      alert('エラーです!');
    }
  }
}

クリック位置の住所を情報ウィンドウで表示

javascript
var googleMap = {
  init: function() {
    var self = this;
    var geocoder = new google.maps.Geocoder();
    var address = '東京都世田谷区';
    self.geocode(geocoder, address);
  },
  geocode: function(geocoder, address) {
    var self = this;
    geocoder.geocode({
      'address': address
    }, function(result, status) {
      self.geocodeCallback(result, status, geocoder)
    });
  },
  geocodeCallback: function(result, status, geocoder) {
    var self = this;
    if (status === google.maps.GeocoderStatus.OK) {
      var latlng = result[0].geometry.location;
      var options = {
        zoom: 15,
        center: latlng,
        mapTypeId: 'roadmap'
      };
      var map = new google.maps.Map(document.getElementById('map'), options);
      this.mapClick(map, geocoder);
    } else {
      alert('エラーです!');
    }
  },
  mapClick: function(map, geocoder) {
    google.maps.event.addListener(map, 'click', function(event) {
      var marker = new google.maps.Marker({
        position: event.latLng,
        map: map
      });
      geocoder.geocode({
        'latLng': event.latLng
      }, function(result, status) {
        if(status === google.maps.GeocoderStatus.OK) {
          var infoWindow = new google.maps.InfoWindow({
            content: result[0].formatted_address
          });
          infoWindow.open(map, marker);
        } else {
          alert('エラーです!');
        }
      });
    });
  }
}

住所を入力してその地図とマーカーを表示

inputのテキストに住所を入力してボタンをクリックするとその住所の地図とマーカーを表示させる

HTML
<div>住所:<input type="text" id="address" value=""> <input type="button" value="表示" onclick="googleMap.addressClick();"></div>
<div id="map"></div>
javascript
var googleMap = {
  init: function() {
    var self = this;
    var latlng = new google.maps.LatLng(35.66, 139.69);
    var options = {
      zoom: 15,
      center: latlng,
      mapTypeId: 'roadmap'
    }
    self.map = new google.maps.Map(document.getElementById('map'), options);
  },
  addressClick: function() {
    var self = this;
    var map = self.map;
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({
      'address': document.getElementById('address').value
    }, function(result, status) {
      self.mapMake(result, status);
    });
  },
  mapMake: function(result, status) {
    var self = this;
    var map = self.map;
    if (status === google.maps.GeocoderStatus.OK) {
      map.panTo(result[0].geometry.location);
      var marker = new google.maps.Marker({
        position: result[0].geometry.location,
        map: map
      });
    } else {
      alert('エラーです!');
    }
  }
}

現在地のマップを表示

javascript
var googleMap = {
  init: function() {
    var self = this;
    var latlng = new google.maps.LatLng(35.66, 139.69);
    var options = {
      zoom: 15,
      center: latlng,
      mapTypeId: 'roadmap'
    }
    var map = new google.maps.Map(document.getElementById('map'), options);
    self.currentPosition(map)
  },
  currentPosition: function(map) {
    if (navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(function(position) {
        map.setCenter(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));
      }, function() {
        alert('現在地を取得できません。')
      });
    } else {
      alert('ブラウザが対応していません!')
    }
  }
}

現在地のMapにアイコン表示

アイコンはデザインしたものを配置

javascript
var googleMap = {
  init: function() {
    var self = this;
    var latlng = new google.maps.LatLng(35.66, 139.69);
    var options = {
      zoom: 15,
      center: latlng,
      mapTypeId: 'roadmap'
    }
    var map = new google.maps.Map(document.getElementById('map'), options);
    self.currentPosition(map)
  },
  currentPosition: function(map) {
    if (navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(function(position) {
        map.setCenter(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));
        const marker = new google.maps.Marker({
          position: map.getCenter(),
          map: map,
          icon: new google.maps.MarkerImage(
            '/user.svg',
            new google.maps.Size(50, 50), // Size
            new google.maps.Point(0, 0), // origin
            new google.maps.Point(25, 25), // anchor
            new google.maps.Size(100, 100) // scaledSize
          )
        });
      }, function() {
        alert('現在地を取得できません。')
      });
    } else {
      alert('ブラウザが対応していません!')
    }
  }
}

マーカーの色を指定

javascript
var googleMap = {
  init: function() {
    var self = this;
    var latlng = new google.maps.LatLng(35.66, 139.69);
    var options = {
      zoom: 15,
      center: latlng,
      mapTypeId: 'roadmap'
    }
    var map = new google.maps.Map(document.getElementById('map'), options);
    self.currentPosition(map)
  },
  currentPosition(map) {
    if (navigator.geolocation) {
      navigator.geolocation.getCurrentPosition(function(position) {
        map.setCenter(new google.maps.LatLng(position.coords.latitude, position.coords.longitude));
        const pinColor = '0068B7'; // マーカーの色を指定
        const pinImage = new google.maps.MarkerImage('http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=%E2%80%A2|' + pinColor)
        const marker = new google.maps.Marker({
          position: map.getCenter(),
          map: map,
          icon: pinImage
        });
      }, function() {
        alert('現在地を取得できません');
      });
    } else {
      alert('ブラウザが対応していません。');
    }
  }
}

参考

20
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
29