Place Autocomplete Data API

जगह की जानकारी के लिए ऑटोकंप्लीट की सुविधा देने वाले Data API की मदद से, जगह की जानकारी के सुझाव प्रोग्राम के हिसाब से फ़ेच किए जा सकते हैं. इससे, ऑटोकंप्लीट की सुविधा को उपयोगकर्ता के हिसाब से बनाया जा सकता है. साथ ही, ऑटोकंप्लीट विजेट की तुलना में ज़्यादा बेहतर तरीके से कंट्रोल किया जा सकता है. इस गाइड में, आपको उपयोगकर्ता की क्वेरी के आधार पर ऑटोकंप्लीट के अनुरोध करने के लिए, 'जगह के शुरुआती अक्षर लिखने पर पूरा नाम सुझाने की सुविधा के लिए डेटा एपीआई' का इस्तेमाल करने का तरीका पता चलेगा.

नीचे दिए गए उदाहरण में, टाइप-अहेड इंटिग्रेशन को आसानी से दिखाया गया है. अपनी खोज क्वेरी डालें. इसके बाद, अपनी पसंद का नतीजा चुनने के लिए, पर क्लिक करें.

ऑटोकंप्लीट के अनुरोध

ऑटोकंप्लीट का अनुरोध, क्वेरी इनपुट स्ट्रिंग लेता है और जगह के सुझावों की सूची दिखाता है. अपने-आप जानकारी भरने का अनुरोध करने के लिए, fetchAutocompleteSuggestions() को कॉल करें और ज़रूरी प्रॉपर्टी के साथ अनुरोध पास करें. input प्रॉपर्टी में खोजने के लिए स्ट्रिंग होती है. आम तौर पर, उपयोगकर्ता के क्वेरी टाइप करने पर, इस प्रॉपर्टी की वैल्यू अपडेट हो जाती है. अनुरोध में sessionToken शामिल होना चाहिए, जिसका इस्तेमाल बिलिंग के लिए किया जाता है.

नीचे दिए गए स्निपेट में, अनुरोध का मुख्य हिस्सा बनाने और सेशन टोकन जोड़ने का तरीका बताया गया है. इसके बाद, PlacePrediction की सूची पाने के लिए, fetchAutocompleteSuggestions() को कॉल किया गया है.

// Add an initial request body.
let request = {
  input: "Tadi",
  locationRestriction: {
    west: -122.44,
    north: 37.8,
    east: -122.39,
    south: 37.78,
  },
  origin: { lat: 37.7893, lng: -122.4039 },
  includedPrimaryTypes: ["restaurant"],
  language: "en-US",
  region: "us",
};
// Create a session token.
const token = new AutocompleteSessionToken();

// Add the token to the request.
// @ts-ignore
request.sessionToken = token;

ऑटोकंप्लीट की सुविधा से मिलने वाले सुझावों को सीमित करना

डिफ़ॉल्ट रूप से, जगह की जानकारी अपने-आप पूरी होने की सुविधा, जगह के सभी टाइप दिखाती है. यह सुविधा, उपयोगकर्ता की जगह के आस-पास के सुझावों पर फ़ोकस करती है. साथ ही, उपयोगकर्ता की चुनी गई जगह के लिए सभी उपलब्ध डेटा फ़ील्ड फ़ेच करती है. जगह के नाम के लिए अपने-आप पूरी होने वाले विकल्प सेट करें, ताकि आपको ज़्यादा काम के सुझाव मिल सकें. इसके लिए, नतीजों पर पाबंदी लगाएं या उन्हें अपने हिसाब से बनाएं.

नतीजों पर पाबंदी लगाने पर, अपने-आप पूरा होने वाला व्यूज़र्ड, पाबंदी वाले इलाके से बाहर के नतीजों को अनदेखा कर देता है. आम तौर पर, नतीजों को मैप के दायरे तक सीमित रखा जाता है. नतीजों को अपने हिसाब से बनाने पर, ऑटोकंप्लीट विजेट, तय किए गए इलाके के हिसाब से नतीजे दिखाता है. हालांकि, कुछ मैच उस इलाके से बाहर के भी हो सकते हैं.

origin प्रॉपर्टी का इस्तेमाल करके, ऑरिजिन पॉइंट की जानकारी दें. इस पॉइंट से, डेस्टिनेशन तक की जियोडेसिक दूरी का हिसाब लगाया जाएगा. अगर यह वैल्यू नहीं दी जाती है, तो दूरी की जानकारी नहीं दी जाती.

