SW/map

GoogleMap API 사용

실행컨텍스트 2023. 2. 14. 21:56

google Map을 사용한 장소 검색 및 마커 표시하는 기능을 추가하려고 한다.    

<input ref="mapSearchBox" type="text" placeholder="Search for address" v-model="searchText" />
<button type="button" @click="setList"> search </button>

 

   DOM이 마운트 되고 나서  google.maps.places.PlacesService과 input을 연결해주었다. 
 

 

 

처음엔  google.maps.places.AutocompleteService를 사용해서 했다가 list에 나온 장소들이 지도에 마커되는 걸 보고 

google.maps.places.SearchBox를 사용해서 첫번째 장소만 지도에 마커 되도록 했다. 

https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete 에서 검색시 보여지는 autocomplete 의 화면

하지만 이것도 내가 구현해야 되는 기능은 아니었다. 

 

 

 

 

그래서 인터넷 검색을 통해서  findPlaceFromQuery 를 사용하기로 했다. 

 

PlacesService class 에서  findPlaceFromQuery

 

Places Service  |  Maps JavaScript API  |  Google Developers

textSearch textSearch(request, callback) Return Value:  None Retrieves a list of places based on a query string (for example, "pizza in New York", or "shoe stores near Ottawa"). Location parameters are optional; when the location is specified, results are

developers.google.com

 

 

이제 입력하는 순간마다 autocomplete api를 날리지 않고, 내가 원할때마다 검색이 가능했다. 

 

여기서 만난 문제점은 결과값이 1개만 날아온다 ㅜ 

 

난 여러개 값이 뜨는 list가 필요했는데  

 

다시 또 인터넷 검색을 통해 알아낸 사실은 여러개의 결과 값을 받고 싶으면 nearbySearch 나 textSearch 를 써야 했다.

 

 

textSearch 를 사용했다. 

검색한 주소와 연관된 장소들이 리스트로 왔다. 

 

 

 그 외에도 작업하면서  geometry의 하위에 location과 viewport가 있는데 

콘솔에서 찍어 보면 locationdml lat(),lng()는 function이라고만 되어 있고 값은 보이지 않았다. 

 viewport  Ga:hi lo  zb: hi lo 항목으로 위도 경도 값이 표시되길래 이걸 써야 되나 고민을 했었다. 

 

하지만  function을 그대로 받아 쓰면 되었다. 

 const marker ={
    lat: item.geometry.location.lat(),
    lng: item.geometry.location.lng(),
}​
 
 
 
 
요약하자면 
 
  • findPlaceFromQuery 1개의 결과만 돌려준다.
  • textSearch를 쓸 경우에 여러개의 결과를 돌려준다.
  • searchBox를 쓸 경우엔 autocomplete와 같은 검색어가 변경될때마다 하단에 자동 완성된 리스트가 뜬다.
  • 차이점은 searchBox는 0번째에 지도 마커, autocomplete는 리스트에 뜬 모두에게 마커

 

참고 ) 구글 공식 문서

https://developers.google.com/maps/documentation/javascript/reference/places-service?hl=ko#PlacesService.nearbySearch