পাঠ্য অনুসন্ধান (নতুন)

ইউরোপীয় অর্থনৈতিক অঞ্চল (EEA) ডেভেলপাররা

টেক্সট সার্চ (নতুন) একটি টেক্সট কোয়েরি গ্রহণ করে এবং তার সাথে মিলে যাওয়া স্থানগুলোর একটি তালিকা ফেরত দেয়।

টেক্সট সার্চ (নতুন) একটি স্ট্রিং-এর উপর ভিত্তি করে একাধিক স্থান সম্পর্কে তথ্য প্রদান করে — যেমন "নিউ ইয়র্কে পিৎজা" বা "অটোয়ার কাছাকাছি জুতার দোকান" বা "১২৩ মেইন স্ট্রিট"। পরিষেবাটি টেক্সট স্ট্রিং-এর সাথে মিলে যাওয়া স্থানগুলির একটি তালিকা এবং সেট করা যেকোনো অবস্থানগত পক্ষপাত সহ প্রতিক্রিয়া জানায়। টেক্সট সার্চ (নতুন) আপনাকে ধরন অনুযায়ী স্থান অনুসন্ধান করতে, ব্যবসার সময় এবং রেটিং-এর মতো মানদণ্ড ব্যবহার করে ফিল্টার করতে এবং ফলাফলকে একটি নির্দিষ্ট অবস্থানে সীমাবদ্ধ বা পক্ষপাতদুষ্ট করতে দেয়।

টেক্সট সার্চ (নতুন) ব্যবহার করতে হলে, আপনাকে আপনার গুগল ক্লাউড প্রজেক্টে 'প্লেসেস এপিআই (নতুন)' সক্রিয় করতে হবে। বিস্তারিত জানতে ' গেট স্টার্টেড' দেখুন।

টেক্সট কোয়েরির মাধ্যমে স্থান খুঁজুন

টেক্সট কোয়েরি বা ফোন নম্বর থেকে স্থানের তালিকা পেতে searchByText কল করুন। একটি রিকোয়েস্ট ব্যবহার করে সার্চ প্যারামিটারগুলো নির্দিষ্ট করুন, এবং তারপর searchByText() কল করুন। ফলাফলগুলো Place অবজেক্টের একটি তালিকা হিসেবে ফেরত আসে, যেখান থেকে আপনি স্থানের বিস্তারিত তথ্য পেতে পারেন। নিচের কোড স্নিপেটটিতে একটি রিকোয়েস্ট এবং searchByText কলের উদাহরণ দেখানো হয়েছে:

টাইপস্ক্রিপ্ট

const request = {
    textQuery: query,
    fields: ['displayName', 'location', 'businessStatus'],
    includedType: '', // Restrict query to a specific type (leave blank for any).
    useStrictTypeFiltering: true,
    locationBias: map.getCenter(),
    isOpenNow: true,
    language: 'en-US',
    maxResultCount: 8,
    minRating: 1, // Specify a minimum rating.
    region: 'us',
};

const { places } = await Place.searchByText(request);

জাভাস্ক্রিপ্ট

const request = {
    textQuery: query,
    fields: ['displayName', 'location', 'businessStatus'],
    includedType: '', // Restrict query to a specific type (leave blank for any).
    useStrictTypeFiltering: true,
    locationBias: map.getCenter(),
    isOpenNow: true,
    language: 'en-US',
    maxResultCount: 8,
    minRating: 1, // Specify a minimum rating.
    region: 'us',
};

const { places } = await Place.searchByText(request);
  • অনুসন্ধানের জন্য textQuery প্যারামিটার ব্যবহার করে একটি টেক্সট কোয়েরি বা ফোন নম্বর উল্লেখ করুন।
  • ক্যামেল কেসে এক বা একাধিক ডেটা ফিল্ডের কমা-বিভক্ত তালিকা নির্দিষ্ট করতে fields প্যারামিটারটি (আবশ্যক) ব্যবহার করুন।
  • শুধুমাত্র নির্দিষ্ট ধরনের ফলাফল ফেরত দিতে includedType প্যারামিটারটি ব্যবহার করুন।
  • আপনার টেক্সট সার্চের ফলাফলকে কোনো নির্দিষ্ট অঞ্চলে সীমাবদ্ধ করতে বা পক্ষপাতদুষ্ট করতে locationBias অথবা locationRestriction ব্যবহার করুন।