ज़्यादा से ज़्यादा पांच जगह के टाइप बताने के लिए, includedPrimaryTypes प्रॉपर्टी का इस्तेमाल करें. अगर कोई टाइप नहीं चुना गया है, तो सभी तरह की जगहें दिखेंगी.

एपीआई रेफ़रंस देखें

जगह की जानकारी पाना

जगह के सुझाव के नतीजे से Place ऑब्जेक्ट दिखाने के लिए, पहले toPlace() को कॉल करें. इसके बाद, Place ऑब्जेक्ट पर fetchFields() को कॉल करें. जगह के सुझाव से मिला सेशन आईडी अपने-आप शामिल हो जाता है. fetchFields() को कॉल करने पर, अपने-आप शब्दों के सुझाव मिलने की सुविधा वाला सेशन खत्म हो जाता है.

let place = suggestions[0].placePrediction.toPlace(); // Get first predicted place.

await place.fetchFields({
  fields: ["displayName", "formattedAddress"],
});

const placeInfo = document.getElementById("prediction");

placeInfo.textContent =
  "First predicted place: " +
  place.displayName +
  ": " +
  place.formattedAddress;

सेशन टोकन

सेशन टोकन, उपयोगकर्ता की अपने-आप पूरी होने वाली खोज की क्वेरी और चुनने के चरणों को बिलिंग के मकसद से अलग-अलग सेशन में ग्रुप करते हैं. सेशन तब शुरू होता है, जब उपयोगकर्ता टाइप करना शुरू करता है. जब उपयोगकर्ता कोई जगह चुनता है और जगह की जानकारी के लिए कॉल किया जाता है, तो सेशन खत्म हो जाता है.

नया सेशन टोकन बनाने और उसे अनुरोध में जोड़ने के लिए, AutocompleteSessionToken का एक इंस्टेंस बनाएं. इसके बाद, टोकन का इस्तेमाल करने के लिए, अनुरोध की sessionToken प्रॉपर्टी को सेट करें. इसके लिए, नीचे दिए गए स्निपेट का इस्तेमाल करें:

// Create a session token.
const token = new AutocompleteSessionToken();

// Add the token to the request.
// @ts-ignore
request.sessionToken = token;

fetchFields() को कॉल करने पर, सेशन खत्म हो जाता है. Place इंस्टेंस बनाने के बाद, आपको fetchFields() को सेशन टोकन पास करने की ज़रूरत नहीं है, क्योंकि यह अपने-आप मैनेज हो जाता है.

await place.fetchFields({
  fields: ["displayName", "formattedAddress"],
});
await place.fetchFields({
    fields: ['displayName'],
  });

AutocompleteSessionToken का नया इंस्टेंस बनाकर, अगले सेशन के लिए सेशन टोकन बनाएं.

सेशन टोकन के लिए सुझाव:

  • जगह के शुरुआती अक्षर लिखने पर पूरा नाम सुझाने की सुविधा के सभी कॉल के लिए, सेशन टोकन का इस्तेमाल करें.
  • हर सेशन के लिए नया टोकन जनरेट करें.
  • हर नए सेशन के लिए, एक यूनीक सेशन टोकन पास करें. एक से ज़्यादा सेशन के लिए एक ही टोकन का इस्तेमाल करने पर, हर अनुरोध के लिए अलग से शुल्क लिया जाएगा.

आपके पास अनुरोध से, अपने-आप पूरा होने वाले सेशन का टोकन हटाने का विकल्प होता है. अगर सेशन टोकन को छोड़ा जाता है, तो हर अनुरोध के लिए अलग से बिलिंग की जाती है. इससे अपने-आप पूरा होने की सुविधा - हर अनुरोध के लिए SKU ट्रिगर होता है. अगर किसी सेशन टोकन का फिर से इस्तेमाल किया जाता है, तो सेशन को अमान्य माना जाता है. साथ ही, अनुरोधों के लिए उसी तरह शुल्क लिया जाता है जैसे कोई सेशन टोकन न दिया गया हो.

उदाहरण

जब उपयोगकर्ता कोई क्वेरी टाइप करता है, तो हर कुछ समय के बाद (हर वर्ण के बाद नहीं) ऑटोकंप्लीट का अनुरोध किया जाता है. साथ ही, संभावित नतीजों की सूची दिखाई जाती है. जब उपयोगकर्ता नतीजों की सूची से कोई विकल्प चुनता है, तो उसे एक अनुरोध माना जाता है. साथ ही, खोज के दौरान किए गए सभी अनुरोधों को एक साथ जोड़कर, उन्हें एक अनुरोध के तौर पर गिना जाता है. अगर उपयोगकर्ता कोई जगह चुनता है, तो खोज क्वेरी के लिए कोई शुल्क नहीं लिया जाता. सिर्फ़ जगह के डेटा के अनुरोध के लिए शुल्क लिया जाता है. अगर उपयोगकर्ता सेशन शुरू होने के कुछ मिनटों के अंदर कोई विकल्प नहीं चुनता है, तो सिर्फ़ खोज क्वेरी के लिए शुल्क लिया जाता है.

