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

जगह की जानकारी ऑटोकंप्लीट करने की सुविधा, Maps JavaScript API में मौजूद Places लाइब्रेरी की एक सुविधा है. अपने ऐप्लिकेशन में, Google Maps के खोज फ़ील्ड की तरह, टाइप-अहेड-सर्च की सुविधा देने के लिए, अपने-आप पूरी होने वाली क्वेरी की सुविधा का इस्तेमाल किया जा सकता है.

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

अपने-आप पूरा होने वाले टेक्स्ट के लिए प्रोग्राम के हिसाब से इंटरफ़ेस

यहां दी गई टेबल में, प्रोग्राम के हिसाब से किसी जगह के शुरुआती अक्षर लिखने पर पूरा नाम सुझाने की सुविधा के इस्तेमाल में, जगहों के लिए ऑटोकंप्लीट की सेवा (लेगसी) और ऑटोकंप्लीट डेटा एपीआई (नया) के बीच के कुछ मुख्य अंतर बताए गए हैं:

PlacesService (लेगसी) Place (नया)
जगहों के नाम के लिए ऑटोकंप्लीट की सुविधा के बारे में जानकारी ऑटोकंप्लीट डेटा (नया) का रेफ़रंस
AutocompletionRequest AutocompleteRequest
AutocompleteService.getPlacePredictions AutocompleteSuggestion.fetchAutocompleteSuggestions
AutocompletePrediction PlacePrediction
नतीजों के ऑब्जेक्ट और PlacesServiceStatus रिस्पॉन्स को मैनेज करने के लिए, मेथड में कॉलबैक का इस्तेमाल करना ज़रूरी है. यह Promises का इस्तेमाल करता है और एसिंक्रोनस तरीके से काम करता है.
पेमेंट के तरीकों की PlacesServiceStatus जांच करना ज़रूरी है. स्थिति की जांच ज़रूरी नहीं है. गड़बड़ी को मैनेज करने के लिए, स्टैंडर्ड तरीके का इस्तेमाल किया जा सकता है.
Autocomplete इंस्टेंस बनाने पर, जगह के डेटा फ़ील्ड विकल्पों के तौर पर सेट हो जाते हैं. जगह के डेटा फ़ील्ड, fetchFields() को कॉल करने पर बाद में सेट किए जाते हैं.
क्वेरी के सुझाव दिखाने की सुविधा काम करती है (सिर्फ़ SearchBox के लिए). Autocomplete क्लास में, क्वेरी के अनुमान उपलब्ध नहीं हैं.
यह जगह के टाइप और जगह के डेटा फ़ील्ड के तय किए गए सेट तक ही सीमित है. जगह के टाइप और जगह के डेटा फ़ील्ड के ज़्यादा विकल्पों का ऐक्सेस.

इनका इस्तेमाल, ऑटोकंप्लीट के पुराने और नए, दोनों एपीआई करते हैं:

कोड की तुलना (प्रोग्रामैटिक)

इस सेक्शन में, प्रोग्राम के हिसाब से इंटरफ़ेस के लिए, ऑटोकंप्लीट करने की सुविधा के कोड की तुलना की गई है. इससे, Places सेवा और जगह की जानकारी देने वाली क्लास के बीच के अंतर को समझने में मदद मिलती है.

ऑटोकंप्लीट की सुविधा से मिलने वाले सुझावों को वापस पाना (लेगसी)

Places की लेगसी सेवा की मदद से, ऑटोमैटिक तरीके से पूरी होने वाले सुझावों को प्रोग्राम के ज़रिए वापस पाया जा सकता है. इससे, Autocomplete क्लास के मुकाबले यूज़र इंटरफ़ेस को ज़्यादा कंट्रोल किया जा सकता है. इस उदाहरण में, "par" के लिए एक अनुरोध किया गया है. इसमें AutocompletionRequest के साथ इनपुट वैल्यू और अनुमान में बायस डालने के लिए सीमाओं का एक सेट शामिल है. उदाहरण में, AutocompletePrediction के इंस्टेंस की सूची दिखती है. साथ ही, हर इंस्टेंस की जानकारी भी दिखती है. उदाहरण के तौर पर दिया गया फ़ंक्शन, एक सेशन टोकन भी बनाता है और उसे अनुरोध पर लागू करता है.

