Nuxt.js에서 Google Places API 결과를 Google Map에 반영

14012 단어 nuxt.jsGoogleMapsAPI

개요



Nuxt.js에서 현재 위치의 Google Map을 표시한 후 Google Places API에서 다양한 상점 정보를 반영하는 구현 예제를 제공합니다.

참고로 한 것 및 유의점


  • 이번에는 vue2-google-maps라는 라이브러리를 사용하고 있습니다. vue2-google-maps에 대해서는 @ 1 나카 무라nuxt.js & vue2-google-maps 내용을 참고하겠습니다.
  • vue2-google-maps에서 Google Maps API 라이브러리를 호출 할 때의 유의 사항은 vue google maps FAQ의 "Where is my google?"섹션을 참조합니다.
  • 현재 위치를 가져온 후 Google Maps가 로드되면 Google Places API를 호출합니다. 구현은 Google Maps로드 (보기) 완료 후 어떤 작업을 수행하는 방법 를 참고로 하고 있습니다.
  • Google Places API 호출에 대한 자세한 내용은 새 플랜의 Places API를 살펴 보았습니다.의 "NearBy Search"를 참조하십시오.

  • 샘플 소스



    MapComponent.vue
    <template>
      <div>
        <GmapMap
         :center="maplocation"
         :zoom="15"
         :draggable="true"
         map-type-id="roadmap"
         style="width: 500px; height: 300px"
         ref="mapRef"
        >
          <GmapMarker v-for="m in makers"
            :position="m.position"
            :title="m.title"
            :clickable="true"
            :draggable="false"
            :icon="m.icon"
            :key="m.id">
          </GmapMarker>
        </GmapMap>
      </div>
    </template>
    <script>
    export default {
      data() {
        return {
          maplocation:{lat:0, lng:0},
          makers:[]
        }
      },
      async mounted() {
        // 現在地の取得
        if (navigator.geolocation) {
          navigator.geolocation.getCurrentPosition(
            function(position){
              let coords = position.coords;
              // 緯度経度を取得
              this.maplocation.lat = coords.latitude;
              this.maplocation.lng = coords.longitude;
              // 地図読み込み完了時のイベント
              this.$gmapApiPromiseLazy().then(() => {
                google.maps.event.addListenerOnce(this.$refs.mapRef.$mapObject, 'idle',
                  function() { this.setPlaceMakers() }.bind(this)
                );
              });
            }.bind(this),
            function(error) {
              // エラーの場合は東京駅周辺に移動
              this.maplocation.lat = 35.6813092;
              this.maplocation.lng = 139.7677269;
            }
          );
        } else {
          // 現在地取得不可の場合は東京駅周辺に移動
          this.maplocation.lat = 35.6813092;
          this.maplocation.lng = 139.7677269;
        }
      },
      methods: {
        setPlaceMakers() {
          let map = this.$refs.mapRef.$mapObject
          let placeService = new google.maps.places.PlacesService(map);
          // Places APIのnearbySearchを使用する。
          placeService.nearbySearch(
            {
              location: new google.maps.LatLng(this.maplocation.lat, this.maplocation.lng),
              radius: 500,
              type: ['restaurant']
            },
            function(results, status) {
              if (status == google.maps.places.PlacesServiceStatus.OK) {
                results.forEach(place => {
                  // デフォルトのアイコンが大きめなので縮小
                  let icon = {
                    url: place.icon, // url
                    scaledSize: new google.maps.Size(30, 30), // scaled size
                    origin: new google.maps.Point(0,0), // origin
                    anchor: new google.maps.Point(0, 0) // anchor
                  };
                  let maker = {
                    position: place.geometry.location,
                    icon: icon,
                    title: place.name,
                    id: place.place_id
                  };
                  this.makers.push(maker);
                });
              }
            }.bind(this)
          );
        }
      }
    }
    </script>
    
    

    화면 표시



    API 획득이 성공하면 아래와 같은 느낌으로 Map이 표시됩니다.

    좋은 웹페이지 즐겨찾기