किसी ऐप्लिकेशन के हिसाब से, इवेंट का फ़्लो इस तरह होता है:

  1. कोई उपयोगकर्ता "पेरिस, फ़्रांस" खोजने के लिए क्वेरी टाइप करना शुरू करता है.
  2. उपयोगकर्ता के इनपुट का पता चलने पर, ऐप्लिकेशन एक नया सेशन टोकन, "टोकन A" बनाता है.
  3. उपयोगकर्ता कुछ लिखते ही, एपीआई कुछ अक्षरों के बाद अपने-आप भरने की सुविधा का अनुरोध करता है. साथ ही, हर अक्षर के लिए संभावित नतीजों की एक नई सूची दिखाता है:
    "P"
    "Par"
    "Paris,"
    "Paris, Fr"
  4. जब उपयोगकर्ता कोई विकल्प चुनता है, तो:
    • क्वेरी से मिले सभी अनुरोधों को एक ग्रुप में रखा जाता है और "टोकन A" से दिखाए गए सेशन में, एक अनुरोध के तौर पर जोड़ा जाता है.
    • उपयोगकर्ता के चुने गए विकल्प को जगह की जानकारी के अनुरोध के तौर पर गिना जाता है और "टोकन A" से दिखाए गए सेशन में जोड़ा जाता है.
  5. सेशन खत्म हो जाता है और ऐप्लिकेशन, "टोकन A" को खारिज कर देता है.
सेशन के लिए बिलिंग के तरीके के बारे में जानें

पूरा कोड का उदाहरण

इस सेक्शन में, जगह के शुरुआती अक्षर लिखने पर पूरा नाम सुझाने की सुविधा वाले Data API का इस्तेमाल करने के तरीके के बारे में पूरी जानकारी देने वाले उदाहरण दिए गए हैं .

किसी जगह के शुरुआती अक्षर लिखने पर पूरा नाम सुझाने की सुविधा

इस उदाहरण में, "Tadi" इनपुट के लिए fetchAutocompleteSuggestions() को कॉल करने का तरीका बताया गया है. इसके बाद, अनुमान के पहले नतीजे पर toPlace() को कॉल किया गया है. इसके बाद, जगह की जानकारी पाने के लिए fetchFields() को कॉल किया गया है.

TypeScript

/**
 * Demonstrates making a single request for Place predictions, then requests Place Details for the first result.
 */
async function init() {
    // @ts-ignore
    const { Place, AutocompleteSessionToken, AutocompleteSuggestion } = await google.maps.importLibrary("places") as google.maps.PlacesLibrary;

    // Add an initial request body.
    let request = {
        input: "Tadi",
        locationRestriction: { west: -122.44, north: 37.8, east: -122.39, south: 37.78 },
        origin: { lat: 37.7893, lng: -122.4039 },
        includedPrimaryTypes: ["restaurant"],
        language: "en-US",
        region: "us",
    };

    // Create a session token.
    const token = new AutocompleteSessionToken();
    // Add the token to the request.
    // @ts-ignore
    request.sessionToken = token;
    // Fetch autocomplete suggestions.
    const { suggestions } = await AutocompleteSuggestion.fetchAutocompleteSuggestions(request);

    const title = document.getElementById('title') as HTMLElement;
    title.appendChild(document.createTextNode('Query predictions for "' + request.input + '":'));

    for (let suggestion of suggestions) {
        const placePrediction = suggestion.placePrediction;

        // Create a new list element.
        const listItem = document.createElement('li');
        const resultsElement = document.getElementById("results") as HTMLElement;
        listItem.appendChild(document.createTextNode(placePrediction.text.toString()));
        resultsElement.appendChild(listItem);
    }

    let place = suggestions[0].placePrediction.toPlace(); // Get first predicted place.
    await place.fetchFields({
        fields: ['displayName', 'formattedAddress'],
    });

    const placeInfo = document.getElementById("prediction") as HTMLElement;
    placeInfo.textContent = 'First predicted place: ' + place.displayName + ': ' + place.formattedAddress;

}

