Przejście na nową wyszukiwarkę miejsc

Na tej stronie znajdziesz wyjaśnienie różnic między funkcjami wyszukiwania miejsc opartymi na tekście w klasie Place (nowej) i PlacesService (starszej) oraz fragmenty kodu do porównania.

Starsza wersja PlacesService ma te metody wyszukiwania oparte na tekście:

  • Metoda findPlaceFromQuery(), która przyjmuje zapytanie tekstowe i zwraca pojedynczy wynik miejsca, a także obsługuje pola danych o miejscach.
  • Metoda findPlaceFromPhoneNumber(), która umożliwia wyszukiwanie miejsca za pomocą numeru telefonu i obsługuje pola danych o miejscach.
  • Metoda textSearch(), która przyjmuje zapytanie tekstowe i zwraca listę wyników wyszukiwania. textSearch() jest starszy i nie obsługuje pól danych miejsc.

Nowa klasa Place udostępnia metodę Place.searchByText(), która umożliwia wyszukiwanie miejsc za pomocą zapytania tekstowego lub numeru telefonu. Pozwala też dostosowywać wyszukiwania za pomocą rozszerzonego wyboru regularnie aktualizowanych pól danych o miejscach i typów miejsc.

W tabeli poniżej wymieniono niektóre główne różnice w metodach wyszukiwania miejsc między klasą PlacePlacesService:

PlacesService (starsza wersja) Place (nowy)
findPlaceFromQuery()
findPlaceFromPhoneNumber()
searchByText()
FindPlaceFromQueryRequest
FindPlaceFromPhoneNumberRequest
SearchByTextRequest
Ograniczone opcje zapytań. Więcej opcji zapytań.
Wymaga użycia funkcji wywołania zwrotnego do obsługi obiektu wyników i odpowiedzi google.maps.places.PlacesServiceStatus. Korzysta z obietnic i działa asynchronicznie.
Wymaga sprawdzenia PlacesServiceStatus. Nie wymaga sprawdzania stanu, może używać standardowej obsługi błędów.
Obsługuje tylko ustawienie „preferowanie lokalizacji”. Obsługuje ustawienie preferencji lokalizacji i ograniczenia dotyczące lokalizacji.
Pola danych o miejscach są sformatowane w sposób snake case. Pola danych o miejscach są sformatowane w sposób odwróconego kasztana.
Zwraca wynik dotyczący pojedynczego miejsca. Zwraca maksymalnie 20 wyników.
Ograniczone do stałego zbioru typów miejsc i pol danych o miejscach. Udostępnia rozszerzony wybór regularnie aktualizowanych typów miejsc oraz pól danych o miejscach.
textSearch()
searchByText()
Zwraca wszystkie dostępne pola danych (podzbiór obsługiwanych pól); nie można ograniczyć go do określonych pól. Zwraca tylko żądane pola danych o miejscu.

Porównanie kodu

W tej sekcji porównujemy kod metod wyszukiwania tekstu, aby zilustrować różnice między usługą Places i klasą Place. Fragmenty kodu pokazują kod wymagany w każdym z tych interfejsów API, aby przesłać żądanie wyszukiwania tekstowego.

Usługa Miejsca (starsza wersja)

Poniższy fragment kodu pokazuje, jak za pomocą metody findPlaceFromQuery() można wyszukiwać miejsca. Żądanie jest synchroniczne i zawiera sprawdzenie warunkowe PlacesServiceStatus. Wymagane pola danych o miejscu są określone w ciele żądania, które jest definiowane przed wysłaniem żądania.

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);
    }
  });
}

Więcej informacji

Wyszukaj tekst (nowa funkcja)

Poniższy fragment kodu pokazuje, jak za pomocą metody searchByText() wyszukiwać miejsca. Żądanie jest asynchroniczne i nie wymaga sprawdzania stanu (można użyć standardowego sposobu obsługi błędów). W tym przykładzie żądanie zawiera parametr maxResultCount o wartości 8 (wartość musi się mieścić w przedziale od 1 do 20). Ta funkcja przechodzi przez wyniki i dodaje znacznik dla każdego z nich, dostosowując granice mapy na podstawie położenia znaczników. Metoda searchByText() używa operatora await, dlatego można jej używać tylko wewnątrz funkcji 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");
  }
}

Metoda searchByText() obsługuje znacznie więcej opcji żądania niż poprzednia wersja, w tym:

  • includedType, która pozwala ograniczyć wyszukiwanie do określonego typu miejsca.
  • isOpenNow, która pozwala ograniczyć wyszukiwanie do miejsc, które są otwarte.
  • minRating, która pozwala odfiltrować wyniki poniżej określonego limitu (np. tylko miejsca z trzy lub więcej gwiazdkami).
  • locationRestriction, który pomija wyniki spoza określonej lokalizacji (obsługiwany jest też parametr locationBias).

Więcej informacji