function init() {
  const placeInfo = document.getElementById("prediction");
  const service = new google.maps.places.AutocompleteService();
  const placesService = new google.maps.places.PlacesService(placeInfo);
  var sessionToken = new google.maps.places.AutocompleteSessionToken();

  // Define request options.
  let request = {
    input: "par",
    sessionToken: sessionToken,
    bounds: {
      west: -122.44,
      north: 37.8,
      east: -122.39,
      south: 37.78,
    },
  }

  // Display the query string.
  const title = document.getElementById("title");
  title.appendChild(
    document.createTextNode('Place predictions for "' + request.input + '":'),
  );

  // Perform the query and display the results.
  const displaySuggestions = function (predictions, status) {
    // Check the status of the Places Service.
    if (status != google.maps.places.PlacesServiceStatus.OK || !predictions) {
      alert(status);
      return;
    }

    predictions.forEach((prediction) => {
      const li = document.createElement("li");
      li.appendChild(document.createTextNode(prediction.description));
      document.getElementById("results").appendChild(li);
    });

    const placeRequest = {
      placeId: predictions[0].place_id,
      fields: ["name", "formatted_address"],
    };

    placesService.getDetails(placeRequest, (place, status) => {
      if (status == google.maps.places.PlacesServiceStatus.OK && place) {
        placeInfo.textContent = `
          First predicted place: ${place.name} at ${place.formatted_address}`
      }
    });

  };

  // Show the results of the query.
  service.getPlacePredictions(request, displaySuggestions);
}

ऑटोकंप्लीट की सुविधा से मिलने वाले सुझावों को वापस पाना (नया)

नई जगह की जानकारी वाली क्लास की मदद से, ऑटोमैटिक तरीके से सुझाव पाने की सुविधा को प्रोग्राम के ज़रिए भी वापस पाया जा सकता है. इससे, उपयोगकर्ता इंटरफ़ेस को PlaceAutocompleteElement क्लास की तुलना में ज़्यादा कंट्रोल किया जा सकता है. इस उदाहरण में, "par" के लिए एक अनुरोध किया गया है. इसमें AutocompleteRequest, इनपुट वैल्यू और अनुमान में बायस डालने के लिए सीमाओं का एक सेट होता है. उदाहरण में, placePrediction के इंस्टेंस की सूची दिखती है और हर इंस्टेंस के बारे में जानकारी दिखती है. उदाहरण के तौर पर दिया गया फ़ंक्शन, एक सेशन टोकन भी बनाता है और उसे अनुरोध पर लागू करता है.

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

  // Define request options.
  let request = {
    input: "par",
    sessionToken: sessionToken,
    locationBias: {
      west: -122.44,
      north: 37.8,
      east: -122.39,
      south: 37.78,
    },
  };

  // Display the query string.
  const title = document.getElementById("title");
  title.appendChild(
    document.createTextNode('Place predictions for "' + request.input + '":'),
  );

  // Perform the query and display the results.
  const { suggestions } =
    await google.maps.places.AutocompleteSuggestion.fetchAutocompleteSuggestions(request);

  const resultsElement = document.getElementById("results");

  for (let suggestion of suggestions) {
    const placePrediction = suggestion.placePrediction;
    const listItem = document.createElement("li");

    listItem.appendChild(
      document.createTextNode(placePrediction.text.text),
    );

    resultsElement.appendChild(listItem);
  }

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

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

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

  placeInfo.textContent = `
    First predicted place: ${place.displayName} at ${place.formattedAddress}`
}

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

यहां दी गई टेबल में, Places सेवा (लेगसी) और जगह की जानकारी वाली क्लास (नई) के बीच, अपने-आप जानकारी भरने वाले विजेट के इस्तेमाल में कुछ मुख्य अंतर बताए गए हैं:

Places Service (लेगसी) जगह (नया)
जगह के अनुमान के लिए Autocomplete क्लास. जगह के अनुमान के लिए PlaceAutocompleteElement क्लास.
क्वेरी के अनुमान के लिए, SearchBox क्लास
Autocomplete क्लास में, क्वेरी के अनुमान उपलब्ध नहीं हैं.
सिर्फ़ डिफ़ॉल्ट इनपुट प्लेसहोल्डर टेक्स्ट को स्थानीय भाषा में बदला जाता है. टेक्स्ट इनपुट प्लेसहोल्डर, सुझावों की सूची का लोगो, और जगह के सुझावों के लिए, क्षेत्र के हिसाब से स्थानीय भाषा में अनुवाद करने की सुविधा काम करती है.
विजेट, खोज के नतीजों को तय की गई सीमाओं तक सीमित करने के लिए, setBounds() या autocomplete.bindTo() का इस्तेमाल करता है. साथ ही, नतीजों को तय की गई सीमाओं तक सीमित करने के लिए, strictBounds का इस्तेमाल करता है. विजेट, तय किए गए दायरों के हिसाब से नतीजे दिखाने के लिए locationBias प्रॉपर्टी का इस्तेमाल करता है. साथ ही, खोज को तय किए गए दायरों तक सीमित करने के लिए locationRestriction प्रॉपर्टी का इस्तेमाल करता है.
विजेट को सिर्फ़ स्टैंडर्ड एचटीएमएल इनपुट एलिमेंट का इस्तेमाल करके इंटिग्रेट किया जा सकता है. विजेट को स्टैंडर्ड एचटीएमएल इनपुट एलिमेंट या gmp-place-autocomplete एलिमेंट का इस्तेमाल करके इंटिग्रेट किया जा सकता है.
विजेट का इस्तेमाल करते समय, हो सकता है कि उपयोगकर्ता ऐसी चीज़ों का अनुरोध करें जो शायद मान्य न हों. उदाहरण के लिए, "bisneyland". इस मामले को साफ़ तौर पर मैनेज किया जाना चाहिए. विजेट सिर्फ़ दिए गए सुझावों के लिए नतीजे दिखाएगा और अपनी पसंद के मुताबिक वैल्यू के लिए अनुरोध नहीं कर सकता. इसलिए, अमान्य अनुरोधों को मैनेज करने की ज़रूरत नहीं है.
लेगसी PlaceResult इंस्टेंस दिखाता है. Place इंस्टेंस दिखाता है.
जगह के डेटा फ़ील्ड, Autocomplete ऑब्जेक्ट के लिए विकल्पों के तौर पर सेट होते हैं. जब उपयोगकर्ता कोई विकल्प चुनता है और fetchFields() को कॉल किया जाता है, तब प्लेस डेटा फ़ील्ड सेट हो जाते हैं.
यह जगह के टाइप और जगह के डेटा फ़ील्ड के तय किए गए सेट तक ही सीमित है. जगह के टाइप और जगह के डेटा फ़ील्ड के ज़्यादा विकल्पों का ऐक्सेस.

कोड की तुलना करना (विजेट)

इस सेक्शन में, ऑटोकंप्लीट के लिए कोड की तुलना की गई है. इससे, जगह की जानकारी के लिए ऑटोकंप्लीट करने वाले लेगसी विजेट और जगह की जानकारी के लिए ऑटोकंप्लीट करने वाले नए एलिमेंट के बीच के अंतर को समझने में मदद मिलती है.

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

Places की सेवा, अपने-आप जानकारी भरने वाले दो तरह के विजेट उपलब्ध कराती है. इन्हें Autocomplete और SearchBox क्लास का इस्तेमाल करके जोड़ा जा सकता है. हर तरह के विजेट को मैप कंट्रोल के तौर पर मैप में जोड़ा जा सकता है या सीधे वेब पेज पर एम्बेड किया जा सकता है. यहां दिए गए कोड के उदाहरण में, मैप कंट्रोल के तौर पर Autocomplete विजेट को जोड़ने का तरीका बताया गया है.

  • Autocomplete विजेट कंस्ट्रक्टर में दो आर्ग्युमेंट होते हैं:
    • text टाइप का एचटीएमएल input एलिमेंट. यह वह इनपुट फ़ील्ड है जिसकी निगरानी, ऑटोमैटिक भरने की सुविधा करेगी और अपने नतीजे उसमें अटैच करेगी.
    • AutocompleteOptions आर्ग्युमेंट, जो ज़रूरी नहीं है. इसमें क्वेरी को सीमित करने के लिए, ज़्यादा विकल्प तय किए जा सकते हैं.
  • सीमाएं सेट करने के लिए, autocomplete.bindTo() को कॉल करके Autocomplete इंस्टेंस को मैप से साफ़ तौर पर बंधा जा सकता है.
  • अपने-आप पूरा होने की सुविधा के विकल्पों में, जगह की जानकारी वाले डेटा फ़ील्ड की जानकारी दें.