init();

JavaScript

/**
 * Demonstrates making a single request for Place predictions, then requests Place Details for the first result.
 */
async function init() {
  // @ts-ignore
  const { Place, AutocompleteSessionToken, AutocompleteSuggestion } =
    await google.maps.importLibrary("places");
  // Add an initial request body.
  let request = {
    input: "Tadi",
    locationRestriction: {
      west: -122.44,
      north: 37.8,
      east: -122.39,
      south: 37.78,
    },
    origin: { lat: 37.7893, lng: -122.4039 },
    includedPrimaryTypes: ["restaurant"],
    language: "en-US",
    region: "us",
  };
  // Create a session token.
  const token = new AutocompleteSessionToken();

  // Add the token to the request.
  // @ts-ignore
  request.sessionToken = token;

  // Fetch autocomplete suggestions.
  const { suggestions } =
    await AutocompleteSuggestion.fetchAutocompleteSuggestions(request);
  const title = document.getElementById("title");

  title.appendChild(
    document.createTextNode('Query predictions for "' + request.input + '":'),
  );

  for (let suggestion of suggestions) {
    const placePrediction = suggestion.placePrediction;
    // Create a new list element.
    const listItem = document.createElement("li");
    const resultsElement = document.getElementById("results");

    listItem.appendChild(
      document.createTextNode(placePrediction.text.toString()),
    );
    resultsElement.appendChild(listItem);
  }

  let place = suggestions[0].placePrediction.toPlace(); // Get first predicted place.

  await place.fetchFields({
    fields: ["displayName", "formattedAddress"],
  });

  const placeInfo = document.getElementById("prediction");

  placeInfo.textContent =
    "First predicted place: " +
    place.displayName +
    ": " +
    place.formattedAddress;
}

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

एचटीएमएल

<html>
  <head>
    <title>Place Autocomplete Data API Predictions</title>

    <link rel="stylesheet" type="text/css" href="./style.css" />
    <script type="module" src="./index.js"></script>
  </head>
  <body>
    <div id="title"></div>
    <ul id="results"></ul>
    <p><span id="prediction"></span></p>
    <img
      class="powered-by-google"
      src="https://storage.googleapis.com/geo-devrel-public-buckets/powered_by_google_on_white.png"
      alt="Powered by Google"
    />

    <!-- 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: "AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg", v: "weekly"});</script>
  </body>
</html>

सैंपल आज़माएं

सेशन के साथ, टाइप-ऐहेड की सुविधा का इस्तेमाल करना

इस उदाहरण में, उपयोगकर्ता की क्वेरी के आधार पर fetchAutocompleteSuggestions() को कॉल करने का तरीका बताया गया है. साथ ही, जवाब में अनुमानित जगहों की सूची दिखाने और आखिर में चुनी गई जगह की जानकारी पाने का तरीका भी बताया गया है. इस उदाहरण में, सेशन टोकन के इस्तेमाल के बारे में भी बताया गया है. इससे, उपयोगकर्ता की क्वेरी को जगह की जानकारी के फ़ाइनल अनुरोध के साथ ग्रुप किया जा सकता है.

TypeScript

let title;
let results;
let input;
let token;

// Add an initial request body.
let request = {
    input: "",
    locationRestriction: { west: -122.44, north: 37.8, east: -122.39, south: 37.78 },
    origin: { lat: 37.7893, lng: -122.4039 },
    includedPrimaryTypes: ["restaurant"],
    language: "en-US",
    region: "us",
};

async function init() {
    token = new google.maps.places.AutocompleteSessionToken();

    title = document.getElementById('title');
    results = document.getElementById('results');
    input = document.querySelector("input");
    input.addEventListener("input", makeAcRequest);
    request = refreshToken(request) as any;
}

async function makeAcRequest(input) {
    // Reset elements and exit if an empty string is received.
    if (input.target.value == '') {
        title.innerText = '';
        results.replaceChildren();
        return;
    }

    // Add the latest char sequence to the request.
    request.input = input.target.value;

    // Fetch autocomplete suggestions and show them in a list.
    // @ts-ignore
    const { suggestions } = await google.maps.places.AutocompleteSuggestion.fetchAutocompleteSuggestions(request);

    title.innerText = 'Query predictions for "' + request.input + '"';

    // Clear the list first.
    results.replaceChildren();

    for (const suggestion of suggestions) {
        const placePrediction = suggestion.placePrediction;

        // Create a link for the place, add an event handler to fetch the place.
        const a = document.createElement('a');
        a.addEventListener('click', () => {
            onPlaceSelected(placePrediction!.toPlace());
        });
        a.innerText = placePrediction!.text.toString();

        // Create a new list element.
        const li = document.createElement('li');
        li.appendChild(a);
        results.appendChild(li);
    }
}

