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 o miejscach.

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 tej tabeli opisano niektóre z głównych różnic między metodami wyszukiwania miejsc w klasie Place a klasie PlacesService:

PlacesService (starsza wersja) Place (Nowy)
findPlaceFromQuery()
findPlaceFromPhoneNumber()
searchByText()
FindPlaceFromQueryRequest
FindPlaceFromPhoneNumberRequest
SearchByTextRequest
Ograniczone opcje zapytań. Więcej opcji zapytań.
Wymaga użycia 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 uczenie z uwzględnieniem lokalizacji. Obsługuje ustawienie preferencji lokalizacji i ograniczenia dotyczące lokalizacji.
Pola danych miejsca są sformatowane w sposób snake case. Pola danych o miejscach są sformatowane w stylu „camel case”.
Zwraca wynik dotyczący pojedynczego miejsca. Zwraca do 20 wyników wyszukiwania miejsc.
Ograniczone do stałego zbioru typów miejsc i pol danych o miejscach. Zapewnia większą liczbę 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 odpowiednich 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 miejsca 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 umożliwia odfiltrowanie wyników poniżej określonego limitu (np. zwracanie tylko miejsc z 3 gwiazdkami lub więcej).
  • locationRestriction, który pomija wyniki spoza określonej lokalizacji (obsługiwany jest też parametr locationBias).

Więcej informacji