Новая версия текстового поиска

Выберите платформу: Android iOS JavaScript Web Service
Разработчики Европейской экономической зоны (ЕЭЗ)

Текстовый поиск (новый) принимает текстовый запрос и возвращает список соответствующих мест.

Текстовый поиск (новый) возвращает информацию о наборе мест на основе строки — например, «пицца в Нью-Йорке» или «обувные магазины около Оттавы» или «123 Main Street». Служба отвечает списком мест, соответствующих текстовой строке, и любым заданным смещениям местоположения. Текстовый поиск (новый) позволяет искать места по типу, фильтровать с использованием таких критериев, как часы работы и рейтинг, а также ограничивать или смещать результаты по определенному местоположению.

Чтобы использовать Text Search (New), необходимо включить "Places API (New)" в вашем проекте Google Cloud. Подробности см. в разделе Начало работы .

Найти места по текстовому запросу

Вызовите searchByText для возврата списка мест из текстового запроса или телефонного номера. Укажите параметры поиска с помощью запроса, а затем вызовите searchByText() . Результаты возвращаются в виде списка объектов Place , из которых можно получить сведения о месте . В следующем фрагменте показан пример запроса и вызова searchByText :

Машинопись

const request = {
    textQuery: 'Tacos in Mountain View',
    fields: ['displayName', 'location', 'businessStatus'],
    includedType: 'restaurant',
    locationBias: { lat: 37.4161493, lng: -122.0812166 },
    isOpenNow: true,
    language: 'en-US',
    maxResultCount: 8,
    minRating: 3.2,
    region: 'us',
    useStrictTypeFiltering: false,
};

//@ts-ignore
const { places } = await Place.searchByText(request);

JavaScript

const request = {
    textQuery: 'Tacos in Mountain View',
    fields: ['displayName', 'location', 'businessStatus'],
    includedType: 'restaurant',
    locationBias: { lat: 37.4161493, lng: -122.0812166 },
    isOpenNow: true,
    language: 'en-US',
    maxResultCount: 8,
    minRating: 3.2,
    region: 'us',
    useStrictTypeFiltering: false,
};
//@ts-ignore
const { places } = await Place.searchByText(request);
  • Укажите текстовый запрос или номер телефона для поиска с помощью параметра textQuery .
  • Используйте параметр fields (обязательно), чтобы указать список из одного или нескольких полей данных, разделенных запятыми, в верблюжьем стиле.
  • Используйте параметр includedType , чтобы вернуть только результаты указанного типа.
  • Используйте locationBias или locationRestriction , чтобы сместить или ограничить результаты текстового поиска определенным регионом.
Полный список объектов недвижимости см.

Если запрос содержит номер телефона, необходимо задать параметр региона. Например, если вы используете номер телефона для поиска места в Японии, а запрашиваемый домен — jp , необходимо задать параметр region на 'jp'. Если region не указан в запросе, API по умолчанию будет использовать регион США ('us').

Результаты возвращаются в виде списка объектов Place , из которого можно получить подробную информацию о месте .

Пример

В следующем примере searchByText используется для поиска ресторанов тако в окрестностях Маунтин-Вью, а карта заполняется маркерами для отображения результатов.

Машинопись

let map;
let center;

async function initMap() {
    const { Map } = await google.maps.importLibrary("maps") as google.maps.MapsLibrary;

    center = { lat: 37.4161493, lng: -122.0812166 };
    map = new Map(document.getElementById('map') as HTMLElement, {
        center: center,
        zoom: 11,
        mapId: 'DEMO_MAP_ID',
    });

    findPlaces();
}

