שילוב Google Maps עם 1C-Bitrix
באתר של חנות מקוונת עם 250 נקודות איסוף, סמנים מתמזגים לגוש אחד — המשתמש לא יכול לבחור את הקרובה ביותר. זה פוגע ישירות בהמרות: כל לקוח שני הולך למתחרה שבו המפה פועלת בצורה ברורה. אנחנו פותרים את הבעיה הזו כבר 5 שנים: יישמנו שילוב Google Maps עם 1C-Bitrix ביותר מ-30 פרויקטים, עיבדנו 2 מיליון בקשות גיאוקודינג ללא תקלות. Google Maps Platform הוא התקן לפרויקטים בינלאומיים: ויקיפדיה מדווחת על כיסוי של 200+ מדינות. המהנדסים שלנו מכירים את כל הניואנסים: מהגדרת מפתח ועד קיבוץ סמנים. שמירת מטמון נכונה של נתוני גיאו מפחיתה עלויות API פי 2–3, ותצורת מכסה נכונה מונעת חשבונות של עשרות כ-$9–13 בחיסכון. לקוח אחד ללא שמירת מטמון קיבל חשבון של $270–390 על חריגה מהמכסה בחודש. בניגוד ל-Yandex Maps, Google Maps דורש קישור אמצעי תשלום אך מספק מכסה חינמית (28,000 טעינות מפה בחודש). בקשו שילוב — קבלו מפה שלא תיכשל עם 10,000 מבקרים ביום.
בצעו את השלבים הבאים כדי לשלב Google Maps עם 1C-Bitrix:
- קבלו מפתח API מ-Google Cloud Console.
- הפעילו את ה-API הנדרשים: Maps JavaScript, Geocoding, Places.
- הגבילו את המפתח לפי HTTP referrer ו-IP.
- יישמו רינדור מפה עם JavaScript.
- יישמו גיאוקודינג בצד השרת עם שמירת מטמון.
- הוסיפו השלמה אוטומטית של כתובות דרך Places API.
- הוסיפו קיבוץ סמנים למפות חנויות.
- הגדירו ניטור מכסה כדי למנוע חריגות.
עלות השילוב: מ-$500–1.5k. שמירת מטמון יכולה לחסוך עד $180–260 בחודש בעלויות API.
למה Google Maps עדיף לפרויקטים בינלאומיים?
לעסקים עם קהלים במדינות חבר העמים ומחוצה לו, Google Maps מספק כיסוי אחיד. הוא תומך בכתובות מפורטות ביותר מ-200 מדינות, דבר ששירותים מקומיים לא יכולים להבטיח. בנוסף, Google Places API מספק השלמה אוטומטית בהתחשב בפורמטים אזוריים: רחוב, בניין, יחידה — הכל בצורה מובנית. Google Maps מציע כיסוי גלובלי פי 3 טוב יותר מ-Yandex Maps, עם כיסוי של 200+ מדינות לעומת 60.
איך להגדיר מפתח API עבור Google Maps?
אתם צריכים פרויקט ב-Google Cloud Console. הפעילו שלושה API חובה: Maps JavaScript API לרינדור המפה, Geocoding API לגיאוקודינג בצד השרת, ו-Places API להשלמה אוטומטית של כתובות. לאחר יצירת המפתח, הקפידו להגביל את השימוש בו: עבור Maps JavaScript API ציינו HTTP referrer (דומיין האתר), עבור API של השרת ציינו את כתובת ה-IP של השרת. זה מונע דליפת מכסה אם המפתח נגנב. שמרו את המפתח ב-.env או דרך COption::GetOptionString('site', 'gmaps_api_key'), אל תכניסו ישירות לתבניות.
דוגמה לתצורת מפתח:
<div id="gmap" style="width:100%;height:400px"></div> <script> function initMap() { const coords = { lat: <?= $lat ?>, lng: <?= $lon ?> }; const map = new google.maps.Map(document.getElementById('gmap'), { center: coords, zoom: 14, styles: googleMapStyles, // кастомные стили для бренда }); new google.maps.Marker({ position: coords, map: map, title: '<?= htmlspecialchars($title) ?>' }); } </script> <script async defer src="https://maps.googleapis.com/maps/api/js?key=<?= $apiKey ?>&callback=initMap&language=ru®ion=RU"> </script> השתמשו ב-Google Cloud Console כדי לוודא הגבלות.
יישום המפה ונתוני הגיאו
אתחול המפה
function geocodeAddressGoogle(string $address): ?array { $apiKey = COption::GetOptionString('site', 'gmaps_server_key'); $url = 'https://maps.googleapis.com/maps/api/geocode/json?' . 'address=' . urlencode($address) . '&key=' . $apiKey . '&language=ru®ion=RU'; $http = new \Bitrix\Main\Web\HttpClient(); $data = json_decode($http->get($url), true); if ($data['status'] !== 'OK') return null; $loc = $data['results'][0]['geometry']['location']; return ['lat' => $loc['lat'], 'lon' => $loc['lng']]; } הפרמטרים <div id="gmap" style="width:100%;height:400px"></div> <script> function initMap() { const coords = { lat: <?= $lat ?>, lng: <?= $lon ?> }; const map = new google.maps.Map(document.getElementById('gmap'), { center: coords, zoom: 14, styles: googleMapStyles, // кастомные стили для бренда }); new google.maps.Marker({ position: coords, map: map, title: '<?= htmlspecialchars($title) ?>' }); } </script> <script async defer src="https://maps.googleapis.com/maps/api/js?key=<?= $apiKey ?>&callback=initMap&language=ru®ion=RU"> </script> מבטיחים שמות רחובות ברוסית ופורמט כתובות נכון.
גיאוקודינג בצד השרת
const input = document.getElementById('delivery-address'); const autocomplete = new google.maps.places.Autocomplete(input, { types: ['address'], componentRestrictions: { country: ['ru', 'by', 'kz'] }, fields: ['geometry', 'formatted_address', 'address_components'], }); autocomplete.addListener('place_changed', () => { const place = autocomplete.getPlace(); document.getElementById('lat').value = place.geometry.location.lat(); document.getElementById('lon').value = place.geometry.location.lng(); // Парсим address_components для отдельных полей (город, улица, дом) parseAddressComponents(place.address_components); }); מגבלות: Geocoding API — 40,000 בקשות בחודש בחינם. בעת ייבוא ספריית כתובות גדולה, אנו מוסיפים השהיה של 50ms בין בקשות ושומרים תוצאות במטמון ב-language=ru®ion=RU למשך 30 יום. זה מבטיח שהאתר לא יחרוג מהמכסה ולא יקבל שגיאת function geocodeAddressGoogle(string $address): ?array { $apiKey = COption::GetOptionString('site', 'gmaps_server_key'); $url = 'https://maps.googleapis.com/maps/api/geocode/json?' . 'address=' . urlencode($address) . '&key=' . $apiKey . '&language=ru®ion=RU'; $http = new \Bitrix\Main\Web\HttpClient(); $data = json_decode($http->get($url), true); if ($data['status'] !== 'OK') return null; $loc = $data['results'][0]['geometry']['location']; return ['lat' => $loc['lat'], 'lon' => $loc['lng']]; } . שמירת מטמון של נתוני גיאו מפחיתה עלויות עד 40% — החיסכון יכול להגיע ל-$180–260 בחודש בעומסים גבוהים.
השלמה אוטומטית של כתובות דרך Places API
בדף התשלום, המשתמש מתחיל להקליד כתובת — מופיעה רשימת הצעות מ-Google Places. לאחר הבחירה, הקואורדינטות מוכנסות לשדות נסתרים ומועברות למטפל במשלוח.
import { MarkerClusterer } from '@googlemaps/markerclusterer'; const markers = storesData.map(store => new google.maps.Marker({ position: { lat: store.lat, lng: store.lon }, title: store.name, })); new MarkerClusterer({ map, markers }); קיבוץ סמנים
למפה עם עשרות נקודות (חנויות, משווקים), השתמשו בספריית b_cached_files:
import { MarkerClusterer } from '@googlemaps/markerclusterer'; const markers = storesData.map(store => new google.maps.Marker({ position: { lat: store.lat, lng: store.lon }, title: store.name, })); new MarkerClusterer({ map, markers }); העבירו נתוני חנות מ-PHP ל-JS דרך OVER_QUERY_LIMIT בעמוד או דרך בקשת Ajax לרכיב בטעינת המפה הראשונה.
איך להימנע מחריגת מכסה ולא לקבל חשבון ריק?
נטר את המכסה ב-Google Cloud Console: התראות תקציב, התראה ב-80% שימוש. חריגה מהמכסה החינמית גורמת ל-API להחזיר שגיאות const input = document.getElementById('delivery-address'); const autocomplete = new google.maps.places.Autocomplete(input, { types: ['address'], componentRestrictions: { country: ['ru', 'by', 'kz'] }, fields: ['geometry', 'formatted_address', 'address_components'], }); autocomplete.addListener('place_changed', () => { const place = autocomplete.getPlace(); document.getElementById('lat').value = place.geometry.location.lat(); document.getElementById('lon').value = place.geometry.location.lng(); // Парсим address_components для отдельных полей (город, улица, дом) parseAddressComponents(place.address_components); }); . לשליטה, אנו מוסיפים רישום של כל בקשות השרת ל-Geocoding API עם ספירת מכסה יומית. עלות השילוב הממוצעת בפרויקטים שלנו היא מ-$500–1.5k, והחיסכון בהוצאות API בזכות שמירת מטמון מגיע ל-$180–260 בחודש.
ניהול מכסה ו-API
| API | מטרה | מכסה חינמית |
|---|---|---|
| Maps JavaScript API | רינדור מפה | 28,000 טעינות בחודש |
| Geocoding API | גיאוקודינג | 40,000 בקשות בחודש |
| Places API | השלמה אוטומטית של כתובות | 100,000 סשנים בחודש |
תהליך עבודה ולוחות זמנים
| משימה | מאמץ |
|---|---|
| הגדרת מפתח והגבלות | 1–2 שעות |
| מפה בסיסית עם סמנים | 3–5 שעות |
| גיאוקודינג + שמירת מטמון | 3–4 שעות |
| Places Autocomplete בטופס המשלוח | 4–6 שעות |
| מפה עם קיבוץ | 5–7 שעות |
מה כלול
- פיתוח תצורת מפתח והגבלות.
- גיאוקודינג בצד השרת עם שמירת מטמון.
- שילוב Places Autocomplete.
- יישום מפה עם קיבוץ.
- תיעוד והדרכת מנהלים.
- אחריות לפעולה יציבה ועמידה בלוחות זמנים.
- גישה לתיעוד, הדרכה למנהלים, תמיכה שוטפת.
שגיאות נפוצות ומניעתן
- מפתח לא מוגבל — תוקפים יכולים להשתמש בו באתרים שלהם, מה שמוביל לחריגת מכסה. תמיד הגדירו HTTP referrer ו-IP.
-
אין שמירת מטמון של נתוני גיאו — בעת ייבוא 1000 כתובות ללא השהיות ושמירת מטמון, תגיעו במהירות למגבלה. השתמשו ב-
@googlemaps/markerclustererובהשהיה של 50ms בין בקשות. -
התעלמות משגיאות API — אי טיפול ב-
import { MarkerClusterer } from '@googlemaps/markerclusterer'; const markers = storesData.map(store => new google.maps.Marker({ position: { lat: store.lat, lng: store.lon }, title: store.name, })); new MarkerClusterer({ map, markers });אוjson_encode()— המפה עשויה להציג מסך ריק ללא הודעה. תמיד בדקו אתOVER_QUERY_LIMITשל התשובה.
צרו קשר כדי לדון במשימה שלכם. בקשו שילוב עם אחריות לאיכות — קבלו פתרון מוכן עם תיעוד ותמיכה.
שילוב Google Maps שלנו עם 1C-Bitrix מספק הגדרת Google Maps API חלקה עבור 1C-Bitrix. יישמו מפת חנות ב-1C-Bitrix עם סמנים מותאמים אישית. השתמשו בהשלמה אוטומטית של Places API Bitrix להזנת כתובות. יישמו ניטור מכסה של Google Maps כדי להימנע מחיובים על חריגות.







