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

מפתחים באזור הכלכלי האירופי (EEA)

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

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

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

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

השוואת קודים

בקטע הזה אנחנו משווים בין קודים של שיטות חיפוש בסביבה כדי להמחיש את ההבדלים בין Places Service לבין המחלקה 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");
  }
}

מידע נוסף