ReactでGoogleMapsAPI を使用した簡単なお店情報検索機能を作成してみる。(1)

#はじめに
おはようございます。**ふで ばこ**です。
以前にGoogleMapsAPIを色々使用したことがあるのですが、お店情報とかも取得できるなんて便利すぎないか？とその時かなり感動したんですよ。Googleさん、ありがとう、ってかなり思いました。最近になってQiitaに投稿することを始めたので、せっかくの機会だと思って、GoogleMapsAPIを使った簡単な機能を作ってまとめておいたら後から思い出すとき便利なんじゃないかと思い、作ってまとめてみました。
長いので2回に分けて書きます。

##Github
以下のURLからクローンしていただけると便利です。

```
git clone https://github.com/Kota-Yamaguchi/StoreSearch.git
```

本名が見えるけどあまり気にしていません。

#環境構築
何はともあれ、まずはdocker-composeを使用して、Reactの環境を構築してみます。
以下にDockerfileとdocker-compose.ymlの中身について記載します。以下のファイルたちを同じディレクトリにおいてください。

``` ruby:Dockerfile
FROM node:14.8.0  
WORKDIR /usr/src/frontend
```

```ruby:docker-compose.yml
version: '3'

services:
  #Node 
  node:
     build:
       context: .
       dockerfile: Dockerfile
     volumes:
      - ./frontend:/usr/src/frontend
     command: sh -c "yarn global add create-react-app ; create-react-app storesearch ; yarn add google-maps-react @material-ui/core @material-ui/icons react-router-dom react-geocode; cd storesearch ; cd storesearch && yarn start"
     ports:
      - "3000:3000"
```

では以下のコマンドでコンテナを起動してみましょう

```ruby:terminal
$ docker-compose up
```
起動が完了したら、Reactが思ったように起動しているか確認するために以下にアクセスしてみましょう
http://localhost:3000

起動していれば以下のような画面が出てくると思います。出てきていれば、Reactの開発環境は完成です。Dockerとても便利だ。
![スクリーンショット 2021-03-22 22.31.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/d1ca7f2c-84e8-4f4b-659a-15c7bbf5c200.png)

確認できたら```Ctrl+C```などで切断しておきましょう。


#GoogleMapsAPIを使用する準備
それでは次はGoogleMapsAPIを使用するためにいくつかGoogleCloudPlatformで色々やっておかないといけない手順があります。
それではやっていきましょう。
まずは以下にアクセスしてください。

**Google Cloud**
https://cloud.google.com/

1.この中でコンソールを押してください。

![スクリーンショット 2021-03-22 22.41.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/e5d69da2-1ca3-1408-78ea-0a6d90b49dcf.png)

2.「新規のプロジェクト選択」があると思うので、そこを押してください。自分のプロジェクト名が出ているのでぼかしています。
![スクリーンショット 2021-03-22 22.37.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/0b69e76f-0653-e00e-13db-687e7a25f177.png)

3.以下の画面で出てくるので、「新しいプロジェクト」を押してください
![スクリーンショット 2021-03-22 22.57.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/26d9c00a-734e-ef4c-3044-f0f62ace5af3.png)

4.**Places API、Geocodeing API, Maps JavaScript API**　を検索してそれぞれのAPIを有効にしてください
![スクリーンショット 2021-03-22 23.02.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/9e74c3e1-0f9c-85d2-fa93-73c49b855d92.png)

5.あとはAPIキーを作成しましょう。メニューバーの「APIとサービス」から、「認証情報」を押して下さい。

![スクリーンショット 2021-03-22 23.16.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/82750637-5645-6a01-f80f-e63804aa40a5.png)

6.以下の図のような画面が出たら、「認証情報の作成」を押して、そのあと「APIキーの作成」を押して下さい。
![スクリーンショット 2021-03-22 23.21.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/4ea7c9f1-bb1b-0250-9026-049817f13d3f.png)


7.以下のような画面が出てくるので、「キーを制限」を押してAPIキーを制限しましょう。APIキーはAPIを使用するときに必要なので、あとで使うことを覚えておいて下さい。
![スクリーンショット 2021-03-22 23.23.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/6b60c003-a83d-0e0d-915e-7819ad1b6b8a.png)


8.**Places API、Geocodeing API, Maps JavaScript API**　を制限に加えて保存して下さい。これでGoogleMapsAPIを使用する準備は完了です。
![スクリーンショット 2021-03-22 23.24.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/0600f9f4-b2fc-d434-06af-9fd4910cc6e2.png)

#コードの準備

今回はReactアプリを作るのにフレームワークのmaterial-uiを使用します。
GoogleMapsAPIを使用するのには、google-maps, react-geocodeを使用します。
今後、何かアプリを拡張していくことも考えて、react-router-domも入れておきます。
これらのインストールは全部docker-compose起動時にインストールしています。