// Event handler for clicking on a suggested place.
async function onPlaceSelected(place) {
    await place.fetchFields({
        fields: ['displayName', 'formattedAddress'],
    });
    let placeText = document.createTextNode(place.displayName + ': ' + place.formattedAddress);
    results.replaceChildren(placeText);
    title.innerText = 'Selected Place:';
    input.value = '';
    refreshToken(request);
}

// Helper function to refresh the session token.
async function refreshToken(request) {
    // Create a new session token and add it to the request.
    token = new google.maps.places.AutocompleteSessionToken();
    request.sessionToken = token;
    return request;
}

declare global {
    interface Window {
      init: () => void;
    }
  }
  window.init = init;

JavaScript

let title;
let results;
let input;
let token;
// Add an initial request body.
let request = {
  input: "",
  locationRestriction: {
    west: -122.44,
    north: 37.8,
    east: -122.39,
    south: 37.78,
  },
  origin: { lat: 37.7893, lng: -122.4039 },
  includedPrimaryTypes: ["restaurant"],
  language: "en-US",
  region: "us",
};

async function init() {
  token = new google.maps.places.AutocompleteSessionToken();
  title = document.getElementById("title");
  results = document.getElementById("results");
  input = document.querySelector("input");
  input.addEventListener("input", makeAcRequest);
  request = refreshToken(request);
}

async function makeAcRequest(input) {
  // Reset elements and exit if an empty string is received.
  if (input.target.value == "") {
    title.innerText = "";
    results.replaceChildren();
    return;
  }

  // Add the latest char sequence to the request.
  request.input = input.target.value;

  // Fetch autocomplete suggestions and show them in a list.
  // @ts-ignore
  const { suggestions } =
    await google.maps.places.AutocompleteSuggestion.fetchAutocompleteSuggestions(
      request,
    );

  title.innerText = 'Query predictions for "' + request.input + '"';
  // Clear the list first.
  results.replaceChildren();

  for (const suggestion of suggestions) {
    const placePrediction = suggestion.placePrediction;
    // Create a link for the place, add an event handler to fetch the place.
    const a = document.createElement("a");

    a.addEventListener("click", () => {
      onPlaceSelected(placePrediction.toPlace());
    });
    a.innerText = placePrediction.text.toString();

    // Create a new list element.
    const li = document.createElement("li");

    li.appendChild(a);
    results.appendChild(li);
  }
}

// Event handler for clicking on a suggested place.
async function onPlaceSelected(place) {
  await place.fetchFields({
    fields: ["displayName", "formattedAddress"],
  });

  let placeText = document.createTextNode(
    place.displayName + ": " + place.formattedAddress,
  );

  results.replaceChildren(placeText);
  title.innerText = "Selected Place:";
  input.value = "";
  refreshToken(request);
}

// Helper function to refresh the session token.
async function refreshToken(request) {
  // Create a new session token and add it to the request.
  token = new google.maps.places.AutocompleteSessionToken();
  request.sessionToken = token;
  return request;
}

window.init = 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;
}

a {
  cursor: pointer;
  text-decoration: underline;
  color: blue;
}

input {
  width: 300px;
}

एचटीएमएल

<html>
  <head>
    <title>Place Autocomplete Data API Session</title>

    <link rel="stylesheet" type="text/css" href="./style.css" />
    <script type="module" src="./index.js"></script>
  </head>
  <body>
    <input id="input" type="text" placeholder="Search for a place..." />
    <div id="title"></div>
    <ul id="results"></ul>
    <img
      class="powered-by-google"
      src="https://storage.googleapis.com/geo-devrel-public-buckets/powered_by_google_on_white.png"
      alt="Powered by Google"
    />

    <!-- 
      The `defer` attribute causes the script to execute after the full HTML
      document has been parsed. For non-blocking uses, avoiding race conditions,
      and consistent behavior across browsers, consider loading using Promises. See
      https://developers.google.com/maps/documentation/javascript/load-maps-js-api
      for more information.
      -->
    <script
      src="https://maps.googleapis.com/maps/api/js?key=AIzaSyB41DRUbKWJHPxaFjMAwdrzWzbVKartNGg&callback=init&libraries=places&v=weekly"
      defer
    ></script>
  </body>
</html>

सैंपल आज़माएं