function initMap() {
  const map = new google.maps.Map(document.getElementById("map"), {
    center: { lat: 40.749933, lng: -73.98633 },
    zoom: 13,
    mapTypeControl: false,
  });
  const card = document.getElementById("pac-card");
  const input = document.getElementById("pac-input");
  const options = {
    fields: ["formatted_address", "geometry", "name"],
    strictBounds: false,
  };

  map.controls[google.maps.ControlPosition.TOP_LEFT].push(card);

  const autocomplete = new google.maps.places.Autocomplete(input, options);

  // Bind the map's bounds (viewport) property to the autocomplete object,
  // so that the autocomplete requests use the current map bounds for the
  // bounds option in the request.
  autocomplete.bindTo("bounds", map);

  const infowindow = new google.maps.InfoWindow();
  const infowindowContent = document.getElementById("infowindow-content");

  infowindow.setContent(infowindowContent);

  const marker = new google.maps.Marker({
    map,
    anchorPoint: new google.maps.Point(0, -29),
  });

  autocomplete.addListener("place_changed", () => {
    infowindow.close();
    marker.setVisible(false);

    const place = autocomplete.getPlace();

    if (!place.geometry || !place.geometry.location) {
      // User entered the name of a Place that was not suggested and
      // pressed the Enter key, or the Place Details request failed.
      window.alert("No details available for input: '" + place.name + "'");
      return;
    }

    // If the place has a geometry, then present it on a map.
    if (place.geometry.viewport) {
      map.fitBounds(place.geometry.viewport);
    } else {
      map.setCenter(place.geometry.location);
      map.setZoom(17);
    }

    marker.setPosition(place.geometry.location);
    marker.setVisible(true);
    infowindowContent.children["place-name"].textContent = place.name;
    infowindowContent.children["place-address"].textContent =
      place.formatted_address;
    infowindow.open(map, marker);
  });
}

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

जगह की जानकारी वाली क्लास में, PlaceAutocompleteElement नाम का एक HTMLElement सबक्लास होता है. यह एक यूज़र इंटरफ़ेस (यूआई) कॉम्पोनेंट उपलब्ध कराता है. इसे मैप कंट्रोल के तौर पर मैप में जोड़ा जा सकता है या सीधे किसी वेब पेज पर एम्बेड किया जा सकता है. यहां दिए गए कोड के उदाहरण में, PlaceAutocompleteElement विजेट को मैप कंट्रोल के तौर पर जोड़ने का तरीका बताया गया है.

जगह की जानकारी अपने-आप भरने वाले विजेट को इन तरीकों से बेहतर बनाया गया है:

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

लागू करने के तरीकों में ये मुख्य अंतर हैं:

  • क्वेरी के अनुमान, Autocomplete क्लास में उपलब्ध नहीं हैं.
  • PlaceAutocompleteElement को PlaceAutocompleteElementOptions का इस्तेमाल करके बनाया जाता है.
  • जगह के डेटा फ़ील्ड, चुनने के समय (fetchFields() को कॉल करने पर) तय किए जाते हैं.
  • locationBounds या locationRestriction विकल्प का इस्तेमाल करके सीमाएं सेट करें.
  • PlaceAutocompleteElement को एचटीएमएल टेक्स्ट इनपुट एलिमेंट से जोड़ने के लिए, id एट्रिब्यूट (HTMLElement से इनहेरिट किया गया) का इस्तेमाल करें.
let map;
let marker;
let infoWindow;

async function initMap() {
  // Request needed libraries.
  const [{ Map }, { AdvancedMarkerElement }] = await Promise.all([
    google.maps.importLibrary("marker"),
    google.maps.importLibrary("places"),
  ]);

  // Initialize the map.
  map = new google.maps.Map(document.getElementById("map"), {
    center: { lat: 40.749933, lng: -73.98633 },
    zoom: 13,
    mapId: "4504f8b37365c3d0",
    mapTypeControl: false,
  });

  const placeAutocomplete =
    new google.maps.places.PlaceAutocompleteElement({
      locationRestriction: map.getBounds(),
    });

  placeAutocomplete.id = "place-autocomplete-input";
  const card = document.getElementById("place-autocomplete-card");

  card.appendChild(placeAutocomplete);
  map.controls[google.maps.ControlPosition.TOP_LEFT].push(card);

  // Create the marker and infowindow.
  marker = new google.maps.marker.AdvancedMarkerElement({
    map,
  });
  infoWindow = new google.maps.InfoWindow({});

  // Add the gmp-placeselect listener, and display the results on the map.
  placeAutocomplete.addEventListener("gmp-placeselect", async ({ place }) => {
    await place.fetchFields({
      fields: ["displayName", "formattedAddress", "location"],
    });
    // If the place has a geometry, then present it on a map.
    if (place.viewport) {
      map.fitBounds(place.viewport);
    } else {
      map.setCenter(place.location);
      map.setZoom(17);
    }

    let content =
      '<div id="infowindow-content">' +
      '<span id="place-displayname" class="title">' +
      place.displayName +
      '</span><br />' +
      '<span id="place-address">' +
      place.formattedAddress +
      '</span>' +
      '</div>';

    updateInfoWindow(content, place.location);
    marker.position = place.location;
  });
}

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