Cómo migrar a la nueva experiencia de Place Search

En esta página, se explican las diferencias entre las funciones de búsqueda de lugares basadas en texto en la clase Place (nueva) y la PlacesService (heredada), y se proporcionan algunos fragmentos de código para compararlos.

El PlacesService heredado tiene los siguientes métodos de búsqueda basados en texto:

  • El método findPlaceFromQuery(), que toma una consulta de texto y muestra un resultado de un solo lugar, y admite el uso de campos de datos de lugares.
  • El método findPlaceFromPhoneNumber(), que te permite buscar un lugar con un número de teléfono y admite el uso de campos de datos de lugares.
  • El método textSearch(), que toma una búsqueda de texto y muestra una lista de resultados de lugares. textSearch() es más antiguo y no admite el uso de campos de datos de lugares.

La nueva clase Place ofrece el método Place.searchByText(), que te permite buscar lugares con una búsqueda de texto o un número de teléfono, y personalizar tus búsquedas con una selección expandida de campos de datos de lugares y tipos de lugares actualizados periódicamente.

En la siguiente tabla, se enumeran algunas de las diferencias principales en los métodos de búsqueda de lugares entre la clase Place y PlacesService:

PlacesService (heredada) Place (nuevo)
findPlaceFromQuery()
findPlaceFromPhoneNumber()
searchByText()
FindPlaceFromQueryRequest
FindPlaceFromPhoneNumberRequest
SearchByTextRequest
Opciones de consulta limitadas. Opciones de consulta más amplias.
Requiere el uso de una devolución de llamada para controlar el objeto de resultados y la respuesta google.maps.places.PlacesServiceStatus. Usa promesas y funciona de forma asíncrona.
Requiere una verificación de PlacesServiceStatus. No se requiere verificación de estado, se puede usar el manejo de errores estándar.
Solo admite sesgo de ubicación. Admite el sesgo de ubicación y la restricción de ubicación.
Los campos de datos de Place tienen el formato de escritura en mayúsculas y minúsculas. Los campos de datos de Place tienen el formato de mayúsculas y minúsculas intercaladas.
Muestra un solo resultado de lugar. Devuelve hasta 20 resultados de lugares.
Se limita a un conjunto fijo de tipos de lugares y campos de datos de lugares. Proporciona una selección expandida de tipos de lugares y campos de datos de lugares actualizados periódicamente.
textSearch()
searchByText()
Muestra todos los campos de datos disponibles (un subconjunto de los campos admitidos). No se puede limitar a campos específicos. Muestra solo los campos de datos de lugares solicitados.

Comparación de código

En esta sección, se compara el código de los métodos de búsqueda de texto para ilustrar las diferencias entre el servicio de Places y la clase Place. Los fragmentos de código muestran el código requerido en cada API respectiva para realizar una solicitud de búsqueda basada en texto.

Servicio Places (heredado)

En el siguiente fragmento de código, se muestra cómo usar el método findPlaceFromQuery() para buscar un lugar. La solicitud es síncrona y, además, incluye una verificación condicional en PlacesServiceStatus. Los campos de datos de lugares necesarios se especifican en el cuerpo de la solicitud, que se define antes de realizar la solicitud real.

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

Más información

Text Search (nueva)

En el siguiente fragmento de código, se muestra cómo usar el método searchByText() para buscar lugares. La solicitud es asíncrona y no requiere una verificación de estado (se puede usar el manejo de errores estándar). En este ejemplo, la solicitud incluye un maxResultCount de 8 (el valor debe estar entre 1 y 20). Esta función recorre los resultados y agrega un marcador para cada uno, ajustando los límites del mapa según la posición de los marcadores. Debido a que el método searchByText() usa el operador await, solo se puede usar dentro de una función 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");
  }
}

El método searchByText() admite muchas más opciones de solicitud en comparación con la versión anterior, incluidas las siguientes:

  • includedType, que te permite restringir las búsquedas a un tipo de lugar específico.
  • isOpenNow, que te permite restringir las búsquedas para que solo muestren lugares que estén abiertos.
  • minRating, que te permite filtrar los resultados por debajo del límite especificado (por ejemplo, solo mostrar lugares con tres estrellas o más).
  • locationRestriction, que omite los resultados fuera de la ubicación especificada (también se admite locationBias).

Más información