বৈশিষ্ট্যগুলোর সম্পূর্ণ তালিকা দেখুন।

কোয়েরিতে যদি ফোন নম্বর থাকে, তাহলে region প্যারামিটারটি সেট করতে হবে। উদাহরণস্বরূপ, আপনি যদি জাপানের কোনো জায়গা খুঁজতে ফোন নম্বর ব্যবহার করেন এবং অনুরোধকারী ডোমেইনটি jp হয়, তাহলে আপনাকে অবশ্যই region প্যারামিটারটি 'jp'-তে সেট করতে হবে। অনুরোধ থেকে region বাদ দেওয়া হলে, API ডিফল্টভাবে মার্কিন যুক্তরাষ্ট্র ('us') অঞ্চল ব্যবহার করবে।

ফলাফল Place অবজেক্টের একটি তালিকা হিসেবে ফেরত দেওয়া হয়, যেখান থেকে আপনি স্থানটির বিস্তারিত তথ্য পেতে পারেন।

উদাহরণ

নিম্নলিখিত উদাহরণটি প্রদত্ত কোয়েরি টেক্সট দিয়ে searchByText কল করে এবং তারপর ফলাফল দেখানোর জন্য একটি ম্যাপে ক্লিকযোগ্য মার্কার যুক্ত করে।

টাইপস্ক্রিপ্ট

let map: google.maps.Map;
let markers: Record<string, google.maps.marker.AdvancedMarkerElement> = {};
let infoWindow: google.maps.InfoWindow;

async function init() {
    const [{ Map, InfoWindow }, { ControlPosition }] = await Promise.all([
        google.maps.importLibrary('maps'),
        google.maps.importLibrary('core'),
    ]);

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

    const textInput = document.getElementById('text-input') as HTMLInputElement;
    const textInputButton = document.getElementById(
        'text-input-button'
    ) as HTMLButtonElement;
    const card = document.getElementById('text-input-card')!;
    map.controls[ControlPosition.TOP_LEFT].push(card);

    textInputButton.addEventListener('click', () => {
        void findPlaces(textInput.value);
    });

    textInput.addEventListener('keydown', (event) => {
        if (event.key === 'Enter') {
            void findPlaces(textInput.value);
        }
    });

    infoWindow = new InfoWindow();
}

