0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Vue CLIでGoogle Maps APIを使う

Last updated at Posted at 2023-03-10

Vue CLIを使ったWEBアプリ開発の中でGoogle Maps APIを利用したのでそのメモです。
(韓国アイドルのSEVENTEENが日本で訪れた場所を地図に表示する趣味全開のアプリです🫠)

⏬GitHubはこちらから

💎 環境

Vue(2.6.14)
Google Maps API(1.1.1)

APIキーは事前に取得しているものとします

💎 アプリ画面

💎 コード

※関係する部分のみ

component.vue
<template>
    <div>
		<div id="google-map" class="google-map" ref="googleMap">
            <!-- Google Map表示 -->
        </div>
    </div>
</template>

<script>
import GoogleMapsApiLoader from 'google-maps-api-loader';

export default {
    data: () => {
        return {
            google: null,
            map: null,
            geocoder: null,
            // Markerを複数表示するので、配列に入れていきます
            marker: [],
            // オリジナルのアイコン画像
            iconImg: '/images/diamond-shadow.png',
            // 初期設定
            mapConfig: {
                // 初期表示のズーム具合
                zoom: 14,
                // 初期表示のセンター
                center: {
                    lat: 35.6596043,
                    lng: 139.6987104
                },
                // デフォルトUIを無効にする
                disableDefaultUI: true,
                styles: [
                    /* Google mapカスタムのスタイル() */
                ]
            },
        }
    },
    async mounted() {
        // Google Map APIの読み込み
        const apiKey = process.env.VUE_APP_GOOGLE_MAPS_API_KEY;
        const googleMapApi = await GoogleMapsApiLoader({
        apiKey: apiKey
        });
        this.google = googleMapApi;

        this.initializeMap();
        this.createMarkers();
		
    },
    methods: {
        initializeMap() {
            const mapContainer = document.getElementById('google-map');
            this.map = new this.google.maps.Map(
                mapContainer, this.mapConfig
        )},
        // Markerを作成する関数
        createMarkers() {
            // displayingPlaceListの要素数だけ繰り返し
            for (let i = 0; i < this.displayingPlaceList.length; i++) {
                // もしlatlngの値が無い場合、Markerを作成しない
                if( this.displayingPlaceList[i]['lat'] != null && this.displayingPlaceList[i]['lng'] != null ) {
                    const markerLatLng = new this.google.maps.LatLng({
                        // それぞれのlatlngを設定
                        lat: this.displayingPlaceList[i]['lat'],
                        lng: this.displayingPlaceList[i]['lng']
                    });
                    // Markerを作成する
                    this.marker[i] = new this.google.maps.Marker({
                        position: markerLatLng,
                        map: this.map,
                        icon: {
                            url: this.iconImg,
                            scaledSize: new this.google.maps.Size(40, 40),
                        }
                    });
                    // それぞれのMarkerに合った情報ウィンドウを作成するために必要情報を渡す
                    this.markerInfoWindow(this.marker[i],this.displayingPlaceList[i]['id'], this.displayingPlaceList[i]['placeName']);
                }
            }
        },
        // Markerの情報ウィンドウを作成する関数
        markerInfoWindow(marker,id, name) {
            let infoWindow = new this.google.maps.InfoWindow({
                content: `<v-card class="custom-info-window">
                        <v-list-item-title class="text-subtitle-1 font-weight-medium mx-1">${name}</v-list-item-title>
                        </v-card>`,
            });
            // マウスが乗ったら表示
            this.google.maps.event.addListener(marker, 'mouseover', () => {
                infoWindow.open(this.map, marker);
            });
            // マウスが外れたら閉じる
            this.google.maps.event.addListener(marker, 'mouseout', () => {
                infoWindow.close();
            });
            // (クリックされたらダイアログを開く)
            this.google.maps.event.addListener(marker, 'click', () => {
                this.isDialog = true;
                this.setSelectedPlaceID(id);
            });
        },
    }
}
</script>

<style lang="scss" scoped>

// width, height設定しないと地図が表示されませんでした。
.google-map {
  width: 100vw;
  height: 100vh;
}
</style>

place-list.json
place-list.json
[
  {
    "id": 1001,
    "placeName": "三井住友銀行渋谷支店前",
    "placeCategory": "roadside",
    "address": "東京都渋谷区宇田川町20-2",
    "lat": 35.6608601,
    "lng": 139.700261,
    "image": {
      "imageSrc": "/images/1001.jpeg",
      "imageRef": "twitter"
    },
    "members": [
      "Jeonghan"
    ]
  },
  {
    "id": 1002,
    "placeName": "とんかつ檍大門店",
    "placeCategory": "restaurant",
    "address": "東京都港区浜松町1-11-12",
    "lat": 35.6588233,
    "lng": 139.755709,
    "image": {
      "imageSrc": "/images/1002.jpeg",
      "imageRef": "twitter"
    },
    "members": [
      "Seungkwan"
    ]
  },
...
]

💎 メモ

読み込み

Google Maps API の読み込みはVue.jsの公式ドキュメントを参考にしました。

API Keyを環境変数に設定する

API keyは環境変数で設定して読み込むことで、GitHubで公開した時に隠せます。(私は最初、コード内にバリバリ書いたまま公開してしまいました😇。Googleが警告メールを送ってくれたので気づけました。)
参考サイト⏩ Qiita Vue CLIを用いた環境変数の設定方法

※公開してしまった場合、リポジトリを新しく作ってcommit履歴を引き継がないように複製して解決させました。
加えて、API keyも再生成しました。
参考サイト⏩ 【Git】リポジトリをコミット履歴の引継ぎなしで複製する方法!

styleのカスタム

※今回はjsonをvueファイルに直接コピペしましたが、別ファイルに切り取った方が見やすいです。
参考サイト⏩【Google Maps API】地図デザインの変更と「Styling Wizard」の使い方
カスタムに使ったサイト⏩ Styling Wizard

MapのデフォルトUIを無効にする

ズームコントロールやストリートビューコントロールなど、地図の上下左右端に出てくるコントロール類を纏めて非表示にします。
参考サイト⏩コントロール | Google Maps Platform

情報ウィンドウ

Markerにホバーした時、該当場所の名前が小さいウィンドウで表示されるようにします。
複数Markerがあり、クリック時にダイアログで詳細情報を開きたいため、引数で「場所のID」と「場所の名前」も渡し、Markerアイコンと該当場所の情報を紐づけました。
参考サイト1⏩情報ウィンドウ | Google Maps Platform
参考サイト2⏩Google Maps APIを使ってマーカー(ピン)に吹き出しを追加しよう!

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?