コードの内容は全て載せませんが、Githubを上げておきますので気になる方はクローンして下さい。以下です。
https://github.com/Kota-Yamaguchi/StoreSearch.git

ではまず
ディレクトリの構成をみてみましょう
* がついているところは追加　or　修正が入っています。 

```ruby:tree
storesearch/src
├── App.css
├── App.js
├── App.test.js
├── GoogleMap
│   └── Googlemap.js *
├── HOME.js *
├── Store
│   ├── PlacesApi.js *
│   └── StoreDetail.js *
├── index.css
├── index.js *
├── logo.svg
├── reportWebVitals.js
├── setupTests.js
└── util
    └──  Header.js *
storesearch/public
├── favicon.ico
├── index.html * 
├── logo192.png
├── logo512.png
├── manifest.json
└── robots.txt

```
まずはpublic/index.htmlのなかに以下の文の中にAPIキーを書き込んで保存して下さい。
これでPlacesAPIが使用可能になります。

```
<script src="https://maps.google.com/maps/api/js?v=3.33&key={yourAPIkey}&libraries=places"></script> 
```

その後に、GoogleMap.jsの中身のでも [*******]になっているところにAPIキーを書き込んで保存して下さい。
コードの解説は次回にします。

```ruby:GoogleMap.js

import React, { Component } from 'react';
import { GoogleApiWrapper, Map, Marker } from 'google-maps-react';
import Geocode from "react-geocode";
class GoogleMap extends Component {
	constructor(props) {
		super(props);
		this.state = {
			lat: 140,
			lng: 35,
		}

	};

	componentDidUpdate(nextProps) {

		if (nextProps.adrress !== this.props.adrress) {
			Geocode.setLanguage("ja");
			Geocode.fromAddress(this.props.adrress).then(
				response => {
					var { lat, lng } = response.results[0].geometry.location;
					console.log(lat, lng);
					this.setState({
						lat: lat,
						lng: lng,
					})
				},
				error => {
					console.error(error);
				}
			);
		
			return true;
		} else {
			return false;
		}

	}

	componentDidMount() {
		Geocode.setApiKey("**********************");
		navigator.geolocation.getCurrentPosition((position) => {
			this.setState({
			  lat: position.coords.latitude,
			  lng: position.coords.longitude
			});
			console.log(position.coords);
		  },
		  (err) => {
			console.log(err);
		  })
		
		
	}
	render() {

		const containerStyle = {
			width: '50vw',
			height: '50vh',
			position: "relative"
		}

		return (

			<Map
				containerStyle={containerStyle}
				google={this.props.google}
				zoom={40}
				center={{ lat: this.state.lat, lng: this.state.lng }}
				initialCenter={{ lat: this.state.lat, lng: this.state.lng }}
			>
				<Marker
					title={"目的地"}
					position={{ lat: this.state.lat, lng: this.state.lng }}
				/>

				

			</Map>

		);
	}
}

export default GoogleApiWrapper({
	apiKey: ("*************************")
})(GoogleMap);
```


それでは起動してみましょう
クローンしてくださっている方はクローンした後にディレクトリ入っていただいて下記を実行して下さい

``` ruby:terminal 

docker-compose up 
```

これで起動が完了しているはずなので、以下にアクセスして下さい
http://localhost:3000/storedetail

すると以下の画面が出てくると思います。
![スクリーンショット 2021-03-23 22.18.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/0d95070c-c103-23d4-81e3-3e1af32935f8.png)

簡単にアプリの説明すると、開いたときには現在地のマップが表示されます。現在地の取得を許可していないときには、灰色の画面が出てくるだけになると思います。許可してもしなくてもいいです。お店検索欄にお店の名前を入力すると、お店の名前と住所と写真、地図情報が更新されます。
それだけのアプリです。

では、お店検索の検索欄があると思うのですが、そこに検索したいお店を入力してください。
ここでは、僕が美味しいと思うコーヒーショップの**UNLIMITED COFFEE BAR**を検索してみたいと思います。
![スクリーンショット 2021-03-23 22.39.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376115/ba9d20fd-395e-8b7b-bf4a-0813ae456542.png)

これで完成です。簡単ですが、よく使えるものなのでどうぞ使って下さい。
ちなみにこのお店とても美味しいので、コロナが落ち着いたりしたら行ってみて下さい。

# 終わりに
お店の情報をまとめたDBを作ったりせずともこのようにGoogleMapsAPIはお店情報からマップ情報まで取得できてしまう素晴らしいAPIです。
次回はコードの解説をチラッとします。

#次回記事

ReactでGoogleMapsAPI を使用した簡単なお店情報検索機能を作成してみる。(2)
https://qiita.com/hudebakononaka/items/b88db913652ac6a6b3f6