מעבר לממשק החדש של חיפוש בקרבת מקום

בדף הזה מוסבר מה ההבדל בין חיפוש בקרבת מקום כפי שהוא משמש את הכיתה Place (חדשה) לבין הכיתה PlacesService (קודמת), ומופיעים קטעי קוד לדוגמה לצורך השוואה.

  • ל-PlacesService הקודם יש שיטה nearbySearch() שמאפשרת לחפש מקומות באזור מסוים לפי מילת מפתח או סוג.
  • בכיתה Place יש שיטה searchNearby() שמאפשרת לחפש מקומות באזור מסוים לפי סוג מקום, תוך שימוש במבחר מורחב של שדות של נתוני מקומות וסוגים של מקומות, כדי לספק גמישות רבה יותר.

בטבלה הבאה מפורטים חלק מההבדלים העיקריים בין שיטות החיפוש בסביבה בין הכיתה Place לבין PlacesService:

PlacesService (דור קודם) Place (חדש)
nearbySearch()
searchNearby()
PlaceSearchRequest SearchNearbyRequest
צריך להשתמש בפונקציית קריאה חוזרת כדי לטפל באובייקט התוצאות ובתגובה google.maps.places.PlacesServiceStatus. משתמשת ב-Promises ופועלת באופן אסינכרוני.
צריך לסמן את התיבה PlacesServiceStatus. אין צורך בבדיקת סטטוס, אפשר להשתמש בטיפול שגיאות רגיל.
יש תמיכה רק בהטיה לפי מיקום. תמיכה בהטיה לפי מיקום ובהגבלת מיקום.
הפונקציה מחזירה את כל שדות הנתונים הזמינים (קבוצת משנה של השדות הנתמכים). אי אפשר להגביל אותה לשדות ספציפיים. הפונקציה מחזירה רק את שדות נתוני המיקום המבוקשים. בכיתה Place יש מבחר מורחב של שדות שמתעדכנים באופן קבוע.
מוגבלת לקבוצה קבועה של סוגים של מקומות. גישה למבחר מורחב של סוגי מקומות שמתעדכן באופן קבוע.
חיפוש מבוסס-טקסט נתמך באמצעות מילת המפתח. אין תמיכה בחיפוש מבוסס-טקסט. במקום זאת, צריך להשתמש בחיפוש טקסט (חדש).

השוואת קוד

בקטע הזה נסביר את ההבדלים בין שירות Places לבין הכיתה Place באמצעות השוואה בין הקוד של שיטות החיפוש בקרבת מקום. בקטעי הקוד מוצג הקוד שנדרש בכל ממשק API כדי לשלוח בקשת חיפוש מבוססת-טקסט.

חיפוש בקרבת מקום (דור קודם)

בחיפוש 'בסביבה' הקודם אפשר לחפש מקומות באזור מסוים לפי מילת מפתח או סוג. אין אפשרות להגביל את החיפושים באמצעות שדות של נתוני מקומות, כך שכל השדות הזמינים מוחזרים בכל בקשה. בקטע הקוד הבא מוצגת קריאה ל-nearbySearch() כדי להציג מידע על מסעדות בסידני, אוסטרליה. הבקשה היא סנכרונית, כוללת קריאה חוזרת (callback) ובדיקה מותנית נדרשת של PlacesServiceStatus.

let map;
let service;

function initMap() {
  const sydney = new google.maps.LatLng(-33.867, 151.195);

  map = new google.maps.Map(document.getElementById("map"), {
    center: sydney,
    zoom: 15,
  });

  const request = {
    location: sydney,
    radius: '500',
    type: ['restaurant']
  };

  service = new google.maps.places.PlacesService(map);
  service.nearbySearch(request, callback);
}

function callback(results, status) {
  if (status == google.maps.places.PlacesServiceStatus.OK) {
    for (var i = 0; i < results.length; i++) {
      createMarker(results[i]);
    }
  }
}

// Helper function to create markers.
function createMarker(place) {
  if (!place.geometry || !place.geometry.location) return;

  const marker = new google.maps.Marker({
    map,
    position: place.geometry.location,
    title: place.name,
  });
}

מידע נוסף

חיפוש בקרבת מקום (חדש)

הגרסה החדשה של 'חיפוש בקרבת מקום' משופרת בהשוואה לגרסה הקודמת בדרכים הבאות:

  • היכולת לציין אילו שדות של נתוני מקומות יוחזרו.
  • שימוש ב-Promises שמאפשר פעולה אסינכרונית.
  • אין צורך לבדוק את הסטטוס של PlacesService, אפשר להשתמש במקום זאת בטיפול סטנדרטי בשגיאות.

בקטע הקוד הבא מוצגת פונקציה שמפעילה בקשה לחיפוש מסעדות בקרבת מקום. בדוגמה הזו מוצגת השימוש באפשרות rankPreference כדי לדרג את תוצאות החיפוש לפי פופולריות (בגרסה הקודמת הדירוג צוין באמצעות האפשרות rankBy). מכיוון ששיטת searchNearby() משתמשת באופרטור await, אפשר להשתמש בה רק בתוך פונקציית async.

async function nearbySearch() {
  // Restrict within the map viewport.
  let center = new google.maps.LatLng(52.369358, 4.889258);
  const request = {
    // Required parameters.
    fields: ["displayName", "location", "businessStatus"],
    locationRestriction: {
      center: center,
      radius: 500,
    },
    // Optional parameters.
    includedPrimaryTypes: ["restaurant"],
    maxResultCount: 5,
    rankPreference: google.maps.places.SearchNearbyRankPreference.POPULARITY,
    language: "en-US",
    region: "us",
  };

  const { places } = await google.maps.places.Place.searchNearby(request);

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

    // Create a new bounds, which will be extended with each result.
    const bounds = new google.maps.LatLngBounds();

    // Loop through and get all the results.
    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");
  }
}

מידע נוסף