async function findPlaces() {
    const { Place } = await google.maps.importLibrary("places") as google.maps.PlacesLibrary;
    const { AdvancedMarkerElement } = await google.maps.importLibrary("marker") as google.maps.MarkerLibrary;
    const request = {
        textQuery: 'Tacos in Mountain View',
        fields: ['displayName', 'location', 'businessStatus'],
        includedType: 'restaurant',
        locationBias: { lat: 37.4161493, lng: -122.0812166 },
        isOpenNow: true,
        language: 'en-US',
        maxResultCount: 8,
        minRating: 3.2,
        region: 'us',
        useStrictTypeFiltering: false,
    };

    //@ts-ignore
    const { places } = await Place.searchByText(request);

    if (places.length) {
        console.log(places);

        const { LatLngBounds } = await google.maps.importLibrary("core") as google.maps.CoreLibrary;
        const bounds = new LatLngBounds();

        // Loop through and get all the results.
        places.forEach((place) => {
            const markerView = new AdvancedMarkerElement({
                map,
                position: place.location,
                title: place.displayName,
            });

            bounds.extend(place.location as google.maps.LatLng);
            console.log(place);
        });

        map.fitBounds(bounds);

    } else {
        console.log('No results');
    }
}

initMap();

JavaScript

let map;
let center;
async function initMap() {
    const { Map } = await google.maps.importLibrary("maps");
    center = { lat: 37.4161493, lng: -122.0812166 };
    map = new Map(document.getElementById('map'), {
        center: center,
        zoom: 11,
        mapId: 'DEMO_MAP_ID',
    });
    findPlaces();
}
async function findPlaces() {
    const { Place } = await google.maps.importLibrary("places");
    const { AdvancedMarkerElement } = await google.maps.importLibrary("marker");
    const request = {
        textQuery: 'Tacos in Mountain View',
        fields: ['displayName', 'location', 'businessStatus'],
        includedType: 'restaurant',
        locationBias: { lat: 37.4161493, lng: -122.0812166 },
        isOpenNow: true,
        language: 'en-US',
        maxResultCount: 8,
        minRating: 3.2,
        region: 'us',
        useStrictTypeFiltering: false,
    };
    //@ts-ignore
    const { places } = await Place.searchByText(request);
    if (places.length) {
        console.log(places);
        const { LatLngBounds } = await google.maps.importLibrary("core");
        const bounds = new LatLngBounds();
        // Loop through and get all the results.
        places.forEach((place) => {
            const markerView = new AdvancedMarkerElement({
                map,
                position: place.location,
                title: place.displayName,
            });
            bounds.extend(place.location);
            console.log(place);
        });
        map.fitBounds(bounds);
    }
    else {
        console.log('No results');
    }
}
initMap();

CSS

/* 
 * Always set the map height explicitly to define the size of the div element
 * that contains the map. 
 */
#map {
  height: 100%;
}

/* 
 * Optional: Makes the sample page fill the window. 
 */
html,
body {
  height: 100%;
  margin: 0;
  padding: 0;
}

HTML

<html>
  <head>
    <title>Text Search</title>

    <link rel="stylesheet" type="text/css" href="./style.css" />
    <script type="module" src="./index.js"></script>
  </head>
  <body>
    <div id="map"></div>

    <!-- prettier-ignore -->
    <script>(g=>{var h,a,k,p="The Google Maps JavaScript API",c="google",l="importLibrary",q="__ib__",m=document,b=window;b=b[c]||(b[c]={});var d=b.maps||(b.maps={}),r=new Set,e=new URLSearchParams,u=()=>h||(h=new Promise(async(f,n)=>{await (a=m.createElement("script"));e.set("libraries",[...r]+"");for(k in g)e.set(k.replace(/[A-Z]/g,t=>"_"+t[0].toLowerCase()),g[k]);e.set("callback",c+".maps."+q);a.src=`https://maps.${c}apis.com/maps/api/js?`+e;d[q]=f;a.onerror=()=>h=n(Error(p+" could not load."));a.nonce=m.querySelector("script[nonce]")?.nonce||"";m.head.append(a)}));d[l]?console.warn(p+" only loads once. Ignoring:",g):d[l]=(f,...n)=>r.add(f)&&u().then(()=>d[l](f,...n))})
        ({key: "AIzaSyA6myHzS10YXdcazAFalmXvDkrYCp5cLc8", v: "weekly"});</script>
  </body>
</html>

Попробуйте образец