async function findPlaces(query: string) {
    const [{ Place }, { AdvancedMarkerElement }] = await Promise.all([
        google.maps.importLibrary('places'),
        google.maps.importLibrary('marker'),
    ]);

    const request = {
        textQuery: query,
        fields: ['displayName', 'location', 'businessStatus'],
        includedType: '', // Restrict query to a specific type (leave blank for any).
        useStrictTypeFiltering: true,
        locationBias: map.getCenter(),
        isOpenNow: true,
        language: 'en-US',
        maxResultCount: 8,
        minRating: 1, // Specify a minimum rating.
        region: 'us',
    };

    const { places } = await Place.searchByText(request);

    if (places.length) {
        const { LatLngBounds } = await google.maps.importLibrary('core');
        const bounds = new LatLngBounds();

        // First remove all existing markers.
        for (const id in markers) {
            markers[id].map = null;
        }
        markers = {};

        // Loop through and get all the results.
        places.forEach((place: google.maps.places.Place) => {
            const marker = new AdvancedMarkerElement({
                map,
                position: place.location,
                title: place.displayName,
            });
            markers[place.id] = marker;

            marker.addListener('gmp-click', () => {
                map.panTo(place.location!);
                updateInfoWindow(place.displayName!, place.id, marker);
            });

            if (place.location != null) {
                bounds.extend(place.location);
            }
        });

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

// Helper function to create an info window.
function updateInfoWindow(
    title: string | Element | null,
    content: string | Element | null,
    anchor: google.maps.marker.AdvancedMarkerElement
) {
    infoWindow.setContent(content);
    infoWindow.setHeaderContent(title);
    infoWindow.open({
        map,
        anchor,
        shouldFocus: false,
    });
}

void init();

জাভাস্ক্রিপ্ট

let map;
let markers = {};
let infoWindow;

async function init() {
    const [{ Map, InfoWindow }, { ControlPosition }] = await Promise.all([
        google.maps.importLibrary('maps'),
        google.maps.importLibrary('core'),
    ]);

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

    const textInput = document.getElementById('text-input');
    const textInputButton = document.getElementById('text-input-button');
    const card = document.getElementById('text-input-card');
    map.controls[ControlPosition.TOP_LEFT].push(card);

    textInputButton.addEventListener('click', () => {
        void findPlaces(textInput.value);
    });

    textInput.addEventListener('keydown', (event) => {
        if (event.key === 'Enter') {
            void findPlaces(textInput.value);
        }
    });

    infoWindow = new InfoWindow();
}

async function findPlaces(query) {
    const [{ Place }, { AdvancedMarkerElement }] = await Promise.all([
        google.maps.importLibrary('places'),
        google.maps.importLibrary('marker'),
    ]);

    const request = {
        textQuery: query,
        fields: ['displayName', 'location', 'businessStatus'],
        includedType: '', // Restrict query to a specific type (leave blank for any).
        useStrictTypeFiltering: true,
        locationBias: map.getCenter(),
        isOpenNow: true,
        language: 'en-US',
        maxResultCount: 8,
        minRating: 1, // Specify a minimum rating.
        region: 'us',
    };

    const { places } = await Place.searchByText(request);

    if (places.length) {
        const { LatLngBounds } = await google.maps.importLibrary('core');
        const bounds = new LatLngBounds();

        // First remove all existing markers.
        for (const id in markers) {
            markers[id].map = null;
        }
        markers = {};

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

            marker.addListener('gmp-click', () => {
                map.panTo(place.location);
                updateInfoWindow(place.displayName, place.id, marker);
            });

            if (place.location != null) {
                bounds.extend(place.location);
            }
        });

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

// Helper function to create an info window.
function updateInfoWindow(title, content, anchor) {
    infoWindow.setContent(content);
    infoWindow.setHeaderContent(title);
    infoWindow.open({
        map,
        anchor,
        shouldFocus: false,
    });
}

void init();

সিএসএস

/* 
 * 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;
}

#text-input-card {
    width: 25%;
    background-color: #fff;
    border-radius: 5px;
    box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px;
    margin: 10px;
    padding: 5px;
    font-family: Roboto, sans-serif;
    font-size: large;
    font-weight: bold;
}

#text-input {
    width: 100%;
    padding: 10px;
    margin: 0;
    box-sizing: border-box;
}

#text-input-button {
    display: inline-block;
    margin-top: 0.5rem;
    width: auto;
    padding: 0.6rem 0.75rem;
    font-size: 0.875rem;
    font-weight: 500;
    color: #fff;
    background-color: #2563eb;
    border: none;
    border-radius: 0.375rem;
    cursor: pointer;
    transition: background-color 0.15s ease-in-out;
    text-align: center;
}

এইচটিএমএল

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

        <link rel="stylesheet" type="text/css" href="./style.css" />
        <script type="module" src="./index.js"></script>
        <script>
            // prettier-ignore
            (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: "GOOGLE_MAPS_API_KEY"
            });
        </script>
    </head>
    <body>
        <div id="text-input-card">
            <input
                type="text"
                id="text-input"
                placeholder="Search for a place" />
            <input type="button" id="text-input-button" value="Search" />
        </div>
        <div id="map"></div>
    </body>
</html>