새 장소 검색으로 이전

이 페이지에서는 Place 클래스 (신규)와 PlacesService(기존)의 텍스트 기반 장소 검색 기능의 차이점을 설명하고 비교할 수 있는 몇 가지 코드 스니펫을 제공합니다.

기존 PlacesService에는 다음과 같은 텍스트 기반 검색 메서드가 있습니다.

  • 텍스트 쿼리를 받아 단일 장소 결과를 반환하고 장소 데이터 필드 사용을 지원하는 findPlaceFromQuery() 메서드
  • 전화번호를 사용하여 장소를 검색하고 장소 데이터 필드 사용을 지원하는 findPlaceFromPhoneNumber() 메서드입니다.
  • 텍스트 쿼리를 받아 장소 결과 목록을 반환하는 textSearch() 메서드 textSearch()는 이전 버전이며 장소 데이터 필드 사용을 지원하지 않습니다.

Place 클래스는 Place.searchByText() 메서드를 제공합니다. 이 메서드를 사용하면 텍스트 쿼리 또는 전화번호를 사용하여 장소를 검색하고 정기적으로 업데이트되는 다양한 장소 데이터 필드 및 장소 유형을 사용하여 검색을 맞춤설정할 수 있습니다.

다음 표에는 Place 클래스와 PlacesService의 장소 검색 메서드 간의 주요 차이점이 나와 있습니다.

PlacesService (기존) Place (신규)
findPlaceFromQuery()
findPlaceFromPhoneNumber()
searchByText()
FindPlaceFromQueryRequest
FindPlaceFromPhoneNumberRequest
SearchByTextRequest
제한된 쿼리 옵션 더 광범위한 검색 옵션
결과 객체와 google.maps.places.PlacesServiceStatus 응답을 처리하려면 콜백을 사용해야 합니다. Promise를 사용하며 비동기식으로 작동합니다.
PlacesServiceStatus 검사가 필요합니다. 필수 상태 검사가 없으며 표준 오류 처리를 사용할 수 있습니다.
위치 편향만 지원합니다. 위치 편향 및 위치 제한을 지원합니다.
장소 데이터 필드의 형식은 스네이크 표기법을 사용합니다. 장소 데이터 필드의 형식은 케멜케이스를 사용합니다.
단일 장소 결과를 반환합니다. 최대 20개의 장소 결과를 반환합니다.
고정된 장소 유형장소 데이터 필드 집합으로 제한됩니다. 정기적으로 업데이트되는 장소 유형장소 데이터 필드의 확장된 선택을 제공합니다.
textSearch()
searchByText()
사용 가능한 모든 데이터 필드 (지원되는 필드의 하위 집합)를 반환합니다. 특정 필드로 제한할 수 없습니다. 요청된 장소 데이터 필드만 반환합니다.

코드 비교

이 섹션에서는 텍스트 검색 메서드의 코드를 비교하여 장소 서비스와 장소 클래스의 차이점을 보여줍니다. 코드 스니펫은 텍스트 기반 검색 요청을 실행하는 데 각 API에 필요한 코드를 보여줍니다.

장소 서비스 (기존)

다음 코드 스니펫은 findPlaceFromQuery() 메서드를 사용하여 장소를 검색하는 방법을 보여줍니다. 요청은 동기식이며 PlacesServiceStatus에 대한 조건부 검사를 포함합니다. 필요한 장소 데이터 필드는 실제 요청을 실행하기 전에 정의된 요청 본문에 지정됩니다.

function findPlaces() {
  const request = {
    query: "Museum of Contemporary Art Australia",
    fields: ["name", "geometry"],
  };

  // Create an instance of PlacesService.
  service = new google.maps.places.PlacesService(map);

  // Make a findPlaceFromQuery request.
  service.findPlaceFromQuery(request, (results, status) => {
    let place = results[0];
    if (status === google.maps.places.PlacesServiceStatus.OK && results) {
      if (!place.geometry || !place.geometry.location) return;

      const marker = new google.maps.Marker({
        map,
        position: place.geometry.location,
      });
      map.setCenter(place.geometry.location);
    }
  });
}

자세히 알아보기

텍스트 검색(신규)

다음 코드 스니펫은 searchByText() 메서드를 사용하여 장소를 검색하는 방법을 보여줍니다. 요청은 비동기이며 상태 확인이 필요하지 않습니다(표준 오류 처리를 사용할 수 있음). 이 예시에서 요청에는 maxResultCount 8이 포함됩니다 (값은 1~20 사이여야 함). 이 함수는 결과를 반복하고 각 결과에 마커를 추가하여 마커의 위치를 기반으로 지도 경계를 조정합니다. searchByText() 메서드는 await 연산자를 사용하므로 async 함수 내에서만 사용할 수 있습니다.

async function findPlaces() {
  // Define a request.
  // The `fields` property is required; all others are optional.
  const request = {
    fields: ["displayName", "location", "businessStatus"],
    textQuery: "Tacos in Mountain View",
    includedType: "restaurant",
    locationBias: { lat: 37.4161493, lng: -122.0812166 },
    isOpenNow: true,
    language: "en-US",
    maxResultCount: 8,
    minRating: 3.2,
    region: "us",
    useStrictTypeFiltering: false,
  };

  // Call searchByText passing the request.
  const { places } = await google.maps.places.Place.searchByText(request);

  // Add a marker for each result.
  if (places.length) {
    const bounds = new google.maps.LatLngBounds();

    places.forEach((place) => {
      const markerView = new google.maps.marker.AdvancedMarkerElement({
        map,
        position: place.location,
        title: place.displayName,
      });

      bounds.extend(place.location);
      console.log(place);
    });
    map.fitBounds(bounds);
  } else {
    console.log("No results");
  }
}

searchByText() 메서드는 다음을 비롯하여 이전 버전보다 더 많은 요청 옵션을 지원합니다.

  • includedType: 검색을 특정 장소 유형으로 제한할 수 있습니다.
  • isOpenNow: 영업 중인 장소만 반환되도록 검색을 제한할 수 있습니다.
  • minRating: 지정된 한도 미만의 결과를 필터링할 수 있습니다 (예: 별 3개 이상인 장소만 반환).
  • locationRestriction: 지정된 위치 외부의 결과를 생략합니다(locationBias도 지원됨).

자세히 알아보기